diff --git a/src/Rpc/CoreRpcServerCommandsDefinitions.h b/src/Rpc/CoreRpcServerCommandsDefinitions.h index 6cefc508fd..dca6a42ea1 100755 --- a/src/Rpc/CoreRpcServerCommandsDefinitions.h +++ b/src/Rpc/CoreRpcServerCommandsDefinitions.h @@ -1,6 +1,6 @@ // Copyright (c) 2012-2016, The CryptoNote developers, The Bytecoin developers // Copyright (c) 2016, The Forknote developers -// Copyright (c) 2017-2019, The Karbo developers +// Copyright (c) 2017-2022, The Karbo developers // // This file is part of Karbo. // @@ -196,6 +196,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; @@ -206,6 +213,16 @@ 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; @@ -216,6 +233,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; @@ -224,6 +251,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_TRANSACTION { struct request { diff --git a/src/Rpc/RpcServer.cpp b/src/Rpc/RpcServer.cpp index bbd22b56c5..8fd7389450 100755 --- a/src/Rpc/RpcServer.cpp +++ b/src/Rpc/RpcServer.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2012-2016, The CryptoNote developers, The Bytecoin developers // Copyright (c) 2014-2018, The Monero Project // Copyright (c) 2016, The Forknote developers -// Copyright (c) 2016-2020, The Karbo developers +// Copyright (c) 2016-2022, The Karbo developers // // This file is part of Karbo. // @@ -54,6 +54,15 @@ const uint64_t BLOCK_LIST_MAX_COUNT = 1000; namespace CryptoNote { + + namespace { + template + static bool print_as_json(const T& obj) { + std::cout << CryptoNote::storeToJson(obj) << ENDL; + return true; + } + } + namespace { template @@ -136,7 +145,7 @@ std::unordered_map(&RpcServer::on_query_blocks), true } }, { "/queryblockslite.bin", { binMethod(&RpcServer::on_query_blocks_lite), true } }, { "/get_o_indexes.bin", { binMethod(&RpcServer::on_get_indexes), true } }, - { "/getrandom_outs.bin", { binMethod(&RpcServer::on_get_random_outs), true } }, + { "/getrandom_outs.bin", { binMethod(&RpcServer::on_get_random_outs_bin), true } }, { "/get_pool_changes.bin", { binMethod(&RpcServer::on_get_pool_changes), true } }, { "/get_pool_changes_lite.bin", { binMethod(&RpcServer::on_get_pool_changes_lite), true } }, @@ -160,7 +169,7 @@ std::unordered_map(&RpcServer::on_query_blocks), false } }, { "/queryblockslite", { jsonMethod(&RpcServer::on_query_blocks_lite), false } }, { "/get_o_indexes", { jsonMethod(&RpcServer::on_get_indexes), false } }, - { "/getrandom_outs", { jsonMethod(&RpcServer::on_get_random_outs), false } }, + { "/getrandom_outs", { jsonMethod(&RpcServer::on_get_random_outs_json), false } }, { "/get_pool_changes", { jsonMethod(&RpcServer::on_get_pool_changes), true } }, { "/get_pool_changes_lite", { jsonMethod(&RpcServer::on_get_pool_changes_lite), true } }, { "/get_block_details_by_height", { jsonMethod(&RpcServer::on_get_block_details_by_height), true } }, @@ -606,7 +615,7 @@ 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; @@ -614,24 +623,31 @@ bool RpcServer::on_get_random_outs(const COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOU res.status = CORE_RPC_STATUS_OK; - 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; + return true; +} - std::for_each(res.outs.begin(), res.outs.end(), [&](outs_for_amount& ofa) { - ss << "[" << ofa.amount << "]:"; +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; - assert(ofa.outs.size() && "internal error: ofa.outs.size() is empty"); + if (!m_core.get_random_outs_for_amounts(req, bin)) { + return true; + } + + std::vector outs = bin.outs; + res.outs.reserve(outs.size()); + for (size_t i = 0; i < bin.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(Logging::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 20fb6f7cd5..1ee9a7a2c5 100755 --- a/src/Rpc/RpcServer.h +++ b/src/Rpc/RpcServer.h @@ -1,6 +1,6 @@ // Copyright (c) 2012-2016, The CryptoNote developers, The Bytecoin developers // Copyright (c) 2016, The Forknote developers -// Copyright (c) 2016-2020, The Karbo developers +// Copyright (c) 2016-2022, The Karbo developers // // This file is part of Karbo. // @@ -72,7 +72,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 on_get_pool_changes(const COMMAND_RPC_GET_POOL_CHANGES::request& req, COMMAND_RPC_GET_POOL_CHANGES::response& rsp); bool on_get_pool_changes_lite(const COMMAND_RPC_GET_POOL_CHANGES_LITE::request& req, COMMAND_RPC_GET_POOL_CHANGES_LITE::response& rsp); @@ -85,6 +85,7 @@ class RpcServer : public HttpServer { bool on_get_info(const COMMAND_RPC_GET_INFO::request& req, COMMAND_RPC_GET_INFO::response& res); bool on_get_height(const COMMAND_RPC_GET_HEIGHT::request& req, COMMAND_RPC_GET_HEIGHT::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_transaction(const COMMAND_RPC_SEND_RAW_TRANSACTION::request& req, COMMAND_RPC_SEND_RAW_TRANSACTION::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);