From 9e6fc0973f30ab2ae2baa914b92cf568d83f4ea7 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Wed, 23 Aug 2017 11:27:57 +0300 Subject: [PATCH] Fix republish_block transaction --- rai/core_test/network.cpp | 14 ++++++++------ rai/core_test/node.cpp | 11 ++++++++--- rai/node/node.cpp | 23 ++++++++++++----------- rai/node/node.hpp | 2 +- rai/node/rpc.cpp | 8 ++++---- rai/qt/qt.cpp | 2 +- rai/slow_test/node.cpp | 3 ++- 7 files changed, 36 insertions(+), 27 deletions(-) diff --git a/rai/core_test/network.cpp b/rai/core_test/network.cpp index 125a369a..37e8cf65 100644 --- a/rai/core_test/network.cpp +++ b/rai/core_test/network.cpp @@ -149,9 +149,10 @@ TEST (network, send_discarded_publish) { rai::system system (24000, 2); auto block (std::make_shared (1, 1, 2, rai::keypair ().prv, 4, system.work.generate (1))); - system.nodes [0]->network.republish_block (block); + rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); + system.nodes [0]->network.republish_block (transaction, block); rai::genesis genesis; - ASSERT_EQ (genesis.hash (), system.nodes [0]->latest (rai::test_genesis_key.pub)); + ASSERT_EQ (genesis.hash (), system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (genesis.hash (), system.nodes [1]->latest (rai::test_genesis_key.pub)); auto iterations (0); while (system.nodes [1]->network.incoming.publish == 0) @@ -160,7 +161,7 @@ TEST (network, send_discarded_publish) ++iterations; ASSERT_LT (iterations, 200); } - ASSERT_EQ (genesis.hash (), system.nodes [0]->latest (rai::test_genesis_key.pub)); + ASSERT_EQ (genesis.hash (), system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (genesis.hash (), system.nodes [1]->latest (rai::test_genesis_key.pub)); } @@ -168,9 +169,10 @@ TEST (network, send_invalid_publish) { rai::system system (24000, 2); auto block (std::make_shared (1, 1, 20, rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (1))); - system.nodes [0]->network.republish_block (block); + rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); + system.nodes [0]->network.republish_block (transaction, block); rai::genesis genesis; - ASSERT_EQ (genesis.hash (), system.nodes [0]->latest (rai::test_genesis_key.pub)); + ASSERT_EQ (genesis.hash (), system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (genesis.hash (), system.nodes [1]->latest (rai::test_genesis_key.pub)); auto iterations (0); while (system.nodes [1]->network.incoming.publish == 0) @@ -179,7 +181,7 @@ TEST (network, send_invalid_publish) ++iterations; ASSERT_LT (iterations, 200); } - ASSERT_EQ (genesis.hash (), system.nodes [0]->latest (rai::test_genesis_key.pub)); + ASSERT_EQ (genesis.hash (), system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub)); ASSERT_EQ (genesis.hash (), system.nodes [1]->latest (rai::test_genesis_key.pub)); } diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index e602d6a5..dc126b6e 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -636,7 +636,8 @@ TEST (node, confirm_locked) system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv); system.wallet (0)->enter_password ("1"); auto block (std::make_shared (0, 0, 0, rai::keypair ().prv, 0, 0)); - system.nodes [0]->network.republish_block (block); + rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); + system.nodes [0]->network.republish_block (transaction, block); } TEST (node_config, random_rep) @@ -655,7 +656,7 @@ TEST (node, block_replace) system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv); auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Gxrb_ratio)); auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Gxrb_ratio)); - ASSERT_NE (nullptr, block1); + ASSERT_NE (nullptr, block1); auto initial_work (block1->block_work ()); while (system.work.work_value (block1->root (), block1->block_work ()) <= system.work.work_value (block1->root (), initial_work)) { @@ -665,7 +666,11 @@ TEST (node, block_replace) rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); ASSERT_EQ (block3->hash (), system.nodes [0]->store.block_successor (transaction, block1->hash ())); } - system.nodes [1]->network.republish_block (block1); + for (auto i (0); i < 1; ++i) + { + rai::transaction transaction_a (system.nodes [1]->store.environment, nullptr, false); + system.nodes [1]->network.republish_block (transaction_a, block1); + } auto iterations1 (0); std::unique_ptr block2; while (block2 == nullptr) diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 6fc25ecf..5cfb9a4e 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -165,16 +165,15 @@ void rai::network::rebroadcast_reps (std::shared_ptr block_a) } template -bool confirm_block (rai::node & node_a, T & list_a, std::shared_ptr block_a) +bool confirm_block (MDB_txn * transaction_a, rai::node & node_a, T & list_a, std::shared_ptr block_a) { bool result (false); if (node_a.config.enable_voting) { - rai::transaction transaction (node_a.store.environment, nullptr, false); - node_a.wallets.foreach_representative (transaction, [&result, &block_a, &list_a, &node_a, &transaction] (rai::public_key const & pub_a, rai::raw_key const & prv_a) + node_a.wallets.foreach_representative (transaction_a, [&result, &block_a, &list_a, &node_a, &transaction_a] (rai::public_key const & pub_a, rai::raw_key const & prv_a) { result = true; - auto sequence (node_a.store.sequence_atomic_inc (transaction, pub_a)); + auto sequence (node_a.store.sequence_atomic_inc (transaction_a, pub_a)); rai::vote vote (pub_a, prv_a, sequence, block_a); rai::confirm_ack confirm (vote); std::shared_ptr > bytes (new std::vector ); @@ -192,21 +191,21 @@ bool confirm_block (rai::node & node_a, T & list_a, std::shared_ptr } template <> -bool confirm_block (rai::node & node_a, rai::endpoint & peer_a, std::shared_ptr block_a) +bool confirm_block (MDB_txn * transaction_a, rai::node & node_a, rai::endpoint & peer_a, std::shared_ptr block_a) { std::array endpoints; endpoints [0] = peer_a; - auto result (confirm_block (node_a, endpoints, std::move (block_a))); + auto result (confirm_block (transaction_a, node_a, endpoints, std::move (block_a))); return result; } -void rai::network::republish_block (std::shared_ptr block) +void rai::network::republish_block (MDB_txn * transaction, std::shared_ptr block) { rebroadcast_reps (block); auto hash (block->hash ()); auto list (node.peers.list_sqrt ()); // If we're a representative, broadcast a signed confirm, otherwise an unsigned publish - if (!confirm_block (node, list, block)) + if (!confirm_block (transaction, node, list, block)) { rai::publish message (block); std::shared_ptr > bytes (new std::vector ); @@ -371,9 +370,10 @@ public: node.peers.contacted (sender, message_a.version_using); node.peers.insert (sender, message_a.version_using); node.process_receive_republish (message_a.block); - if (node.ledger.block_exists (message_a.block->hash ())) + rai::transaction transaction_a (node.store.environment, nullptr, false); + if (node.store.block_exists (transaction_a, message_a.block->hash ())) { - confirm_block (node, sender, message_a.block); + confirm_block (transaction_a, node, sender, message_a.block); } } void confirm_ack (rai::confirm_ack const & message_a) override @@ -2600,7 +2600,8 @@ void rai::election::broadcast_winner () rai::transaction transaction (node.store.environment, nullptr, true); compute_rep_votes (transaction); } - node.network.republish_block (last_winner); + rai::transaction transaction_a (node.store.environment, nullptr, false); + node.network.republish_block (transaction_a, last_winner); } rai::uint128_t rai::election::quorum_threshold (MDB_txn * transaction_a, rai::ledger & ledger_a) diff --git a/rai/node/node.hpp b/rai/node/node.hpp index 8031c9f9..d971cfd3 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -276,7 +276,7 @@ public: void rpc_action (boost::system::error_code const &, size_t); void rebroadcast_reps (std::shared_ptr ); void republish_vote (std::chrono::system_clock::time_point const &, rai::vote const &); - void republish_block (std::shared_ptr ); + void republish_block (MDB_txn *, std::shared_ptr ); void republish (rai::block_hash const &, std::shared_ptr >, rai::endpoint); void publish_broadcast (std::vector &, std::unique_ptr ); void confirm_send (rai::confirm_ack const &, std::shared_ptr >, rai::endpoint const &); diff --git a/rai/node/rpc.cpp b/rai/node/rpc.cpp index 0324434d..de0cde5b 100755 --- a/rai/node/rpc.cpp +++ b/rai/node/rpc.cpp @@ -2045,13 +2045,13 @@ void rai::rpc_handler::republish () for (auto & hash_l : hashes) { block_a = node.store.block_get (transaction, hash_l); - node.network.republish_block (std::move (block_a)); + node.network.republish_block (transaction, std::move (block_a)); boost::property_tree::ptree entry_l; entry_l.put ("", hash_l.to_string ()); blocks.push_back (std::make_pair ("", entry_l)); } } - node.network.republish_block (std::move (block)); // Republish block + node.network.republish_block (transaction, std::move (block)); // Republish block boost::property_tree::ptree entry; entry.put ("", hash.to_string ()); blocks.push_back (std::make_pair ("", entry)); @@ -2084,7 +2084,7 @@ void rai::rpc_handler::republish () for (auto & hash_l : hashes) { block_d = node.store.block_get (transaction, hash_l); - node.network.republish_block (std::move (block_d)); + node.network.republish_block (transaction, std::move (block_d)); boost::property_tree::ptree entry_l; entry_l.put ("", hash_l.to_string ()); blocks.push_back (std::make_pair ("", entry_l)); @@ -2927,7 +2927,7 @@ void rai::rpc_handler::wallet_republish () for (auto & hash : hashes) { block = node.store.block_get (transaction, hash); - node.network.republish_block (std::move (block));; + node.network.republish_block (transaction, std::move (block));; boost::property_tree::ptree entry; entry.put ("", hash.to_string ()); blocks.push_back (std::make_pair ("", entry)); diff --git a/rai/qt/qt.cpp b/rai/qt/qt.cpp index b99086a0..fd3078ec 100755 --- a/rai/qt/qt.cpp +++ b/rai/qt/qt.cpp @@ -629,7 +629,7 @@ void rai_qt::block_viewer::rebroadcast_action (rai::uint256_union const & hash_a auto block (wallet.node.store.block_get (transaction, hash_a)); if (block != nullptr) { - wallet.node.network.republish_block (std::move (block)); + wallet.node.network.republish_block (transaction, std::move (block)); auto successor (wallet.node.store.block_successor (transaction, hash_a)); if (!successor.is_zero ()) { diff --git a/rai/slow_test/node.cpp b/rai/slow_test/node.cpp index 0e7bc651..baba206f 100644 --- a/rai/slow_test/node.cpp +++ b/rai/slow_test/node.cpp @@ -193,7 +193,8 @@ TEST (node, fork_storm) system.nodes [i]->generate_work (*open); auto open_result (system.nodes [i]->process (*open)); ASSERT_EQ (rai::process_result::progress, open_result.code); - system.nodes [i]->network.republish_block (open); + rai::transaction transaction (system.nodes [i]->store.environment, nullptr, false); + system.nodes [i]->network.republish_block (transaction, open); } } auto again (true);