diff --git a/src/Rpc/CoreRpcServerCommandsDefinitions.h b/src/Rpc/CoreRpcServerCommandsDefinitions.h index 2439977f..4c17e1fd 100644 --- a/src/Rpc/CoreRpcServerCommandsDefinitions.h +++ b/src/Rpc/CoreRpcServerCommandsDefinitions.h @@ -221,6 +221,13 @@ struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_out_entry { }; #pragma pack(pop) +struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_out_entry_json : public COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_out_entry { + void serialize(ISerializer & s) { + s(global_amount_index, "global_index"); + s(out_key, "public_key"); + } +}; + struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_outs_for_amount { uint64_t amount; std::vector outs; @@ -231,6 +238,17 @@ struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_outs_for_amount { } }; + +struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_outs_for_amount_json { + uint64_t amount; + std::vector outs; + + void serialize(ISerializer &s) { + KV_MEMBER(amount) + KV_MEMBER(outs) + } +}; + struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_response { std::vector outs; std::string status; @@ -241,6 +259,16 @@ struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_response { } }; +struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_response_json { + std::vector outs; + std::string status; + + void serialize(ISerializer &s) { + KV_MEMBER(outs); + KV_MEMBER(status) + } +}; + struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS { typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_request request; typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_response response; @@ -249,6 +277,14 @@ struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS { typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_outs_for_amount outs_for_amount; }; +struct COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON { + typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_request request; + typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_response_json response; + + typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_out_entry_json out_entry; + typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_outs_for_amount_json outs_for_amount; +}; + //----------------------------------------------- struct COMMAND_RPC_SEND_RAW_TX { struct request { diff --git a/src/Rpc/RpcServer.cpp b/src/Rpc/RpcServer.cpp index 812c0a28..0d531384 100644 --- a/src/Rpc/RpcServer.cpp +++ b/src/Rpc/RpcServer.cpp @@ -90,7 +90,7 @@ std::unordered_map(&RpcServer::on_query_blocks), false } }, { "/queryblockslite.bin", { binMethod(&RpcServer::on_query_blocks_lite), false } }, { "/get_o_indexes.bin", { binMethod(&RpcServer::on_get_indexes), false } }, - { "/getrandom_outs.bin", { binMethod(&RpcServer::on_get_random_outs), false } }, + { "/getrandom_outs.bin", { binMethod(&RpcServer::on_get_random_outs_bin), false } }, { "/get_pool_changes.bin", { binMethod(&RpcServer::onGetPoolChanges), false } }, { "/get_pool_changes_lite.bin", { binMethod(&RpcServer::onGetPoolChangesLite), false } }, @@ -104,6 +104,7 @@ std::unordered_map(&RpcServer::on_get_peer_list), true } }, { "/get_raw_transactions_by_heights", { jsonMethod(&RpcServer::on_get_txs_with_output_global_indexes), true } }, { "/getrawtransactionspool", { jsonMethod(&RpcServer::on_get_transactions_pool_raw), true } }, + { "/getrandom_outs", { jsonMethod(&RpcServer::on_get_random_outs_json), false } }, // json rpc { "/json_rpc", { std::bind(&RpcServer::processJsonRpcRequest, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), true } } @@ -863,32 +864,38 @@ bool RpcServer::on_get_indexes(const COMMAND_RPC_GET_TX_GLOBAL_OUTPUTS_INDEXES:: return true; } -bool RpcServer::on_get_random_outs(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) { +bool RpcServer::on_get_random_outs_bin(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res) { res.status = "Failed"; if (!m_core.get_random_outs_for_amounts(req, res)) { return true; } res.status = CORE_RPC_STATUS_OK; + return true; +} - std::stringstream ss; - typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::outs_for_amount outs_for_amount; - typedef COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::out_entry out_entry; +bool RpcServer::on_get_random_outs_json(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON::response& res) { + res.status = "Failed"; + + COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response bin; - std::for_each(res.outs.begin(), res.outs.end(), [&](outs_for_amount& ofa) { - ss << "[" << ofa.amount << "]:"; + if (!m_core.get_random_outs_for_amounts(req, bin)) { + return true; + } - assert(ofa.outs.size() && "internal error: ofa.outs.size() is empty"); + std::vector &outs = bin.outs; + res.outs.reserve(outs.size()); + for (size_t i = 0; i < outs.size(); ++i) { + COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON::outs_for_amount out; + out.amount = bin.outs[i].amount; + for (auto& o : outs[i].outs) { + out.outs.push_back(static_cast(o)); + } + res.outs.push_back(out); + } - std::for_each(ofa.outs.begin(), ofa.outs.end(), [&](out_entry& oe) - { - ss << oe.global_amount_index << " "; - }); - ss << ENDL; - }); - std::string s = ss.str(); - logger(TRACE) << "COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS: " << ENDL << s; res.status = CORE_RPC_STATUS_OK; + return true; } diff --git a/src/Rpc/RpcServer.h b/src/Rpc/RpcServer.h index 0b80664d..a32f02d0 100644 --- a/src/Rpc/RpcServer.h +++ b/src/Rpc/RpcServer.h @@ -52,7 +52,7 @@ class RpcServer : public HttpServer { bool on_query_blocks(const COMMAND_RPC_QUERY_BLOCKS::request& req, COMMAND_RPC_QUERY_BLOCKS::response& res); bool on_query_blocks_lite(const COMMAND_RPC_QUERY_BLOCKS_LITE::request& req, COMMAND_RPC_QUERY_BLOCKS_LITE::response& res); bool on_get_indexes(const COMMAND_RPC_GET_TX_GLOBAL_OUTPUTS_INDEXES::request& req, COMMAND_RPC_GET_TX_GLOBAL_OUTPUTS_INDEXES::response& res); - bool on_get_random_outs(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res); + bool on_get_random_outs_bin(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res); bool onGetPoolChanges(const COMMAND_RPC_GET_POOL_CHANGES::request& req, COMMAND_RPC_GET_POOL_CHANGES::response& rsp); bool onGetPoolChangesLite(const COMMAND_RPC_GET_POOL_CHANGES_LITE::request& req, COMMAND_RPC_GET_POOL_CHANGES_LITE::response& rsp); @@ -61,6 +61,7 @@ class RpcServer : public HttpServer { bool on_get_height(const COMMAND_RPC_GET_HEIGHT::request& req, COMMAND_RPC_GET_HEIGHT::response& res); bool on_get_peer_list(const COMMAND_RPC_GET_PEER_LIST::request& req, COMMAND_RPC_GET_PEER_LIST::response& res); bool on_get_transactions(const COMMAND_RPC_GET_TRANSACTIONS::request& req, COMMAND_RPC_GET_TRANSACTIONS::response& res); + bool on_get_random_outs_json(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON::request& req, COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS_JSON::response& res); bool on_send_raw_tx(const COMMAND_RPC_SEND_RAW_TX::request& req, COMMAND_RPC_SEND_RAW_TX::response& res); bool on_start_mining(const COMMAND_RPC_START_MINING::request& req, COMMAND_RPC_START_MINING::response& res); bool on_stop_mining(const COMMAND_RPC_STOP_MINING::request& req, COMMAND_RPC_STOP_MINING::response& res);