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.cpp74
-rw-r--r--src/daemon/rpc_command_executor.h2
6 files changed, 90 insertions, 22 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..552862d2f 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)
@@ -91,14 +100,15 @@ namespace {
<< "height: " << boost::lexical_cast<std::string>(header.height) << std::endl
<< "depth: " << boost::lexical_cast<std::string>(header.depth) << std::endl
<< "hash: " << header.hash << std::endl
- << "difficulty: " << header.wide_difficulty << std::endl
- << "cumulative difficulty: " << header.wide_cumulative_difficulty << std::endl
+ << "difficulty: " << cryptonote::difficulty_type(header.wide_difficulty) << std::endl
+ << "cumulative difficulty: " << cryptonote::difficulty_type(header.wide_cumulative_difficulty) << std::endl
<< "POW hash: " << header.pow_hash << std::endl
<< "block size: " << header.block_size << std::endl
<< "block weight: " << header.block_weight << std::endl
<< "long term weight: " << header.long_term_weight << std::endl
<< "num txes: " << header.num_txes << std::endl
- << "reward: " << cryptonote::print_money(header.reward);
+ << "reward: " << cryptonote::print_money(header.reward) << std::endl
+ << "miner tx hash: " << header.miner_tx_hash;
}
std::string get_human_time_ago(time_t t, time_t now)
@@ -356,8 +366,8 @@ bool t_rpc_command_executor::show_difficulty() {
tools::success_msg_writer() << "BH: " << res.height
<< ", TH: " << res.top_block_hash
- << ", DIFF: " << res.wide_difficulty
- << ", CUM_DIFF: " << res.wide_cumulative_difficulty
+ << ", DIFF: " << cryptonote::difficulty_type(res.wide_difficulty)
+ << ", CUM_DIFF: " << cryptonote::difficulty_type(res.wide_cumulative_difficulty)
<< ", HR: " << cryptonote::difficulty_type(res.wide_difficulty) / res.target << " H/s";
return true;
@@ -770,7 +780,7 @@ bool t_rpc_command_executor::print_blockchain_info(uint64_t start_block_index, u
<< ", size: " << header.block_size << ", weight: " << header.block_weight << " (long term " << header.long_term_weight << "), transactions: " << header.num_txes << std::endl
<< "major version: " << (unsigned)header.major_version << ", minor version: " << (unsigned)header.minor_version << std::endl
<< "block id: " << header.hash << ", previous block id: " << header.prev_hash << std::endl
- << "difficulty: " << header.wide_difficulty << ", nonce " << header.nonce << ", reward " << cryptonote::print_money(header.reward) << std::endl;
+ << "difficulty: " << cryptonote::difficulty_type(header.wide_difficulty) << ", nonce " << header.nonce << ", reward " << cryptonote::print_money(header.reward) << std::endl;
first = false;
}
@@ -961,10 +971,11 @@ bool t_rpc_command_executor::print_transaction(crypto::hash transaction_hash,
if (1 == res.txs.size())
{
// only available for new style answers
+ bool pruned = res.txs.front().prunable_as_hex.empty() && res.txs.front().prunable_hash != epee::string_tools::pod_to_hex(crypto::null_hash);
if (res.txs.front().in_pool)
tools::success_msg_writer() << "Found in pool";
else
- tools::success_msg_writer() << "Found in blockchain at height " << res.txs.front().block_height << (res.txs.front().prunable_as_hex.empty() ? " (pruned)" : "");
+ tools::success_msg_writer() << "Found in blockchain at height " << res.txs.front().block_height << (pruned ? " (pruned)" : "");
}
const std::string &as_hex = (1 == res.txs.size()) ? res.txs.front().as_hex : res.txs_as_hex.front();
@@ -1902,7 +1913,7 @@ bool t_rpc_command_executor::alt_chain_info(const std::string &tip, size_t above
const auto &chain = chains[idx];
const uint64_t start_height = (chain.height - chain.length + 1);
tools::msg_writer() << chain.length << " blocks long, from height " << start_height << " (" << (ires.height - start_height - 1)
- << " deep), diff " << chain.wide_difficulty << ": " << chain.block_hash;
+ << " deep), diff " << cryptonote::difficulty_type(chain.wide_difficulty) << ": " << chain.block_hash;
}
}
else
@@ -1915,7 +1926,7 @@ bool t_rpc_command_executor::alt_chain_info(const std::string &tip, size_t above
tools::success_msg_writer() << "Found alternate chain with tip " << tip;
uint64_t start_height = (chain.height - chain.length + 1);
tools::msg_writer() << chain.length << " blocks long, from height " << start_height << " (" << (ires.height - start_height - 1)
- << " deep), diff " << chain.wide_difficulty << ":";
+ << " deep), diff " << cryptonote::difficulty_type(chain.wide_difficulty) << ":";
for (const std::string &block_id: chain.block_hashes)
tools::msg_writer() << " " << block_id;
tools::msg_writer() << "Chain parent on main chain: " << chain.main_chain_parent_block;
@@ -2019,7 +2030,7 @@ bool t_rpc_command_executor::print_blockchain_dynamic_stats(uint64_t nblocks)
}
}
- tools::msg_writer() << "Height: " << ires.height << ", diff " << ires.wide_difficulty << ", cum. diff " << ires.wide_cumulative_difficulty
+ tools::msg_writer() << "Height: " << ires.height << ", diff " << cryptonote::difficulty_type(ires.wide_difficulty) << ", cum. diff " << cryptonote::difficulty_type(ires.wide_cumulative_difficulty)
<< ", target " << ires.target << " sec" << ", dyn fee " << cryptonote::print_money(feres.fee) << "/" << (hfres.enabled ? "byte" : "kB");
if (nblocks > 0)
@@ -2362,4 +2373,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