diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 85398589..47d07289 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -79,6 +79,10 @@ namespace graphene { namespace app { { _database_api = std::make_shared< database_api >( std::ref( *_app.chain_database() ) ); } + else if( api_name == "block_api" ) + { + _block_api = std::make_shared< block_api >( std::ref( *_app.chain_database() ) ); + } else if( api_name == "network_broadcast_api" ) { _network_broadcast_api = std::make_shared< network_broadcast_api >( std::ref( _app ) ); @@ -108,6 +112,20 @@ namespace graphene { namespace app { return; } + // block_api + block_api::block_api(graphene::chain::database& db) : _db(db) { } + block_api::~block_api() { } + + vector> block_api::get_blocks(uint32_t block_num_from, uint32_t block_num_to)const + { + FC_ASSERT( block_num_to >= block_num_from ); + vector> res; + for(uint32_t block_num=block_num_from; block_num<=block_num_to; block_num++) { + res.push_back(_db.fetch_block_by_number(block_num)); + } + return res; + } + network_broadcast_api::network_broadcast_api(application& a):_app(a) { _applied_block_connection = _app.chain_database()->applied_block.connect([this](const signed_block& b){ on_applied_block(b); }); @@ -197,6 +215,12 @@ namespace graphene { namespace app { return *_network_broadcast_api; } + fc::api login_api::block()const + { + FC_ASSERT(_block_api); + return *_block_api; + } + fc::api login_api::network_node()const { FC_ASSERT(_network_node_api); diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index 5ebaa36e..bc629ea2 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -125,6 +125,22 @@ namespace graphene { namespace app { application& _app; }; + /** + * @brief Block api + */ + class block_api + { + public: + block_api(graphene::chain::database& db); + ~block_api(); + + vector> get_blocks(uint32_t block_num_from, uint32_t block_num_to)const; + + private: + graphene::chain::database& _db; + }; + + /** * @brief The network_broadcast_api class allows broadcasting of transactions. */ @@ -295,6 +311,8 @@ namespace graphene { namespace app { * has sucessfully authenticated. */ bool login(const string& user, const string& password); + /// @brief Retrieve the network block API + fc::api block()const; /// @brief Retrieve the network broadcast API fc::api network_broadcast()const; /// @brief Retrieve the database API @@ -315,6 +333,7 @@ namespace graphene { namespace app { private: application& _app; + optional< fc::api > _block_api; optional< fc::api > _database_api; optional< fc::api > _network_broadcast_api; optional< fc::api > _network_node_api; @@ -344,6 +363,9 @@ FC_API(graphene::app::history_api, (get_market_history) (get_market_history_buckets) ) +FC_API(graphene::app::block_api, + (get_blocks) + ) FC_API(graphene::app::network_broadcast_api, (broadcast_transaction) (broadcast_transaction_with_callback) @@ -373,6 +395,7 @@ FC_API(graphene::app::asset_api, ) FC_API(graphene::app::login_api, (login) + (block) (network_broadcast) (database) (history)