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 MinerManager::submitBlock(const Block& minedBlock, const std::string& daemonHost, uint16_t daemonPort) { try { HttpClient client(m_dispatcher, daemonHost, daemonPort); COMMAND_RPC_SUBMITBLOCK::request request; request.emplace_back(Common::toHex(toBinaryArray(minedBlock))); COMMAND_RPC_SUBMITBLOCK::response response; System::EventLock lk(m_httpEvent); JsonRpc::invokeJsonRpcCommand(client, "submitblock", request, response); m_logger(Logging::INFO) << "Block has been successfully submitted. Block hash: " << Common::podToHex(get_block_hash(minedBlock)); return true; } catch (std::exception& e) { m_logger(Logging::WARNING) << "Couldn't submit block: " << Common::podToHex(get_block_hash(minedBlock)) << ", reason: " << e.what(); return false; } }
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; }