diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index d4c472f9..a396e717 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -631,18 +631,18 @@ TEST (node, block_replace) { rai::system system (24000, 2); system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv); - ASSERT_NE (nullptr, system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, 1000)); - std::unique_ptr block1; - { - rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); - block1 = system.nodes [0]->store.block_get (transaction, system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub)); - } - ASSERT_NE (nullptr, block1); + auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio)); + auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio)); + 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)) { system.nodes [1]->generate_work (*block1); } + { + 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, 0); auto iterations1 (0); std::unique_ptr block2; @@ -652,12 +652,16 @@ TEST (node, block_replace) ++iterations1; ASSERT_LT (iterations1, 200); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); - auto block (system.nodes [0]->store.block_get (transaction, system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub))); + auto block (system.nodes [0]->store.block_get (transaction, block1->hash ())); if (block->block_work () != initial_work) { block2 = std::move (block); } } + { + rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); + ASSERT_EQ (block3->hash (), system.nodes [0]->store.block_successor(transaction, block1->hash ())); + } ASSERT_NE (initial_work, block1->block_work ()); ASSERT_EQ (block1->block_work (), block2->block_work ()); ASSERT_GT (system.work.work_value (block2->root (), block2->block_work ()), system.work.work_value (block1->root (), initial_work)); diff --git a/rai/node/node.cpp b/rai/node/node.cpp index b0739f60..8c37476f 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1303,7 +1303,7 @@ rai::process_return rai::node::process_receive_one (MDB_txn * transaction_a, rai // Replace block with one that has higher work value if (work.work_value (root, block_a.block_work ()) > work.work_value (root, existing->block_work ())) { - store.block_put (transaction_a, hash, block_a); + store.block_put (transaction_a, hash, block_a, store.block_successor (transaction_a, hash)); } } else diff --git a/rai/secure.cpp b/rai/secure.cpp index b20b6f8c..1543e2dd 100644 --- a/rai/secure.cpp +++ b/rai/secure.cpp @@ -1773,14 +1773,14 @@ void rai::block_store::block_put_raw (MDB_txn * transaction_a, MDB_dbi database_ assert (status2 == 0); } -void rai::block_store::block_put (MDB_txn * transaction_a, rai::block_hash const & hash_a, rai::block const & block_a) +void rai::block_store::block_put (MDB_txn * transaction_a, rai::block_hash const & hash_a, rai::block const & block_a, rai::block_hash const & successor_a) { + assert (successor_a.is_zero () || block_exists (transaction_a, successor_a)); std::vector vector; { rai::vectorstream stream (vector); block_a.serialize (stream); - rai::block_hash successor (0); - rai::write (stream, successor.bytes); + rai::write (stream, successor_a.bytes); } block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()}); set_predecessor predecessor (transaction_a, *this); diff --git a/rai/secure.hpp b/rai/secure.hpp index 0b538e60..e710c442 100644 --- a/rai/secure.hpp +++ b/rai/secure.hpp @@ -324,7 +324,7 @@ public: MDB_dbi block_database (rai::block_type); void block_put_raw (MDB_txn *, MDB_dbi, rai::block_hash const &, MDB_val); - void block_put (MDB_txn *, rai::block_hash const &, rai::block const &); + void block_put (MDB_txn *, rai::block_hash const &, rai::block const &, rai::block_hash const & = rai::block_hash (0)); MDB_val block_get_raw (MDB_txn *, rai::block_hash const &, rai::block_type &); rai::block_hash block_successor (MDB_txn *, rai::block_hash const &); void block_successor_clear (MDB_txn *, rai::block_hash const &);