diff --git a/plugins/chain_api_plugin/chain_api_plugin.cpp b/plugins/chain_api_plugin/chain_api_plugin.cpp index 35dc611803c0abee7e56c66ef5e67c47843e6962..27f2c6240667259b001fb2a9a499af45a471352c 100644 --- a/plugins/chain_api_plugin/chain_api_plugin.cpp +++ b/plugins/chain_api_plugin/chain_api_plugin.cpp @@ -29,6 +29,9 @@ void chain_api_plugin::plugin_initialize(const variables_map&) {} if (body.empty()) body = "{}"; \ auto result = api_handle.call_name(fc::json::from_string(body).as()); \ cb(200, fc::json::to_string(result)); \ + } catch (fc::eof_exception) { \ + cb(400, "Invalid arguments"); \ + elog("Unable to parse arguments: ${args}", ("args", body)); \ } catch (fc::exception& e) { \ cb(500, e.what()); \ elog("Exception encountered while processing ${call}: ${e}", ("call", #api_name "." #call_name)("e", e)); \ @@ -39,7 +42,8 @@ void chain_api_plugin::plugin_startup() { auto ro_api = app().get_plugin().get_read_only_api(); app().get_plugin().add_api({ - CALL(chain, ro_api, chain_apis::read_only, get_info) + CALL(chain, ro_api, chain_apis::read_only, get_info), + CALL(chain, ro_api, chain_apis::read_only, get_block) }); } diff --git a/plugins/chain_plugin/chain_plugin.cpp b/plugins/chain_plugin/chain_plugin.cpp index d038f92bbf5c901c70016b857b703b5ca4c9d236..446be877b0363d56ba15a59ad19fee02a56853c8 100644 --- a/plugins/chain_plugin/chain_plugin.cpp +++ b/plugins/chain_plugin/chain_plugin.cpp @@ -159,5 +159,19 @@ read_only::get_info_results read_only::get_info(const read_only::get_info_params }; } +read_only::get_block_results read_only::get_block(const read_only::get_block_params& params) const { + try { + if (auto block = db.fetch_block_by_id(fc::json::from_string(params.block_num_or_id).as())) + return *block; + } catch (fc::bad_cast_exception) {/* do nothing */} + try { + if (auto block = db.fetch_block_by_number(fc::to_uint64(params.block_num_or_id))) + return *block; + } catch (fc::bad_cast_exception) {/* do nothing */} + + FC_THROW_EXCEPTION(chain::unknown_block_exception, + "Could not find block: ${block}", ("block", params.block_num_or_id)); +} + } // namespace chain_apis } // namespace eos diff --git a/plugins/chain_plugin/include/eos/chain_plugin/chain_plugin.hpp b/plugins/chain_plugin/include/eos/chain_plugin/chain_plugin.hpp index e1b8f6465a67dd13a3f91f98ddfef4ece2e7cc2e..cf31b3da83853d7f70ff336dc4ccc1840c93636b 100644 --- a/plugins/chain_plugin/include/eos/chain_plugin/chain_plugin.hpp +++ b/plugins/chain_plugin/include/eos/chain_plugin/chain_plugin.hpp @@ -27,6 +27,12 @@ public: double participation_rate; }; get_info_results get_info(const get_info_params&) const; + + struct get_block_params { + string block_num_or_id; + }; + using get_block_results = chain::signed_block; + get_block_results get_block(const get_block_params& params) const; }; } // namespace chain_apis @@ -65,3 +71,4 @@ FC_REFLECT(eos::chain_apis::empty, ) FC_REFLECT(eos::chain_apis::read_only::get_info_results, (head_block_num)(head_block_id)(head_block_time)(head_block_producer) (recent_slots)(participation_rate)) +FC_REFLECT(eos::chain_apis::read_only::get_block_params, (block_num_or_id))