diff --git a/nano/lib/errors.cpp b/nano/lib/errors.cpp index c4223f79a..0e28bf1d7 100644 --- a/nano/lib/errors.cpp +++ b/nano/lib/errors.cpp @@ -83,6 +83,8 @@ std::string nano::error_common_messages::message (int ev) const return "Invalid type conversion"; case nano::error_common::invalid_work: return "Invalid work"; + case nano::error_common::is_not_state_block: + return "Must be a state block"; case nano::error_common::numeric_conversion: return "Numeric conversion error"; case nano::error_common::tracking_not_enabled: diff --git a/nano/lib/errors.hpp b/nano/lib/errors.hpp index 8de203e62..3e416a0e6 100644 --- a/nano/lib/errors.hpp +++ b/nano/lib/errors.hpp @@ -53,6 +53,7 @@ enum class error_common invalid_type_conversion, invalid_work, insufficient_balance, + is_not_state_block, numeric_conversion, tracking_not_enabled, wallet_lmdb_max_dbs, diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index d7515a5c5..ed28ca203 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -3137,8 +3137,15 @@ void nano::json_handler::process () } else { - rpc_l->node.process_local_async (block, watch_work_l); - rpc_l->response_l.put ("started", "1"); + if (block->type () == nano::block_type::state) + { + rpc_l->node.process_local_async (block, watch_work_l); + rpc_l->response_l.put ("started", "1"); + } + else + { + rpc_l->ec = nano::error_common::is_not_state_block; + } } } else diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index 083dd88e3..1fcfa8532 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -1924,13 +1924,6 @@ TEST (rpc, process_block_async) std::string json; send.serialize_json (json); request.put ("block", json); - { - test_response response (request, rpc.config.port, system.io_ctx); - ASSERT_TIMELY (5s, response.status != 0); - ASSERT_EQ (200, response.status); - ASSERT_EQ ("1", response.json.get ("started")); - ASSERT_TIMELY (10s, node1.latest (nano::dev_genesis_key.pub) == send.hash ()); - } request.put ("json_block", true); { test_response response (request, rpc.config.port, system.io_ctx); @@ -1939,6 +1932,26 @@ TEST (rpc, process_block_async) std::error_code ec (nano::error_blocks::invalid_block); ASSERT_EQ (ec.message (), response.json.get ("error")); } + request.put ("json_block", false); + { + test_response response (request, rpc.config.port, system.io_ctx); + ASSERT_TIMELY (5s, response.status != 0); + ASSERT_EQ (200, response.status); + std::error_code ec (nano::error_common::is_not_state_block); + ASSERT_EQ (ec.message (), response.json.get ("error")); + } + + auto state_send (std::make_shared (nano::dev_genesis_key.pub, latest, nano::dev_genesis_key.pub, nano::genesis_amount - 100, nano::dev_genesis_key.pub, nano::dev_genesis_key.prv, nano::dev_genesis_key.pub, *system.work.generate (latest))); + std::string json1; + state_send->serialize_json (json1); + request.put ("block", json1); + { + test_response response (request, rpc.config.port, system.io_ctx); + ASSERT_TIMELY (5s, response.status != 0); + ASSERT_EQ (200, response.status); + ASSERT_EQ ("1", response.json.get ("started")); + ASSERT_TIMELY (10s, node1.latest (nano::dev_genesis_key.pub) == state_send->hash ()); + } } TEST (rpc, process_block_async_work_watcher)