From cca3394c15970b3a813b2af4148396b58f86f74e Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 04:33:02 +0300 Subject: [PATCH 01/20] RPC sign Signing hash or block --- rai/node/rpc.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++++++ rai/node/rpc.hpp | 1 + 2 files changed, 101 insertions(+) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index e23ede559f..60ddc376f4 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -2766,6 +2766,102 @@ void rai::rpc_handler::send () } } +void rai::rpc_handler::sign () +{ + // Retrieving hash + rai::block_hash hash (0); + boost::optional hash_text (request.get_optional ("hash")); + if (hash_text.is_initialized ()) + { + hash = hash_impl (); + } + // Retrieving block + std::shared_ptr block; + boost::optional block_text (request.get_optional ("block")); + if (!ec && block_text.is_initialized ()) + { + boost::property_tree::ptree block_l; + std::stringstream block_stream (block_text.get ()); + boost::property_tree::read_json (block_stream, block_l); + block = rai::deserialize_block_json (block_l); + if (block != nullptr) + { + hash = block->hash (); + } + else + { + ec = nano::error_blocks::invalid_block; + } + } + if (!ec && hash.is_zero ()) + { + ec = nano::error_blocks::invalid_block; + } + if (!ec) + { + rai::raw_key prv; + prv.data.clear (); + // Retrieving private key from request + boost::optional key_text (request.get_optional ("key")); + if (key_text.is_initialized ()) + { + if (prv.data.decode_hex (key_text.get ())) + { + ec = nano::error_common::bad_private_key; + } + } + else + { + // Retrieving private key from wallet + boost::optional account_text (request.get_optional ("account")); + boost::optional wallet_text (request.get_optional ("wallet")); + if (wallet_text.is_initialized () && account_text.is_initialized ()) + { + auto account (account_impl ()); + auto wallet (wallet_impl ()); + if (!ec) + { + auto transaction (node.store.tx_begin_read ()); + if (wallet->store.valid_password (transaction)) + { + if (wallet->store.find (transaction, account) != wallet->store.end ()) + { + wallet->store.fetch (transaction, account, prv); + } + else + { + ec = nano::error_common::account_not_found_wallet; + } + } + else + { + ec = nano::error_common::wallet_locked; + } + } + } + } + // Signing + if (prv.data != 0) + { + rai::public_key pub (rai::pub_key (prv.data)); + rai::signature signature (rai::sign_message (prv, pub, hash)); + response_l.put ("signature", signature.to_string ()); + if (block != nullptr) + { + block.signature_set (signature); + std::string contents; + block->serialize_json (contents); + response_l.put ("block", contents); + } + } + else + { + ec = nano::error_rpc::block_create_key_required; + } + } + response_errors (); +} + void rai::rpc_handler::stats () { auto sink = node.stats.log_sink_json (); @@ -3975,6 +4071,10 @@ void rai::rpc_handler::process_request () { send (); } + else if (action == "sign") + { + sign (); + } else if (action == "stats") { stats (); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 07ef879eb2..bb4bcb662e 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -181,6 +181,7 @@ class rpc_handler : public std::enable_shared_from_this void search_pending (); void search_pending_all (); void send (); + void sign (); void stats (); void stop (); void unchecked (); From b6ae6708339fbb5970bb0640464ae7babbd4f3e6 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 04:35:34 +0300 Subject: [PATCH 02/20] Typo --- rai/node/rpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 60ddc376f4..b2152fc5de 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -2848,7 +2848,7 @@ void rai::rpc_handler::sign () response_l.put ("signature", signature.to_string ()); if (block != nullptr) { - block.signature_set (signature); + block->signature_set (signature); std::string contents; block->serialize_json (contents); response_l.put ("block", contents); From 204579e8284ffef9a71fae35927d15f2e7c7eb65 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 05:00:17 +0300 Subject: [PATCH 03/20] Add test for RPC sign --- rai/core_test/rpc.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 8a4c9c99ed..196144c6a2 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3714,3 +3714,51 @@ TEST (rpc, block_confirm_absent) ASSERT_EQ (200, response.status); ASSERT_EQ ("Block not found", response.json.get ("error")); } + +TEST (rpc, sign) +{ + rai::system system (24000, 1); + rai::keypair key; + auto & node1 (*system.nodes[0]); + rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "sign"); + request.put ("hash", send.hash ().to_string ()); + request.put ("key", key.prv.data.to_string ()); + test_response response (request, rpc, system.service); + while (response.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response.status); + rai::signature signature; + std::string signature_text (response.json.get ("signature")); + ASSERT_FALSE (signature.decode_hex (signature_text)); + ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), signature)); + request.erase ("hash"); + request.erase ("key"); + system.wallet (0)->insert_adhoc (key.prv); + std::string wallet; + system.nodes[0]->wallets.items.begin ()->first.encode_hex (wallet); + request.put ("wallet", wallet); + request.put ("account", key.pub.to_account ()); + std::string json; + send.serialize_json (json); + request.put ("block", json); + test_response response2 (request, rpc, system.service); + while (response2.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response2.status); + auto contents (response2.json.get ("block")); + boost::property_tree::ptree block_l; + std::stringstream block_stream (contents); + boost::property_tree::read_json (block_stream, block_l); + auto block (rai::deserialize_block_json (block_l)); + ASSERT_EQ (block->block_signature (), signature); + ASSERT_NE (block->block_signature (), send.block_signature ()); + ASSERT_EQ (block->hash (), send.hash ()); +} From 4aa69255a17bcb5508f2e99426ff63d298181cbb Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 05:21:27 +0300 Subject: [PATCH 04/20] block_impl --- rai/node/rpc.cpp | 55 +++++++++++++++++++++--------------------------- rai/node/rpc.hpp | 1 + 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index b2152fc5de..ce9fbdef2d 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -276,6 +276,24 @@ rai::amount rai::rpc_handler::amount_impl () return result; } +std::shared_ptr rai::rpc_handler::block_impl () +{ + std::shared_ptr result; + if (!ec) + { + std::string block_text (request.get ("block")); + boost::property_tree::ptree block_l; + std::stringstream block_stream (block_text); + boost::property_tree::read_json (block_stream, block_l); + result = rai::deserialize_block_json (block_l); + if (result == nullptr) + { + ec = nano::error_blocks::invalid_block; + } + } + return result; +} + rai::block_hash rai::rpc_handler::hash_impl (std::string search_text) { rai::block_hash result (0); @@ -1290,21 +1308,11 @@ void rai::rpc_handler::block_create () void rai::rpc_handler::block_hash () { - std::string block_text (request.get ("block")); - boost::property_tree::ptree block_l; - std::stringstream block_stream (block_text); - boost::property_tree::read_json (block_stream, block_l); - block_l.put ("signature", "0"); - block_l.put ("work", "0"); - auto block (rai::deserialize_block_json (block_l)); - if (block != nullptr) + auto block (block_impl ()); + if (!ec) { response_l.put ("hash", block->hash ().to_string ()); } - else - { - ec = nano::error_blocks::invalid_block; - } response_errors (); } @@ -2288,12 +2296,8 @@ void rai::rpc_handler::payment_wait () void rai::rpc_handler::process () { - std::string block_text (request.get ("block")); - boost::property_tree::ptree block_l; - std::stringstream block_stream (block_text); - boost::property_tree::read_json (block_stream, block_l); - std::shared_ptr block (rai::deserialize_block_json (block_l)); - if (block != nullptr) + auto block (block_impl ()); + if (!ec) { if (!rai::work_validate (*block)) { @@ -2379,10 +2383,6 @@ void rai::rpc_handler::process () ec = nano::error_blocks::work_low; } } - else - { - ec = nano::error_blocks::invalid_block; - } response_errors (); } @@ -2780,18 +2780,11 @@ void rai::rpc_handler::sign () boost::optional block_text (request.get_optional ("block")); if (!ec && block_text.is_initialized ()) { - boost::property_tree::ptree block_l; - std::stringstream block_stream (block_text.get ()); - boost::property_tree::read_json (block_stream, block_l); - block = rai::deserialize_block_json (block_l); - if (block != nullptr) + block = block_impl (); + if (!ec) { hash = block->hash (); } - else - { - ec = nano::error_blocks::invalid_block; - } } if (!ec && hash.is_zero ()) { diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index bb4bcb662e..c57cf50df1 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -228,6 +228,7 @@ class rpc_handler : public std::enable_shared_from_this std::shared_ptr wallet_impl (); rai::account account_impl (std::string = ""); rai::amount amount_impl (); + std::shared_ptr block_impl (); rai::block_hash hash_impl (std::string = "hash"); rai::amount threshold_optional_impl (); uint64_t work_optional_impl (); From 5e0c37e65c7f496892952202d88eb588252ce26f Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 05:37:10 +0300 Subject: [PATCH 05/20] Add required header --- rai/node/rpc.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index c57cf50df1..57e35f9219 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace rai { From 71a36d29dddfc0c2419a6d7c46cd2ff221577501 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 06:22:28 +0300 Subject: [PATCH 06/20] Split sign_hash & sign_block --- rai/core_test/rpc.cpp | 28 ++-- rai/node/rpc.cpp | 292 ++++++++++++++++++++++-------------------- rai/node/rpc.hpp | 6 +- 3 files changed, 178 insertions(+), 148 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 196144c6a2..2e5badb39b 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3715,7 +3715,7 @@ TEST (rpc, block_confirm_absent) ASSERT_EQ ("Block not found", response.json.get ("error")); } -TEST (rpc, sign) +TEST (rpc, sign_hash) { rai::system system (24000, 1); rai::keypair key; @@ -3724,7 +3724,7 @@ TEST (rpc, sign) rai::rpc rpc (system.service, node1, rai::rpc_config (true)); rpc.start (); boost::property_tree::ptree request; - request.put ("action", "sign"); + request.put ("action", "sign_hash"); request.put ("hash", send.hash ().to_string ()); request.put ("key", key.prv.data.to_string ()); test_response response (request, rpc, system.service); @@ -3737,8 +3737,18 @@ TEST (rpc, sign) std::string signature_text (response.json.get ("signature")); ASSERT_FALSE (signature.decode_hex (signature_text)); ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), signature)); - request.erase ("hash"); - request.erase ("key"); +} + +TEST (rpc, sign_block) +{ + rai::system system (24000, 1); + rai::keypair key; + auto & node1 (*system.nodes[0]); + rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "sign_block"); system.wallet (0)->insert_adhoc (key.prv); std::string wallet; system.nodes[0]->wallets.items.begin ()->first.encode_hex (wallet); @@ -3747,18 +3757,18 @@ TEST (rpc, sign) std::string json; send.serialize_json (json); request.put ("block", json); - test_response response2 (request, rpc, system.service); - while (response2.status == 0) + test_response response (request, rpc, system.service); + while (response.status == 0) { system.poll (); } - ASSERT_EQ (200, response2.status); - auto contents (response2.json.get ("block")); + ASSERT_EQ (200, response.status); + auto contents (response.json.get ("block")); boost::property_tree::ptree block_l; std::stringstream block_stream (contents); boost::property_tree::read_json (block_stream, block_l); auto block (rai::deserialize_block_json (block_l)); - ASSERT_EQ (block->block_signature (), signature); + ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), block->block_signature ())); ASSERT_NE (block->block_signature (), send.block_signature ()); ASSERT_EQ (block->hash (), send.hash ()); } diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index ce9fbdef2d..2dd6aaeeed 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -245,6 +245,37 @@ std::shared_ptr rai::rpc_handler::wallet_impl () return nullptr; } +bool rai::rpc_handler::wallet_locked_impl (rai::transaction const & transaction_a, std::shared_ptr wallet_a) +{ + bool result (false); + if (!ec) + { + if (!wallet_a->store.valid_password (transaction_a)) + { + ec = nano::error_common::wallet_locked; + result = true; + } + } + return result; +} + +bool rai::rpc_handler::wallet_account_impl (rai::transaction const & transaction_a, std::shared_ptr wallet_a, rai::account const & account_a) +{ + bool result (false); + if (!ec) + { + if (wallet_a->store.find (transaction_a, account_a) != wallet_a->store.end ()) + { + result = true; + } + else + { + ec = nano::error_common::account_not_found_wallet; + } + } + return result; +} + rai::account rai::rpc_handler::account_impl (std::string account_text) { rai::account result (0); @@ -591,21 +622,12 @@ void rai::rpc_handler::account_remove () if (!ec) { auto transaction (node.store.tx_begin_write ()); - if (wallet->store.valid_password (transaction)) - { - if (wallet->store.find (transaction, account) != wallet->store.end ()) - { - wallet->store.erase (transaction, account); - response_l.put ("removed", "1"); - } - else - { - ec = nano::error_common::account_not_found_wallet; - } - } - else + wallet_locked_impl (transaction, wallet); + wallet_account_impl (transaction, wallet, account); + if (!ec) { - ec = nano::error_common::wallet_locked; + wallet->store.erase (transaction, account); + response_l.put ("removed", "1"); } } response_errors (); @@ -647,7 +669,8 @@ void rai::rpc_handler::account_representative_set () if (!ec && work) { auto transaction (node.store.tx_begin_write ()); - if (wallet->store.valid_password (transaction)) + wallet_locked_impl (transaction, wallet); + if (!ec) { rai::account_info info; if (!node.store.account_get (transaction, account, info)) @@ -666,10 +689,6 @@ void rai::rpc_handler::account_representative_set () ec = nano::error_common::account_not_found; } } - else - { - ec = nano::error_common::wallet_locked; - } } if (!ec) { @@ -1100,22 +1119,13 @@ void rai::rpc_handler::block_create () if (existing != node.wallets.items.end ()) { auto transaction (node.store.tx_begin_read ()); - if (existing->second->store.valid_password (transaction)) - { - if (existing->second->store.find (transaction, account) != existing->second->store.end ()) - { - existing->second->store.fetch (transaction, account, prv); - previous = node.ledger.latest (transaction, account); - balance = node.ledger.account_balance (transaction, account); - } - else - { - ec = nano::error_common::account_not_found_wallet; - } - } - else + wallet_locked_impl (transaction, existing->second); + wallet_account_impl (transaction, existing->second, account); + if (!ec) { - ec = nano::error_common::wallet_locked; + existing->second->store.fetch (transaction, account, prv); + previous = node.ledger.latest (transaction, account); + balance = node.ledger.account_balance (transaction, account); } } else @@ -2243,8 +2253,8 @@ void rai::rpc_handler::payment_end () if (!ec) { auto transaction (node.store.tx_begin_read ()); - auto existing (wallet->store.find (transaction, account)); - if (existing != wallet->store.end ()) + wallet_account_impl (transaction, wallet, account); + if (!ec) { if (node.ledger.account_balance (transaction, account).is_zero ()) { @@ -2256,10 +2266,6 @@ void rai::rpc_handler::payment_end () ec = nano::error_rpc::payment_account_balance; } } - else - { - ec = nano::error_common::account_not_found_wallet; - } } response_errors (); } @@ -2395,73 +2401,64 @@ void rai::rpc_handler::receive () if (!ec) { auto transaction (node.store.tx_begin_read ()); - if (wallet->store.valid_password (transaction)) + wallet_locked_impl (transaction, wallet); + wallet_account_impl (transaction, wallet, account); + if (!ec) { - if (wallet->store.find (transaction, account) != wallet->store.end ()) + auto block (node.store.block_get (transaction, hash)); + if (block != nullptr) { - auto block (node.store.block_get (transaction, hash)); - if (block != nullptr) + if (node.store.pending_exists (transaction, rai::pending_key (account, hash))) { - if (node.store.pending_exists (transaction, rai::pending_key (account, hash))) + auto work (work_optional_impl ()); + if (!ec && work) { - auto work (work_optional_impl ()); - if (!ec && work) + rai::account_info info; + rai::uint256_union head; + if (!node.store.account_get (transaction, account, info)) { - rai::account_info info; - rai::uint256_union head; - if (!node.store.account_get (transaction, account, info)) - { - head = info.head; - } - else - { - head = account; - } - if (!rai::work_validate (head, work)) - { - auto transaction_a (node.store.tx_begin_write ()); - wallet->store.work_put (transaction_a, account, work); - } - else - { - ec = nano::error_common::invalid_work; - } + head = info.head; } - if (!ec) + else { - auto response_a (response); - wallet->receive_async (std::move (block), account, rai::genesis_amount, [response_a](std::shared_ptr block_a) { - rai::uint256_union hash_a (0); - if (block_a != nullptr) - { - hash_a = block_a->hash (); - } - boost::property_tree::ptree response_l; - response_l.put ("block", hash_a.to_string ()); - response_a (response_l); - }, - work == 0); + head = account; + } + if (!rai::work_validate (head, work)) + { + auto transaction_a (node.store.tx_begin_write ()); + wallet->store.work_put (transaction_a, account, work); + } + else + { + ec = nano::error_common::invalid_work; } } - else + if (!ec) { - ec = nano::error_process::unreceivable; + auto response_a (response); + wallet->receive_async (std::move (block), account, rai::genesis_amount, [response_a](std::shared_ptr block_a) { + rai::uint256_union hash_a (0); + if (block_a != nullptr) + { + hash_a = block_a->hash (); + } + boost::property_tree::ptree response_l; + response_l.put ("block", hash_a.to_string ()); + response_a (response_l); + }, + work == 0); } } else { - ec = nano::error_blocks::not_found; + ec = nano::error_process::unreceivable; } } else { - ec = nano::error_common::account_not_found_wallet; + ec = nano::error_blocks::not_found; } } - else - { - ec = nano::error_common::wallet_locked; - } } // Because of receive_async if (ec) @@ -2766,30 +2763,63 @@ void rai::rpc_handler::send () } } -void rai::rpc_handler::sign () +void rai::rpc_handler::sign_hash () { // Retrieving hash - rai::block_hash hash (0); - boost::optional hash_text (request.get_optional ("hash")); - if (hash_text.is_initialized ()) - { - hash = hash_impl (); - } - // Retrieving block - std::shared_ptr block; - boost::optional block_text (request.get_optional ("block")); - if (!ec && block_text.is_initialized ()) + auto hash (hash_impl ()); + if (!ec) { - block = block_impl (); - if (!ec) + rai::raw_key prv; + prv.data.clear (); + // Retrieving private key from request + boost::optional key_text (request.get_optional ("key")); + if (key_text.is_initialized ()) + { + if (prv.data.decode_hex (key_text.get ())) + { + ec = nano::error_common::bad_private_key; + } + } + else { - hash = block->hash (); + // Retrieving private key from wallet + boost::optional account_text (request.get_optional ("account")); + boost::optional wallet_text (request.get_optional ("wallet")); + if (wallet_text.is_initialized () && account_text.is_initialized ()) + { + auto account (account_impl ()); + auto wallet (wallet_impl ()); + if (!ec) + { + auto transaction (node.store.tx_begin_read ()); + wallet_locked_impl (transaction, wallet); + wallet_account_impl (transaction, wallet, account); + if (!ec) + { + wallet->store.fetch (transaction, account, prv); + } + } + } + } + // Signing + if (prv.data != 0) + { + rai::public_key pub (rai::pub_key (prv.data)); + rai::signature signature (rai::sign_message (prv, pub, hash)); + response_l.put ("signature", signature.to_string ()); + } + else + { + ec = nano::error_rpc::block_create_key_required; } } - if (!ec && hash.is_zero ()) - { - ec = nano::error_blocks::invalid_block; - } + response_errors (); +} + +void rai::rpc_handler::sign_block () +{ + // Retrieving block + auto block (block_impl ()); if (!ec) { rai::raw_key prv; @@ -2815,20 +2845,11 @@ void rai::rpc_handler::sign () if (!ec) { auto transaction (node.store.tx_begin_read ()); - if (wallet->store.valid_password (transaction)) - { - if (wallet->store.find (transaction, account) != wallet->store.end ()) - { - wallet->store.fetch (transaction, account, prv); - } - else - { - ec = nano::error_common::account_not_found_wallet; - } - } - else + wallet_locked_impl (transaction, wallet); + wallet_account_impl (transaction, wallet, account); + if (!ec) { - ec = nano::error_common::wallet_locked; + wallet->store.fetch (transaction, account, prv); } } } @@ -2837,15 +2858,12 @@ void rai::rpc_handler::sign () if (prv.data != 0) { rai::public_key pub (rai::pub_key (prv.data)); - rai::signature signature (rai::sign_message (prv, pub, hash)); + rai::signature signature (rai::sign_message (prv, pub, block->hash ())); + block->signature_set (signature); + std::string contents; + block->serialize_json (contents); + response_l.put ("block", contents); response_l.put ("signature", signature.to_string ()); - if (block != nullptr) - { - block->signature_set (signature); - std::string contents; - block->serialize_json (contents); - response_l.put ("block", contents); - } } else { @@ -3544,16 +3562,13 @@ void rai::rpc_handler::work_get () if (!ec) { auto transaction (node.store.tx_begin_read ()); - if (wallet->store.find (transaction, account) != wallet->store.end ()) + wallet_account_impl (transaction, wallet, account); + if (!ec) { uint64_t work (0); auto error_work (wallet->store.work_get (transaction, account, work)); response_l.put ("work", rai::to_string_hex (work)); } - else - { - ec = nano::error_common::account_not_found_wallet; - } } response_errors (); } @@ -3567,15 +3582,12 @@ void rai::rpc_handler::work_set () if (!ec) { auto transaction (node.store.tx_begin_write ()); - if (wallet->store.find (transaction, account) != wallet->store.end ()) + wallet_account_impl (transaction, wallet, account); + if (!ec) { wallet->store.work_put (transaction, account, work); response_l.put ("success", ""); } - else - { - ec = nano::error_common::account_not_found_wallet; - } } response_errors (); } @@ -4064,9 +4076,13 @@ void rai::rpc_handler::process_request () { send (); } - else if (action == "sign") + else if (action == "sign_block") + { + sign_block (); + } + else if (action == "sign_hash") { - sign (); + sign_hash (); } else if (action == "stats") { diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 57e35f9219..7ac48b1eca 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -182,7 +183,8 @@ class rpc_handler : public std::enable_shared_from_this void search_pending (); void search_pending_all (); void send (); - void sign (); + void sign_block (); + void sign_hash (); void stats (); void stop (); void unchecked (); @@ -227,6 +229,8 @@ class rpc_handler : public std::enable_shared_from_this std::error_code ec; boost::property_tree::ptree response_l; std::shared_ptr wallet_impl (); + bool wallet_locked_impl (rai::transaction const &, std::shared_ptr); + bool wallet_account_impl (rai::transaction const &, std::shared_ptr, rai::account const &); rai::account account_impl (std::string = ""); rai::amount amount_impl (); std::shared_ptr block_impl (); From 81d5160cb9531396e661252a595c830607236f85 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 06:26:03 +0300 Subject: [PATCH 07/20] Headers order --- rai/node/rpc.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index 7ac48b1eca..d38eb9d452 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -5,10 +5,10 @@ #include #include #include -#include +#include #include +#include #include -#include namespace rai { From 8191ef8ea05f3c116208ba5804517db414820313 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 27 Sep 2018 06:34:05 +0300 Subject: [PATCH 08/20] Allow blocks w/o signature & hash in RPC block_hash --- rai/node/rpc.cpp | 9 +++++++-- rai/node/rpc.hpp | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 2dd6aaeeed..04c9bc46cb 100644 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -307,7 +307,7 @@ rai::amount rai::rpc_handler::amount_impl () return result; } -std::shared_ptr rai::rpc_handler::block_impl () +std::shared_ptr rai::rpc_handler::block_impl (bool signature_work_required) { std::shared_ptr result; if (!ec) @@ -316,6 +316,11 @@ std::shared_ptr rai::rpc_handler::block_impl () boost::property_tree::ptree block_l; std::stringstream block_stream (block_text); boost::property_tree::read_json (block_stream, block_l); + if (!signature_work_required) + { + block_l.put ("signature", "0"); + block_l.put ("work", "0"); + } result = rai::deserialize_block_json (block_l); if (result == nullptr) { @@ -1318,7 +1323,7 @@ void rai::rpc_handler::block_create () void rai::rpc_handler::block_hash () { - auto block (block_impl ()); + auto block (block_impl (false)); if (!ec) { response_l.put ("hash", block->hash ().to_string ()); diff --git a/rai/node/rpc.hpp b/rai/node/rpc.hpp index d38eb9d452..d2669f8b04 100644 --- a/rai/node/rpc.hpp +++ b/rai/node/rpc.hpp @@ -233,7 +233,7 @@ class rpc_handler : public std::enable_shared_from_this bool wallet_account_impl (rai::transaction const &, std::shared_ptr, rai::account const &); rai::account account_impl (std::string = ""); rai::amount amount_impl (); - std::shared_ptr block_impl (); + std::shared_ptr block_impl (bool = true); rai::block_hash hash_impl (std::string = "hash"); rai::amount threshold_optional_impl (); uint64_t work_optional_impl (); From 7d2624b6bf8cfbaa549fe49570133e67f6b9a5c6 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 30 Nov 2018 17:41:50 +0300 Subject: [PATCH 09/20] Prepare for master merge --- rai/core_test/rpc.cpp | 58 ------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 2e5badb39b..8a4c9c99ed 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3714,61 +3714,3 @@ TEST (rpc, block_confirm_absent) ASSERT_EQ (200, response.status); ASSERT_EQ ("Block not found", response.json.get ("error")); } - -TEST (rpc, sign_hash) -{ - rai::system system (24000, 1); - rai::keypair key; - auto & node1 (*system.nodes[0]); - rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); - rai::rpc rpc (system.service, node1, rai::rpc_config (true)); - rpc.start (); - boost::property_tree::ptree request; - request.put ("action", "sign_hash"); - request.put ("hash", send.hash ().to_string ()); - request.put ("key", key.prv.data.to_string ()); - test_response response (request, rpc, system.service); - while (response.status == 0) - { - system.poll (); - } - ASSERT_EQ (200, response.status); - rai::signature signature; - std::string signature_text (response.json.get ("signature")); - ASSERT_FALSE (signature.decode_hex (signature_text)); - ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), signature)); -} - -TEST (rpc, sign_block) -{ - rai::system system (24000, 1); - rai::keypair key; - auto & node1 (*system.nodes[0]); - rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); - rai::rpc rpc (system.service, node1, rai::rpc_config (true)); - rpc.start (); - boost::property_tree::ptree request; - request.put ("action", "sign_block"); - system.wallet (0)->insert_adhoc (key.prv); - std::string wallet; - system.nodes[0]->wallets.items.begin ()->first.encode_hex (wallet); - request.put ("wallet", wallet); - request.put ("account", key.pub.to_account ()); - std::string json; - send.serialize_json (json); - request.put ("block", json); - test_response response (request, rpc, system.service); - while (response.status == 0) - { - system.poll (); - } - ASSERT_EQ (200, response.status); - auto contents (response.json.get ("block")); - boost::property_tree::ptree block_l; - std::stringstream block_stream (contents); - boost::property_tree::read_json (block_stream, block_l); - auto block (rai::deserialize_block_json (block_l)); - ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), block->block_signature ())); - ASSERT_NE (block->block_signature (), send.block_signature ()); - ASSERT_EQ (block->hash (), send.hash ()); -} From fd0c087b91c88eda27fc177057e4bff967ed2899 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 30 Nov 2018 17:42:41 +0300 Subject: [PATCH 10/20] Test for RPC sign --- rai/core_test/rpc.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 6a83734ad6..5b77f160f9 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3936,3 +3936,62 @@ TEST (rpc, node_id_delete) rai::keypair node_id (system.nodes[0]->store.get_node_id (transaction)); ASSERT_NE (node_id.pub.to_string (), system.nodes[0]->node_id.pub.to_string ()); } + +TEST (rpc, sign_hash) +{ + rai::system system (24000, 1); + rai::keypair key; + auto & node1 (*system.nodes[0]); + rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "sign_hash"); + request.put ("hash", send.hash ().to_string ()); + request.put ("key", key.prv.data.to_string ()); + test_response response (request, rpc, system.service); + while (response.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response.status); + rai::signature signature; + std::string signature_text (response.json.get ("signature")); + ASSERT_FALSE (signature.decode_hex (signature_text)); + ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), signature)); +} + +TEST (rpc, sign_block) +{ + rai::system system (24000, 1); + rai::keypair key; + auto & node1 (*system.nodes[0]); + rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rpc.start (); + boost::property_tree::ptree request; + request.put ("action", "sign_block"); + system.wallet (0)->insert_adhoc (key.prv); + std::string wallet; + system.nodes[0]->wallets.items.begin ()->first.encode_hex (wallet); + request.put ("wallet", wallet); + request.put ("account", key.pub.to_account ()); + std::string json; + send.serialize_json (json); + request.put ("block", json); + test_response response (request, rpc, system.service); + while (response.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response.status); + auto contents (response.json.get ("block")); + boost::property_tree::ptree block_l; + std::stringstream block_stream (contents); + boost::property_tree::read_json (block_stream, block_l); + auto block (rai::deserialize_block_json (block_l)); + ASSERT_FALSE (rai::validate_message (key.pub, send.hash (), block->block_signature ())); + ASSERT_NE (block->block_signature (), send.block_signature ()); + ASSERT_EQ (block->hash (), send.hash ()); +} + From f2cf3765ebd141341601bb22e2b04f8087d4c24b Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 28 Dec 2018 13:46:28 +0300 Subject: [PATCH 11/20] Formatting --- rai/core_test/rpc.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 5635f08393..6b033efa7d 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3994,4 +3994,3 @@ TEST (rpc, sign_block) ASSERT_NE (block->block_signature (), send.block_signature ()); ASSERT_EQ (block->hash (), send.hash ()); } - From de0e68654c41f2eb6138032afcef0565723a818f Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 28 Dec 2018 13:48:32 +0300 Subject: [PATCH 12/20] system.io_ctx --- rai/core_test/rpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index 6b033efa7d..f9dc92f955 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -3943,7 +3943,7 @@ TEST (rpc, sign_hash) rai::keypair key; auto & node1 (*system.nodes[0]); rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); - rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rai::rpc rpc (system.io_ctx, node1, rai::rpc_config (true)); rpc.start (); boost::property_tree::ptree request; request.put ("action", "sign_hash"); @@ -3967,7 +3967,7 @@ TEST (rpc, sign_block) rai::keypair key; auto & node1 (*system.nodes[0]); rai::state_block send (rai::genesis_account, node1.latest (rai::test_genesis_key.pub), rai::genesis_account, rai::genesis_amount - rai::Gxrb_ratio, key.pub, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); - rai::rpc rpc (system.service, node1, rai::rpc_config (true)); + rai::rpc rpc (system.io_ctx, node1, rai::rpc_config (true)); rpc.start (); boost::property_tree::ptree request; request.put ("action", "sign_block"); From 6eccccbc1622489e334a64ad7c02184fad4d2728 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Sat, 29 Dec 2018 16:13:04 +0300 Subject: [PATCH 13/20] Update test_response --- nano/core_test/rpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nano/core_test/rpc.cpp b/nano/core_test/rpc.cpp index 13f04ee50e..f235646482 100644 --- a/nano/core_test/rpc.cpp +++ b/nano/core_test/rpc.cpp @@ -3949,7 +3949,7 @@ TEST (rpc, sign_hash) request.put ("action", "sign_hash"); request.put ("hash", send.hash ().to_string ()); request.put ("key", key.prv.data.to_string ()); - test_response response (request, rpc, system.service); + test_response response (request, rpc, system.io_ctx); while (response.status == 0) { system.poll (); @@ -3979,7 +3979,7 @@ TEST (rpc, sign_block) std::string json; send.serialize_json (json); request.put ("block", json); - test_response response (request, rpc, system.service); + test_response response (request, rpc, system.io_ctx); while (response.status == 0) { system.poll (); From 5db35e7efb457a376016af1f364eae6c003ea9dd Mon Sep 17 00:00:00 2001 From: SergiySW Date: Wed, 16 Jan 2019 19:44:50 +0300 Subject: [PATCH 14/20] Unified RPC "sign" --- nano/node/rpc.cpp | 90 +++++++++++++++-------------------------------- nano/node/rpc.hpp | 3 +- 2 files changed, 29 insertions(+), 64 deletions(-) diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index e125d96061..0512f85e2d 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -2912,63 +2912,30 @@ void nano::rpc_handler::send () } } -void nano::rpc_handler::sign_hash () +void nano::rpc_handler::sign () { // Retrieving hash - auto hash (hash_impl ()); - if (!ec) + nano::block_hash hash (0); + boost::optional hash_text (request.get_optional ("hash")); + if (hash_text.is_initialized ()) { - nano::raw_key prv; - prv.data.clear (); - // Retrieving private key from request - boost::optional key_text (request.get_optional ("key")); - if (key_text.is_initialized ()) - { - if (prv.data.decode_hex (key_text.get ())) - { - ec = nano::error_common::bad_private_key; - } - } - else - { - // Retrieving private key from wallet - boost::optional account_text (request.get_optional ("account")); - boost::optional wallet_text (request.get_optional ("wallet")); - if (wallet_text.is_initialized () && account_text.is_initialized ()) - { - auto account (account_impl ()); - auto wallet (wallet_impl ()); - if (!ec) - { - auto transaction (node.store.tx_begin_read ()); - wallet_locked_impl (transaction, wallet); - wallet_account_impl (transaction, wallet, account); - if (!ec) - { - wallet->store.fetch (transaction, account, prv); - } - } - } - } - // Signing - if (prv.data != 0) - { - nano::public_key pub (nano::pub_key (prv.data)); - nano::signature signature (nano::sign_message (prv, pub, hash)); - response_l.put ("signature", signature.to_string ()); - } - else + hash = hash_impl (); + } + // Retrieving block + std::shared_ptr block; + boost::optional block_text (request.get_optional ("block")); + if (!ec && block_text.is_initialized ()) + { + block = block_impl (); + if (block != nullptr) { - ec = nano::error_rpc::block_create_key_required; + hash = block->hash (); } } - response_errors (); -} - -void nano::rpc_handler::sign_block () -{ - // Retrieving block - auto block (block_impl ()); + if (!ec && hash.is_zero ()) + { + ec = nano::error_blocks::invalid_block; + } if (!ec) { nano::raw_key prv; @@ -3007,12 +2974,15 @@ void nano::rpc_handler::sign_block () if (prv.data != 0) { nano::public_key pub (nano::pub_key (prv.data)); - nano::signature signature (nano::sign_message (prv, pub, block->hash ())); - block->signature_set (signature); - std::string contents; - block->serialize_json (contents); - response_l.put ("block", contents); + nano::signature signature (nano::sign_message (prv, pub, hash)); response_l.put ("signature", signature.to_string ()); + if (block != nullptr) + { + block->signature_set (signature); + std::string contents; + block->serialize_json (contents); + response_l.put ("block", contents); + } } else { @@ -4282,13 +4252,9 @@ void nano::rpc_handler::process_request () { send (); } - else if (action == "sign_block") - { - sign_block (); - } - else if (action == "sign_hash") + else if (action == "sign") { - sign_hash (); + sign (); } else if (action == "stats") { diff --git a/nano/node/rpc.hpp b/nano/node/rpc.hpp index 08615c8276..231bfb1e98 100644 --- a/nano/node/rpc.hpp +++ b/nano/node/rpc.hpp @@ -191,8 +191,7 @@ class rpc_handler : public std::enable_shared_from_this void search_pending (); void search_pending_all (); void send (); - void sign_block (); - void sign_hash (); + void sign (); void stats (); void stop (); void unchecked (); From 33f315dc43a08d2e2f2335103c39a4de1d6e3836 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 18 Jan 2019 02:14:24 +0300 Subject: [PATCH 15/20] Config option enable_sign_hash --- nano/core_test/rpc.cpp | 14 +++++++++++--- nano/lib/errors.cpp | 2 ++ nano/lib/errors.hpp | 1 + nano/node/rpc.cpp | 11 ++++++++++- nano/node/rpc.hpp | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/nano/core_test/rpc.cpp b/nano/core_test/rpc.cpp index 6f3c34c355..ed44dca687 100644 --- a/nano/core_test/rpc.cpp +++ b/nano/core_test/rpc.cpp @@ -4010,7 +4010,7 @@ TEST (rpc, sign_hash) nano::rpc rpc (system.io_ctx, node1, nano::rpc_config (true)); rpc.start (); boost::property_tree::ptree request; - request.put ("action", "sign_hash"); + request.put ("action", "sign"); request.put ("hash", send.hash ().to_string ()); request.put ("key", key.prv.data.to_string ()); test_response response (request, rpc, system.io_ctx); @@ -4019,8 +4019,16 @@ TEST (rpc, sign_hash) system.poll (); } ASSERT_EQ (200, response.status); + ASSERT_EQ (response.json.get ("error"), (nano::error_rpc::sign_hash_disabled).message ()); + rpc.config.enable_sign_hash = true; + test_response response2 (request, rpc, system.io_ctx); + while (response2.status == 0) + { + system.poll (); + } + ASSERT_EQ (200, response2.status); nano::signature signature; - std::string signature_text (response.json.get ("signature")); + std::string signature_text (response2.json.get ("signature")); ASSERT_FALSE (signature.decode_hex (signature_text)); ASSERT_FALSE (nano::validate_message (key.pub, send.hash (), signature)); } @@ -4034,7 +4042,7 @@ TEST (rpc, sign_block) nano::rpc rpc (system.io_ctx, node1, nano::rpc_config (true)); rpc.start (); boost::property_tree::ptree request; - request.put ("action", "sign_block"); + request.put ("action", "sign"); system.wallet (0)->insert_adhoc (key.prv); std::string wallet; system.nodes[0]->wallets.items.begin ()->first.encode_hex (wallet); diff --git a/nano/lib/errors.cpp b/nano/lib/errors.cpp index a714d7ac49..45904dd1ed 100644 --- a/nano/lib/errors.cpp +++ b/nano/lib/errors.cpp @@ -164,6 +164,8 @@ std::string nano::error_rpc_messages::message (int ev) const return "Unable to create transaction account"; case nano::error_rpc::rpc_control_disabled: return "RPC control is disabled"; + case nano::error_rpc::sign_hash_disabled: + return "Signing by block hash is disabled"; case nano::error_rpc::source_not_found: return "Source not found"; } diff --git a/nano/lib/errors.hpp b/nano/lib/errors.hpp index c1a59c12c1..5ee2bb7396 100644 --- a/nano/lib/errors.hpp +++ b/nano/lib/errors.hpp @@ -97,6 +97,7 @@ enum class error_rpc payment_account_balance, payment_unable_create_account, rpc_control_disabled, + sign_hash_disabled, source_not_found }; diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index e4d25b655f..989986faa5 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -55,7 +55,8 @@ port (nano::rpc::rpc_port), enable_control (enable_control_a), frontier_request_limit (16384), chain_request_limit (16384), -max_json_depth (20) +max_json_depth (20), +enable_sign_hash (false) { } @@ -67,6 +68,7 @@ nano::error nano::rpc_config::serialize_json (nano::jsonconfig & json) const json.put ("frontier_request_limit", frontier_request_limit); json.put ("chain_request_limit", chain_request_limit); json.put ("max_json_depth", max_json_depth); + json.put ("enable_sign_hash", enable_sign_hash); return json.get_error (); } @@ -84,6 +86,7 @@ nano::error nano::rpc_config::deserialize_json (nano::jsonconfig & json) json.get_optional ("frontier_request_limit", frontier_request_limit); json.get_optional ("chain_request_limit", chain_request_limit); json.get_optional ("max_json_depth", max_json_depth); + json.get_optional ("enable_sign_hash", enable_sign_hash); return json.get_error (); } @@ -2944,10 +2947,16 @@ void nano::rpc_handler::sign () hash = block->hash (); } } + // Hash or block are not initialized if (!ec && hash.is_zero ()) { ec = nano::error_blocks::invalid_block; } + // Hash is initialized without config permission + else if (!ec && !hash.is_zero && block == nullptr && !rpc.config.enable_sign_hash) + { + ec = nano::error_rpc::sign_hash_disabled; + } if (!ec) { nano::raw_key prv; diff --git a/nano/node/rpc.hpp b/nano/node/rpc.hpp index 231bfb1e98..03c804c042 100644 --- a/nano/node/rpc.hpp +++ b/nano/node/rpc.hpp @@ -53,6 +53,7 @@ class rpc_config uint64_t chain_request_limit; rpc_secure_config secure; uint8_t max_json_depth; + bool enable_sign_hash; }; enum class payment_status { From 7d5bb8800dd9fb8f422e0ddf1dec2ff9aa4a65bb Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 18 Jan 2019 02:22:21 +0300 Subject: [PATCH 16/20] Fix --- nano/core_test/rpc.cpp | 3 ++- nano/node/rpc.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nano/core_test/rpc.cpp b/nano/core_test/rpc.cpp index ed44dca687..f140f62054 100644 --- a/nano/core_test/rpc.cpp +++ b/nano/core_test/rpc.cpp @@ -4019,7 +4019,8 @@ TEST (rpc, sign_hash) system.poll (); } ASSERT_EQ (200, response.status); - ASSERT_EQ (response.json.get ("error"), (nano::error_rpc::sign_hash_disabled).message ()); + std::error_code ec (nano::error_rpc::sign_hash_disabled); + ASSERT_EQ (response.json.get ("error"), ec.message ()); rpc.config.enable_sign_hash = true; test_response response2 (request, rpc, system.io_ctx); while (response2.status == 0) diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index 989986faa5..5e5c714c87 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -2953,7 +2953,7 @@ void nano::rpc_handler::sign () ec = nano::error_blocks::invalid_block; } // Hash is initialized without config permission - else if (!ec && !hash.is_zero && block == nullptr && !rpc.config.enable_sign_hash) + else if (!ec && !hash.is_zero () && block == nullptr && !rpc.config.enable_sign_hash) { ec = nano::error_rpc::sign_hash_disabled; } From 63ffc868582f1f8a4fad7ef59a7944fa8c5c4ffd Mon Sep 17 00:00:00 2001 From: SergiySW Date: Fri, 18 Jan 2019 04:25:16 +0300 Subject: [PATCH 17/20] Formatting --- nano/node/rpc.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nano/node/rpc.hpp b/nano/node/rpc.hpp index 03c804c042..cfd8d94143 100644 --- a/nano/node/rpc.hpp +++ b/nano/node/rpc.hpp @@ -8,8 +8,8 @@ #include #include #include -#include #include +#include #include namespace nano From 897fab1914ac165a83b0bb1e1a9989d0d6a052bf Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 24 Jan 2019 17:25:03 +0300 Subject: [PATCH 18/20] Fix rpc_config --- nano/node/rpc.cpp | 10 ---------- nano/node/rpc.hpp | 3 +-- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index 86f86483de..dc3790d9de 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -39,16 +39,6 @@ nano::error nano::rpc_secure_config::deserialize_json (nano::jsonconfig & json) return json.get_error (); } -nano::rpc_config::rpc_config () : -address (boost::asio::ip::address_v6::loopback ()), -port (nano::rpc::rpc_port), -enable_control (false), -frontier_request_limit (16384), -chain_request_limit (16384), -max_json_depth (20) -{ -} - nano::rpc_config::rpc_config (bool enable_control_a) : address (boost::asio::ip::address_v6::loopback ()), port (nano::rpc::rpc_port), diff --git a/nano/node/rpc.hpp b/nano/node/rpc.hpp index 1dd1bb5d9c..2e80fbd1d2 100644 --- a/nano/node/rpc.hpp +++ b/nano/node/rpc.hpp @@ -42,8 +42,7 @@ class rpc_secure_config class rpc_config { public: - rpc_config (); - rpc_config (bool); + rpc_config (bool = false); nano::error serialize_json (nano::jsonconfig &) const; nano::error deserialize_json (nano::jsonconfig &); boost::asio::ip::address_v6 address; From 704fa660b93b5474e4c8ed6826b7656563a147b7 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Thu, 24 Jan 2019 17:44:41 +0300 Subject: [PATCH 19/20] explicitly set signature_work_required value for block_impl () For better code readability --- nano/node/rpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index dc3790d9de..9460f67716 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -2430,7 +2430,7 @@ void nano::rpc_handler::payment_wait () void nano::rpc_handler::process () { - auto block (block_impl ()); + auto block (block_impl (true)); if (!ec) { if (!nano::work_validate (*block)) @@ -2963,7 +2963,7 @@ void nano::rpc_handler::sign () boost::optional block_text (request.get_optional ("block")); if (!ec && block_text.is_initialized ()) { - block = block_impl (); + block = block_impl (true); if (block != nullptr) { hash = block->hash (); From 68ea895759c6a90013ef5f9e47cb0eafe44eec2f Mon Sep 17 00:00:00 2001 From: SergiySW Date: Sun, 27 Jan 2019 23:10:05 +0300 Subject: [PATCH 20/20] Fix transactions --- nano/node/rpc.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/nano/node/rpc.cpp b/nano/node/rpc.cpp index 0c620d542c..89effed109 100644 --- a/nano/node/rpc.cpp +++ b/nano/node/rpc.cpp @@ -668,12 +668,13 @@ void nano::rpc_handler::account_representative_set () auto work (work_optional_impl ()); if (!ec && work) { - auto transaction (node.store.tx_begin_write ()); + auto transaction (node.wallets.tx_begin_write ()); wallet_locked_impl (transaction, wallet); if (!ec) { nano::account_info info; - if (!node.store.account_get (transaction, account, info)) + auto block_transaction (node.store.tx_begin_read ()); + if (!node.store.account_get (block_transaction, account, info)) { if (nano::work_validate (info.head, work)) { @@ -2538,22 +2539,23 @@ void nano::rpc_handler::receive () auto hash (hash_impl ("block")); if (!ec) { - auto transaction (node.store.tx_begin_read ()); + auto transaction (node.wallets.tx_begin_read ()); wallet_locked_impl (transaction, wallet); wallet_account_impl (transaction, wallet, account); if (!ec) { - auto block (node.store.block_get (transaction, hash)); + auto block_transaction (node.store.tx_begin_read ()); + auto block (node.store.block_get (block_transaction, hash)); if (block != nullptr) { - if (node.store.pending_exists (transaction, nano::pending_key (account, hash))) + if (node.store.pending_exists (block_transaction, nano::pending_key (account, hash))) { auto work (work_optional_impl ()); if (!ec && work) { nano::account_info info; nano::uint256_union head; - if (!node.store.account_get (transaction, account, info)) + if (!node.store.account_get (block_transaction, account, info)) { head = info.head; } @@ -3013,7 +3015,7 @@ void nano::rpc_handler::sign () auto wallet (wallet_impl ()); if (!ec) { - auto transaction (node.store.tx_begin_read ()); + auto transaction (node.wallets.tx_begin_read ()); wallet_locked_impl (transaction, wallet); wallet_account_impl (transaction, wallet, account); if (!ec)