From 7cde941f2ec61b05d9711fe65dc6205e76330b05 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Tue, 7 Feb 2017 14:04:18 -0600 Subject: [PATCH] Add pending RPC to query for blocks that can be received by an account. --- rai/core_test/rpc.cpp | 28 ++++++++++++++++++++++++++-- rai/node/rpc.cpp | 37 +++++++++++++++++++++++++++++++++++++ rai/node/rpc.hpp | 1 + 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index eaafc45a..543f00d8 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -1200,8 +1200,32 @@ TEST (rpc, peers) system.poll (); } ASSERT_EQ (200, response.status); - auto & frontiers_node (response.json.get_child ("peers")); - ASSERT_EQ (1, frontiers_node.size ()); + auto & peers_node (response.json.get_child ("peers")); + ASSERT_EQ (1, peers_node.size ()); +} + +TEST (rpc, pending) +{ + rai::system system (24000, 1); + rai::keypair key1; + system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv); + auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, key1.pub, 100)); + rai::rpc rpc (system.service, *system.nodes [0], rai::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "pending"); + request.put ("account", key1.pub.to_account ()); + request.put ("count", "100"); + test_response response (request, rpc, system.service); + while (response.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response.status); + auto & blocks_node (response.json.get_child ("blocks")); + ASSERT_EQ (1, blocks_node.size ()); + rai::block_hash hash1 (blocks_node.begin ()->second.get ("")); + ASSERT_EQ (block1->hash (), hash1); } TEST (rpc_config, serialization) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 83121629..7470bcf7 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -847,6 +847,39 @@ void rai::rpc_handler::peers () rpc.send_response (response, response_l); } +void rai::rpc_handler::pending () +{ + std::string account_text (request.get ("account")); + rai::account account; + if (!account.decode_account(account_text)) + { + std::string count_text (request.get ("count")); + uint64_t count; + if (!rpc.decode_unsigned (count_text, count)) + { + boost::property_tree::ptree response_l; + boost::property_tree::ptree peers_l; + { + rai::transaction transaction (rpc.node.store.environment, nullptr, false); + rai::account end (account.number () + 1); + for (auto i (rpc.node.store.pending_begin (transaction, rai::pending_key (account, 0))), n (rpc.node.store.pending_begin (transaction, rai::pending_key (end, 0))); i != n && peers_l.size ()< count; ++i) + { + rai::pending_key key (i->first); + boost::property_tree::ptree entry; + entry.put ("", key.hash.to_string ()); + peers_l.push_back (std::make_pair ("", entry)); + } + } + response_l.add_child ("blocks", peers_l); + rpc.send_response (response, response_l); + } + } + else + { + rpc.error_response (response, "Bad account number"); + } +} + void rai::rpc_handler::payment_begin () { std::string id_text (request.get ("wallet")); @@ -1753,6 +1786,10 @@ void rai::rpc_handler::process_request () { peers (); } + else if (action == "pending") + { + pending (); + } else if (action == "process") { process (); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 77030499..0b430462 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -109,6 +109,7 @@ public: void payment_end (); void payment_wait (); void peers (); + void pending (); void process (); void rai_to_raw (); void rai_from_raw ();