From 133e022aca30abf20bad9baaeecd9e63d6b362b7 Mon Sep 17 00:00:00 2001 From: Sean Darcy Date: Mon, 8 Nov 2021 16:10:06 +1100 Subject: [PATCH] GET_SERVICE_KEYS --- src/daemon/rpc_command_executor.cpp | 23 ++++++++----------- src/rpc/core_rpc_server.cpp | 15 +++++------- src/rpc/core_rpc_server.h | 2 +- src/rpc/core_rpc_server_commands_defs.cpp | 8 ------- src/rpc/core_rpc_server_commands_defs.h | 28 ++++++++++------------- 5 files changed, 29 insertions(+), 47 deletions(-) diff --git a/src/daemon/rpc_command_executor.cpp b/src/daemon/rpc_command_executor.cpp index 18d6e1343..f7e7db904 100644 --- a/src/daemon/rpc_command_executor.cpp +++ b/src/daemon/rpc_command_executor.cpp @@ -469,12 +469,11 @@ bool rpc_command_executor::show_status() { bool my_sn_registered = false, my_sn_staked = false, my_sn_active = false; uint16_t my_reason_all = 0, my_reason_any = 0; if (info["service_node"].get()) { - GET_SERVICE_KEYS::response res{}; - - if (!invoke({}, res, "Failed to retrieve service node keys")) + auto maybe_service_keys = try_running([this] { return invoke(json{}); }, "Failed to retrieve service node keys"); + if (!maybe_service_keys) return false; - my_sn_key = std::move(res.service_node_pubkey); + my_sn_key = (*maybe_service_keys)["service_node_pubkey"]; auto maybe_sns = try_running([&] { return invoke(json{{"service_node_pubkeys", json::array({my_sn_key})}}); }, "Failed to retrieve service node info"); if (maybe_sns) { @@ -1890,15 +1889,17 @@ bool rpc_command_executor::pop_blocks(uint64_t num_blocks) bool rpc_command_executor::print_sn_key() { - GET_SERVICE_KEYS::response res{}; - if (!invoke({}, res, "Failed to retrieve service node keys")) + auto maybe_service_keys = try_running([this] { return invoke(json{}); }, "Failed to retrieve service node keys"); + if (!maybe_service_keys) return false; + auto my_sn_keys = *maybe_service_keys; + tools::success_msg_writer() - << "Service Node Public Key: " << res.service_node_pubkey - << "\n Ed25519 Public Key: " << res.service_node_ed25519_pubkey - << "\n X25519 Public Key: " << res.service_node_x25519_pubkey; + << "Service Node Public Key: " << my_sn_keys["service_node_pubkey"] + << "\n Ed25519 Public Key: " << my_sn_keys["service_node_ed25519_pubkey"] + << "\n X25519 Public Key: " << my_sn_keys["service_node_x25519_pubkey"]; return true; } @@ -1944,10 +1945,6 @@ bool rpc_command_executor::prepare_registration(bool force_registration) return false; auto& hfinfo = *maybe_hf; - GET_SERVICE_KEYS::response kres{}; - if (!invoke({}, kres, "Failed to retrieve service node keys")) - return false; - if (!info.value("service_node", false)) { tools::fail_msg_writer() << "Unable to prepare registration: this daemon is not running in --service-node mode"; diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index 4022e7e3c..fac0fba44 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -2733,19 +2733,16 @@ namespace cryptonote::rpc { return res; } //------------------------------------------------------------------------------------------------------------------------------ - GET_SERVICE_KEYS::response core_rpc_server::invoke(GET_SERVICE_KEYS::request&& req, rpc_context context) + void core_rpc_server::invoke(GET_SERVICE_KEYS& get_service_keys, rpc_context context) { - GET_SERVICE_KEYS::response res{}; - PERF_TIMER(on_get_service_node_key); - const auto& keys = m_core.get_service_keys(); if (keys.pub) - res.service_node_pubkey = tools::type_to_hex(keys.pub); - res.service_node_ed25519_pubkey = tools::type_to_hex(keys.pub_ed25519); - res.service_node_x25519_pubkey = tools::type_to_hex(keys.pub_x25519); - res.status = STATUS_OK; - return res; + get_service_keys.response["service_node_pubkey"] = tools::type_to_hex(keys.pub); + get_service_keys.response["service_node_ed25519_pubkey"] = tools::type_to_hex(keys.pub_ed25519); + get_service_keys.response["service_node_x25519_pubkey"] = tools::type_to_hex(keys.pub_x25519); + get_service_keys.response["status"] = STATUS_OK; + return; } //------------------------------------------------------------------------------------------------------------------------------ GET_SERVICE_PRIVKEYS::response core_rpc_server::invoke(GET_SERVICE_PRIVKEYS::request&& req, rpc_context context) diff --git a/src/rpc/core_rpc_server.h b/src/rpc/core_rpc_server.h index 34888e888..1969ff678 100644 --- a/src/rpc/core_rpc_server.h +++ b/src/rpc/core_rpc_server.h @@ -250,6 +250,7 @@ namespace cryptonote::rpc { void invoke(SETBANS& set_bans, rpc_context context); void invoke(GET_CHECKPOINTS& get_checkpoints, rpc_context context); void invoke(GET_STAKING_REQUIREMENT& get_staking_requirement, rpc_context context); + void invoke(GET_SERVICE_KEYS& get_service_keys, rpc_context context); // Deprecated Monero NIH binary endpoints: GET_ALT_BLOCKS_HASHES_BIN::response invoke(GET_ALT_BLOCKS_HASHES_BIN::request&& req, rpc_context context); @@ -275,7 +276,6 @@ namespace cryptonote::rpc { GET_SERVICE_NODE_REGISTRATION_CMD_RAW::response invoke(GET_SERVICE_NODE_REGISTRATION_CMD_RAW::request&& req, rpc_context context); GET_SERVICE_NODE_REGISTRATION_CMD::response invoke(GET_SERVICE_NODE_REGISTRATION_CMD::request&& req, rpc_context context); GET_SERVICE_NODE_BLACKLISTED_KEY_IMAGES::response invoke(GET_SERVICE_NODE_BLACKLISTED_KEY_IMAGES::request&& req, rpc_context context); - GET_SERVICE_KEYS::response invoke(GET_SERVICE_KEYS::request&& req, rpc_context context); GET_SERVICE_PRIVKEYS::response invoke(GET_SERVICE_PRIVKEYS::request&& req, rpc_context context); ONS_NAMES_TO_OWNERS::response invoke(ONS_NAMES_TO_OWNERS::request&& req, rpc_context context); ONS_OWNERS_TO_NAMES::response invoke(ONS_OWNERS_TO_NAMES::request&& req, rpc_context context); diff --git a/src/rpc/core_rpc_server_commands_defs.cpp b/src/rpc/core_rpc_server_commands_defs.cpp index f055c67d2..2de6ccf39 100644 --- a/src/rpc/core_rpc_server_commands_defs.cpp +++ b/src/rpc/core_rpc_server_commands_defs.cpp @@ -331,14 +331,6 @@ KV_SERIALIZE_MAP_CODE_BEGIN(GET_SERVICE_NODE_REGISTRATION_CMD::request) KV_SERIALIZE_MAP_CODE_END() -KV_SERIALIZE_MAP_CODE_BEGIN(GET_SERVICE_KEYS::response) - KV_SERIALIZE(service_node_pubkey) - KV_SERIALIZE(service_node_ed25519_pubkey) - KV_SERIALIZE(service_node_x25519_pubkey) - KV_SERIALIZE(status) -KV_SERIALIZE_MAP_CODE_END() - - KV_SERIALIZE_MAP_CODE_BEGIN(GET_SERVICE_PRIVKEYS::response) KV_SERIALIZE(service_node_privkey) KV_SERIALIZE(service_node_ed25519_privkey) diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index 8135c3846..f2da12be8 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -1710,25 +1710,21 @@ namespace cryptonote::rpc { using response = GET_SERVICE_NODE_REGISTRATION_CMD_RAW::response; }; - OXEN_RPC_DOC_INTROSPECT - // Get the service public keys of the queried daemon, encoded in hex. All three keys are used - // when running as a service node; when running as a regular node only the x25519 key is regularly - // used for some RPC and and node-to-SN communication requests. + /// Get the service public keys of the queried daemon, encoded in hex. All three keys are used + /// when running as a service node; when running as a regular node only the x25519 key is regularly + /// used for some RPC and and node-to-SN communication requests. + /// + /// Inputs: None + /// + /// Output values available from a restricted/admin RPC endpoint: + /// + /// - \p status General RPC status string. `"OK"` means everything looks good. + /// - \p service_node_pubkey The queried daemon's service node public key. Will be empty if not running as a service node. + /// - \p service_node_ed25519_pubkey The daemon's ed25519 auxiliary public key. + /// - \p service_node_x25519_pubkey The daemon's x25519 auxiliary public key. struct GET_SERVICE_KEYS : RPC_COMMAND { static constexpr auto names() { return NAMES("get_service_keys", "get_service_node_key"); } - - struct request : EMPTY {}; - - struct response - { - std::string service_node_pubkey; // The queried daemon's service node public key. Will be empty if not running as a service node. - std::string service_node_ed25519_pubkey; // The daemon's ed25519 auxiliary public key. - std::string service_node_x25519_pubkey; // The daemon's x25519 auxiliary public key. - std::string status; // Generic RPC error code. "OK" is the success value. - - KV_MAP_SERIALIZABLE - }; }; OXEN_RPC_DOC_INTROSPECT