mirror of
https://github.com/monero-project/monero.git
synced 2026-08-02 08:58:06 -07:00
New RPC and daemon command to get output histogram
This is a list of existing output amounts along with the number of outputs of that amount in the blockchain. The daemon command takes: - no parameters: all outputs with at least 3 instances - one parameter: all outputs with at least that many instances - two parameters: all outputs within that many instances The default starts at 3 to avoid massive spamming of all dust outputs in the blockchain, and is the current minimum mixin requirement. An optional vector of amounts may be passed, to request histogram only for those outputs.
This commit is contained in:
@@ -439,5 +439,23 @@ bool t_command_parser_executor::flush_txpool(const std::vector<std::string>& arg
|
||||
return m_executor.flush_txpool(txid);
|
||||
}
|
||||
|
||||
bool t_command_parser_executor::output_histogram(const std::vector<std::string>& args)
|
||||
{
|
||||
if (args.size() > 2) return false;
|
||||
|
||||
uint64_t min_count = 3;
|
||||
uint64_t max_count = 0;
|
||||
|
||||
if (args.size() >= 1)
|
||||
{
|
||||
min_count = boost::lexical_cast<uint64_t>(args[0]);
|
||||
}
|
||||
if (args.size() >= 2)
|
||||
{
|
||||
max_count = boost::lexical_cast<uint64_t>(args[1]);
|
||||
}
|
||||
return m_executor.output_histogram(min_count, max_count);
|
||||
}
|
||||
|
||||
|
||||
} // namespace daemonize
|
||||
|
||||
@@ -114,6 +114,8 @@ public:
|
||||
bool unban(const std::vector<std::string>& args);
|
||||
|
||||
bool flush_txpool(const std::vector<std::string>& args);
|
||||
|
||||
bool output_histogram(const std::vector<std::string>& args);
|
||||
};
|
||||
|
||||
} // namespace daemonize
|
||||
|
||||
@@ -214,6 +214,11 @@ t_command_server::t_command_server(
|
||||
, std::bind(&t_command_parser_executor::flush_txpool, &m_parser, p::_1)
|
||||
, "Flush a transaction from the tx pool by its txid, or the whole tx pool"
|
||||
);
|
||||
m_command_lookup.set_handler(
|
||||
"output_histogram"
|
||||
, std::bind(&t_command_parser_executor::output_histogram, &m_parser, p::_1)
|
||||
, "Print output histogram (amount, instances)"
|
||||
);
|
||||
}
|
||||
|
||||
bool t_command_server::process_command_str(const std::string& cmd)
|
||||
|
||||
@@ -1203,5 +1203,41 @@ bool t_rpc_command_executor::flush_txpool(const std::string &txid)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool t_rpc_command_executor::output_histogram(uint64_t min_count, uint64_t max_count)
|
||||
{
|
||||
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::request req;
|
||||
cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::response res;
|
||||
std::string fail_message = "Unsuccessful";
|
||||
epee::json_rpc::error error_resp;
|
||||
|
||||
req.min_count = min_count;
|
||||
req.max_count = max_count;
|
||||
|
||||
if (m_is_rpc)
|
||||
{
|
||||
if (!m_rpc_client->json_rpc_request(req, res, "get_output_histogram", fail_message.c_str()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!m_rpc_server->on_get_output_histogram(req, res, error_resp))
|
||||
{
|
||||
tools::fail_msg_writer() << fail_message.c_str();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(res.histogram.begin(), res.histogram.end(),
|
||||
[](const cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::entry &e1, const cryptonote::COMMAND_RPC_GET_OUTPUT_HISTOGRAM::entry &e2)->bool { return e1.instances < e2.instances; });
|
||||
for (const auto &e: res.histogram)
|
||||
{
|
||||
tools::msg_writer() << e.instances << " " << cryptonote::print_money(e.amount);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}// namespace daemonize
|
||||
|
||||
@@ -132,6 +132,8 @@ public:
|
||||
bool unban(const std::string &ip);
|
||||
|
||||
bool flush_txpool(const std::string &txid);
|
||||
|
||||
bool output_histogram(uint64_t min_count, uint64_t max_count);
|
||||
};
|
||||
|
||||
} // namespace daemonize
|
||||
|
||||
Reference in New Issue
Block a user