aboutsummaryrefslogtreecommitdiff
path: root/src/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon')
-rw-r--r--src/daemon/command_parser_executor.cpp7
-rw-r--r--src/daemon/command_parser_executor.h2
-rw-r--r--src/daemon/command_server.cpp5
-rw-r--r--src/daemon/core.h22
-rw-r--r--src/daemon/rpc_command_executor.cpp52
-rw-r--r--src/daemon/rpc_command_executor.h2
6 files changed, 78 insertions, 12 deletions
diff --git a/src/daemon/command_parser_executor.cpp b/src/daemon/command_parser_executor.cpp
index d47823735..8e78f3bd1 100644
--- a/src/daemon/command_parser_executor.cpp
+++ b/src/daemon/command_parser_executor.cpp
@@ -794,6 +794,13 @@ bool t_command_parser_executor::pop_blocks(const std::vector<std::string>& args)
return false;
}
+bool t_command_parser_executor::rpc_payments(const std::vector<std::string>& args)
+{
+ if (args.size() != 0) return false;
+
+ return m_executor.rpc_payments();
+}
+
bool t_command_parser_executor::version(const std::vector<std::string>& args)
{
std::cout << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << std::endl;
diff --git a/src/daemon/command_parser_executor.h b/src/daemon/command_parser_executor.h
index 25587dea8..5c94c540e 100644
--- a/src/daemon/command_parser_executor.h
+++ b/src/daemon/command_parser_executor.h
@@ -143,6 +143,8 @@ public:
bool pop_blocks(const std::vector<std::string>& args);
+ bool rpc_payments(const std::vector<std::string>& args);
+
bool version(const std::vector<std::string>& args);
bool prune_blockchain(const std::vector<std::string>& args);
diff --git a/src/daemon/command_server.cpp b/src/daemon/command_server.cpp
index e44ce9137..b00e253c7 100644
--- a/src/daemon/command_server.cpp
+++ b/src/daemon/command_server.cpp
@@ -296,6 +296,11 @@ t_command_server::t_command_server(
, "Remove blocks from end of blockchain"
);
m_command_lookup.set_handler(
+ "rpc_payments"
+ , std::bind(&t_command_parser_executor::rpc_payments, &m_parser, p::_1)
+ , "Print information about RPC payments."
+ );
+ m_command_lookup.set_handler(
"version"
, std::bind(&t_command_parser_executor::version, &m_parser, p::_1)
, "Print version information."
diff --git a/src/daemon/core.h b/src/daemon/core.h
index 91dbb7a4b..9a3579e20 100644
--- a/src/daemon/core.h
+++ b/src/daemon/core.h
@@ -59,16 +59,6 @@ public:
: m_core{nullptr}
, m_vm_HACK{vm}
{
- }
-
- // TODO - get rid of circular dependencies in internals
- void set_protocol(t_protocol_raw & protocol)
- {
- m_core.set_cryptonote_protocol(&protocol);
- }
-
- bool run()
- {
//initialize core here
MGINFO("Initializing core...");
#if defined(PER_BLOCK_CHECKPOINT)
@@ -78,9 +68,19 @@ public:
#endif
if (!m_core.init(m_vm_HACK, nullptr, get_checkpoints))
{
- return false;
+ throw std::runtime_error("Failed to initialize core");
}
MGINFO("Core initialized OK");
+ }
+
+ // TODO - get rid of circular dependencies in internals
+ void set_protocol(t_protocol_raw & protocol)
+ {
+ m_core.set_cryptonote_protocol(&protocol);
+ }
+
+ bool run()
+ {
return true;
}
diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp
index 75c54d048..f552db2b8 100644
--- a/src/daemon/rpc_command_executor.cpp
+++ b/src/daemon/rpc_command_executor.cpp
@@ -37,6 +37,7 @@
#include "cryptonote_core/cryptonote_core.h"
#include "cryptonote_basic/difficulty.h"
#include "cryptonote_basic/hardfork.h"
+#include "rpc/rpc_payment_signature.h"
#include <boost/format.hpp>
#include <ctime>
#include <string>
@@ -60,6 +61,13 @@ namespace {
}
}
+ std::string print_float(float f, int prec)
+ {
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%*.*f", prec, prec, f);
+ return buf;
+ }
+
void print_peer(std::string const & prefix, cryptonote::peer const & peer, bool pruned_only, bool publicrpc_only)
{
if (pruned_only && peer.pruning_seed == 0)
@@ -77,8 +85,9 @@ namespace {
epee::string_tools::xtype_to_string(peer.port, port_str);
std::string addr_str = peer.host + ":" + port_str;
std::string rpc_port = peer.rpc_port ? std::to_string(peer.rpc_port) : "-";
+ std::string rpc_credits_per_hash = peer.rpc_credits_per_hash ? print_float(peer.rpc_credits_per_hash / RPC_CREDITS_PER_HASH_SCALE, 2) : "-";
std::string pruning_seed = epee::string_tools::to_string_hex(peer.pruning_seed);
- tools::msg_writer() << boost::format("%-10s %-25s %-25s %-5s %-4s %s") % prefix % id_str % addr_str % rpc_port % pruning_seed % elapsed;
+ tools::msg_writer() << boost::format("%-10s %-25s %-25s %-5s %-5s %-4s %s") % prefix % id_str % addr_str % rpc_port % rpc_credits_per_hash % pruning_seed % elapsed;
}
void print_block_header(cryptonote::block_header_response const & header)
@@ -2362,4 +2371,45 @@ bool t_rpc_command_executor::set_bootstrap_daemon(
return true;
}
+bool t_rpc_command_executor::rpc_payments()
+{
+ cryptonote::COMMAND_RPC_ACCESS_DATA::request req;
+ cryptonote::COMMAND_RPC_ACCESS_DATA::response res;
+ std::string fail_message = "Unsuccessful";
+ epee::json_rpc::error error_resp;
+
+ if (m_is_rpc)
+ {
+ if (!m_rpc_client->json_rpc_request(req, res, "rpc_access_data", fail_message.c_str()))
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if (!m_rpc_server->on_rpc_access_data(req, res, error_resp) || res.status != CORE_RPC_STATUS_OK)
+ {
+ tools::fail_msg_writer() << make_error(fail_message, res.status);
+ return true;
+ }
+ }
+
+ const uint64_t now = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
+ uint64_t balance = 0;
+ tools::msg_writer() << boost::format("%64s %16u %16u %8u %8u %8u %8u %s")
+ % "Client ID" % "Balance" % "Total mined" % "Good" % "Stale" % "Bad" % "Dupes" % "Last update";
+ for (const auto &entry: res.entries)
+ {
+ tools::msg_writer() << boost::format("%64s %16u %16u %8u %8u %8u %8u %s")
+ % entry.client % entry.balance % entry.credits_total
+ % entry.nonces_good % entry.nonces_stale % entry.nonces_bad % entry.nonces_dupe
+ % (entry.last_update_time == 0 ? "never" : get_human_time_ago(entry.last_update_time, now).c_str());
+ balance += entry.balance;
+ }
+ tools::msg_writer() << res.entries.size() << " clients with a total of " << balance << " credits";
+ tools::msg_writer() << "Aggregated client hash rate: " << get_mining_speed(res.hashrate);
+
+ return true;
+}
+
}// namespace daemonize
diff --git a/src/daemon/rpc_command_executor.h b/src/daemon/rpc_command_executor.h
index af7081ef3..783b47373 100644
--- a/src/daemon/rpc_command_executor.h
+++ b/src/daemon/rpc_command_executor.h
@@ -167,6 +167,8 @@ public:
const std::string &address,
const std::string &username,
const std::string &password);
+
+ bool rpc_payments();
};
} // namespace daemonize