From cadc182fbdfc074693dc607540d127c07d3021b3 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Sun, 30 Jul 2017 19:03:26 +0300 Subject: [PATCH 1/3] RPC block_count_type, unchecked, unchecked_clear --- rai/node/rpc.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++-- rai/node/rpc.hpp | 3 ++ 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 7764a4b9..2d8fea01 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -25,9 +25,9 @@ chain_request_limit (16384) void rai::rpc_config::serialize_json (boost::property_tree::ptree & tree_a) const { - tree_a.put ("address", address.to_string ()); - tree_a.put ("port", std::to_string (port)); - tree_a.put ("enable_control", enable_control); + tree_a.put ("address", address.to_string ()); + tree_a.put ("port", std::to_string (port)); + tree_a.put ("enable_control", enable_control); tree_a.put ("frontier_request_limit", frontier_request_limit); tree_a.put ("chain_request_limit", chain_request_limit); } @@ -733,6 +733,18 @@ void rai::rpc_handler::block_count () response (response_l); } +void rai::rpc_handler::block_count_type () +{ + rai::transaction transaction (node.store.environment, nullptr, false); + rai::block_counts count (node.store.block_count (transaction)); + boost::property_tree::ptree response_l; + response_l.put ("send", std::to_string (count.send)); + response_l.put ("receive", std::to_string (count.receive)); + response_l.put ("open", std::to_string (count.open)); + response_l.put ("change", std::to_string (count.change)); + response (response_l); +} + void rai::rpc_handler::successors () { std::string block_text (request.get ("block")); @@ -1852,6 +1864,68 @@ void rai::rpc_handler::stop () } } +void rai::rpc_handler::unchecked () +{ + uint64_t count (std::numeric_limits ::max ()); + try + { + std::string count_text (request.get ("count")); + auto error (decode_unsigned (count_text, count)); + if (error) + { + error_response (response, "Invalid count"); + } + } + catch (std::runtime_error &) + { + // If there is no "count" in request + } + rai::uint256_union hash (0); + try + { + std::string hash_text (request.get ("hash")); + auto error_hash (hash.decode_hex (hash_text)); + if (error_hash) + { + error_response (response, "Bad hash number"); + } + } + catch (std::runtime_error &) + { + // If there is no "hash" in request + } + boost::property_tree::ptree response_l; + boost::property_tree::ptree unchecked; + rai::transaction transaction (node.store.environment, nullptr, false); + for (auto i (node.store.unchecked_begin (transaction, hash)), n (node.store.unchecked_end ()); i != n && unchecked.size () < count; ++i) + { + rai::block_hash hash (i->first); + rai::bufferstream stream (reinterpret_cast (i->second.mv_data), i->second.mv_size); + auto block (rai::deserialize_block (stream)); + std::string contents; + block->serialize_json (contents); + unchecked.put(hash.to_string (), contents); + } + response_l.add_child ("blocks", unchecked); + response (response_l); +} + +void rai::rpc_handler::unchecked_clear () +{ + if (rpc.config.enable_control) + { + rai::transaction transaction (node.store.environment, nullptr, true); + node.store.unchecked_clear (transaction); + boost::property_tree::ptree response_l; + response_l.put ("success", ""); + response (response_l); + } + else + { + error_response (response, "RPC control is disabled"); + } +} + void rai::rpc_handler::version () { boost::property_tree::ptree response_l; @@ -2542,6 +2616,10 @@ void rai::rpc_handler::process_request () { block_count (); } + else if (action == "block_count_type") + { + block_count_type (); + } else if (action == "successors") { successors (); @@ -2674,6 +2752,14 @@ void rai::rpc_handler::process_request () { stop (); } + else if (action == "unchecked") + { + unchecked (); + } + else if (action == "unchecked_clear") + { + unchecked_clear (); + } else if (action == "validate_account_number") { validate_account_number (); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 7cc8d98d..c46636c0 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -109,6 +109,7 @@ public: void blocks (); void block_account (); void block_count (); + void block_count_type (); void bootstrap (); void bootstrap_any (); void chain (); @@ -142,6 +143,8 @@ public: void send (); void stop (); void successors (); + void unchecked (); + void unchecked_clear (); void validate_account_number (); void version (); void wallet_add (); From 39bfa42c42dc2cb55a94c3e2dd6b6ed3af4d3a7f Mon Sep 17 00:00:00 2001 From: SergiySW Date: Mon, 31 Jul 2017 20:10:29 +0300 Subject: [PATCH 2/3] RPC unchecked_keys --- rai/node/rpc.cpp | 72 ++++++++++++++++++++++++++++++++++++------------ rai/node/rpc.hpp | 1 + 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 2d8fea01..bead55b6 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -1880,31 +1880,16 @@ void rai::rpc_handler::unchecked () { // If there is no "count" in request } - rai::uint256_union hash (0); - try - { - std::string hash_text (request.get ("hash")); - auto error_hash (hash.decode_hex (hash_text)); - if (error_hash) - { - error_response (response, "Bad hash number"); - } - } - catch (std::runtime_error &) - { - // If there is no "hash" in request - } boost::property_tree::ptree response_l; boost::property_tree::ptree unchecked; rai::transaction transaction (node.store.environment, nullptr, false); - for (auto i (node.store.unchecked_begin (transaction, hash)), n (node.store.unchecked_end ()); i != n && unchecked.size () < count; ++i) + for (auto i (node.store.unchecked_begin (transaction)), n (node.store.unchecked_end ()); i != n && unchecked.size () < count; ++i) { - rai::block_hash hash (i->first); rai::bufferstream stream (reinterpret_cast (i->second.mv_data), i->second.mv_size); auto block (rai::deserialize_block (stream)); std::string contents; block->serialize_json (contents); - unchecked.put(hash.to_string (), contents); + unchecked.put(block->hash ().to_string (), contents); } response_l.add_child ("blocks", unchecked); response (response_l); @@ -1926,6 +1911,55 @@ void rai::rpc_handler::unchecked_clear () } } +void rai::rpc_handler::unchecked_keys () +{ + uint64_t count (std::numeric_limits ::max ()); + try + { + std::string count_text (request.get ("count")); + auto error (decode_unsigned (count_text, count)); + if (error) + { + error_response (response, "Invalid count"); + } + } + catch (std::runtime_error &) + { + // If there is no "count" in request + } + rai::uint256_union key (0); + try + { + std::string hash_text (request.get ("key")); + auto error_hash (key.decode_hex (hash_text)); + if (error_hash) + { + error_response (response, "Bad key hash number"); + } + } + catch (std::runtime_error &) + { + // If there is no "key" in request + } + boost::property_tree::ptree response_l; + boost::property_tree::ptree unchecked; + rai::transaction transaction (node.store.environment, nullptr, false); + for (auto i (node.store.unchecked_begin (transaction, key)), n (node.store.unchecked_end ()); i != n && unchecked.size () < count; ++i) + { + boost::property_tree::ptree entry; + rai::bufferstream stream (reinterpret_cast (i->second.mv_data), i->second.mv_size); + auto block (rai::deserialize_block (stream)); + std::string contents; + block->serialize_json (contents); + entry.put ("key", rai::block_hash (i->first).to_string ()); + entry.put ("hash", block->hash ().to_string ()); + entry.put ("contents", contents); + unchecked.push_back (std::make_pair ("", entry)); + } + response_l.add_child ("unchecked", unchecked); + response (response_l); +} + void rai::rpc_handler::version () { boost::property_tree::ptree response_l; @@ -2760,6 +2794,10 @@ void rai::rpc_handler::process_request () { unchecked_clear (); } + else if (action == "unchecked_keys") + { + unchecked_keys (); + } else if (action == "validate_account_number") { validate_account_number (); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index c46636c0..37da4736 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -145,6 +145,7 @@ public: void successors (); void unchecked (); void unchecked_clear (); + void unchecked_keys (); void validate_account_number (); void version (); void wallet_add (); From 45e5eb4a2d67a6ac667336e63be95df610a79d9f Mon Sep 17 00:00:00 2001 From: SergiySW Date: Mon, 31 Jul 2017 20:40:46 +0300 Subject: [PATCH 3/3] RPC unchecked_get --- rai/node/rpc.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ rai/node/rpc.hpp | 1 + 2 files changed, 41 insertions(+) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index bead55b6..fce6d73b 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -1911,6 +1911,42 @@ void rai::rpc_handler::unchecked_clear () } } +void rai::rpc_handler::unchecked_get () +{ + std::string hash_text (request.get ("hash")); + rai::uint256_union hash; + auto error (hash.decode_hex (hash_text)); + if (!error) + { + boost::property_tree::ptree response_l; + rai::transaction transaction (node.store.environment, nullptr, false); + for (auto i (node.store.unchecked_begin (transaction)), n (node.store.unchecked_end ()); i != n; ++i) + { + rai::bufferstream stream (reinterpret_cast (i->second.mv_data), i->second.mv_size); + auto block (rai::deserialize_block (stream)); + if (block->hash () == hash) + { + std::string contents; + block->serialize_json (contents); + response_l.put ("contents", contents); + break; + } + } + if (!response_l.empty ()) + { + response (response_l); + } + else + { + error_response (response, "Unchecked block not found"); + } + } + else + { + error_response (response, "Bad hash number"); + } +} + void rai::rpc_handler::unchecked_keys () { uint64_t count (std::numeric_limits ::max ()); @@ -2794,6 +2830,10 @@ void rai::rpc_handler::process_request () { unchecked_clear (); } + else if (action == "unchecked_get") + { + unchecked_get (); + } else if (action == "unchecked_keys") { unchecked_keys (); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 37da4736..b0ebf528 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -145,6 +145,7 @@ public: void successors (); void unchecked (); void unchecked_clear (); + void unchecked_get (); void unchecked_keys (); void validate_account_number (); void version ();