bool RpcServer::on_submitblock(const COMMAND_RPC_SUBMITBLOCK::request& req, COMMAND_RPC_SUBMITBLOCK::response& res) { if (req.size() != 1) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_WRONG_PARAM, "Wrong param" }; } blobdata blockblob; if (!hexToBlob(req[0], blockblob)) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_WRONG_BLOCKBLOB, "Wrong block blob" }; } block_verification_context bvc = boost::value_initialized<block_verification_context>(); System::Event event(m_dispatcher); auto resultFuture = std::async(std::launch::async, [this, &event, &bvc, &blockblob]{ m_core.handle_incoming_block_blob(blockblob, bvc, true, true); m_dispatcher.remoteSpawn([&event]() { event.set(); }); }); event.wait(); resultFuture.get(); if (!bvc.m_added_to_main_chain) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_BLOCK_NOT_ACCEPTED, "Block not accepted" }; } res.status = CORE_RPC_STATUS_OK; return true; }
bool RpcServer::on_submitblock(const COMMAND_RPC_SUBMITBLOCK::request& req, COMMAND_RPC_SUBMITBLOCK::response& res) { if (req.size() != 1) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_WRONG_PARAM, "Wrong param" }; } BinaryArray blockblob; if (!fromHex(req[0], blockblob)) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_WRONG_BLOCKBLOB, "Wrong block blob" }; } block_verification_context bvc = boost::value_initialized<block_verification_context>(); m_core.handle_incoming_block_blob(blockblob, bvc, true, true); if (!bvc.m_added_to_main_chain) { throw JsonRpc::JsonRpcError{ CORE_RPC_ERROR_CODE_BLOCK_NOT_ACCEPTED, "Block not accepted" }; } res.status = CORE_RPC_STATUS_OK; return true; }