Updating work on a block was clobbering the successor which would break ledger::account
This commit is contained in:
parent
13cc71b9a2
commit
b2b0b9b2e2
4 changed files with 17 additions and 13 deletions
|
@ -631,18 +631,18 @@ TEST (node, block_replace)
|
||||||
{
|
{
|
||||||
rai::system system (24000, 2);
|
rai::system system (24000, 2);
|
||||||
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
|
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));
|
auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
|
||||||
std::unique_ptr <rai::block> block1;
|
auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
|
||||||
{
|
ASSERT_NE (nullptr, 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 initial_work (block1->block_work ());
|
auto initial_work (block1->block_work ());
|
||||||
while (system.work.work_value (block1->root (), block1->block_work ()) <= system.work.work_value (block1->root (), initial_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);
|
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);
|
system.nodes [1]->network.republish_block (*block1, 0);
|
||||||
auto iterations1 (0);
|
auto iterations1 (0);
|
||||||
std::unique_ptr <rai::block> block2;
|
std::unique_ptr <rai::block> block2;
|
||||||
|
@ -652,12 +652,16 @@ TEST (node, block_replace)
|
||||||
++iterations1;
|
++iterations1;
|
||||||
ASSERT_LT (iterations1, 200);
|
ASSERT_LT (iterations1, 200);
|
||||||
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
|
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)
|
if (block->block_work () != initial_work)
|
||||||
{
|
{
|
||||||
block2 = std::move (block);
|
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_NE (initial_work, block1->block_work ());
|
||||||
ASSERT_EQ (block1->block_work (), block2->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));
|
ASSERT_GT (system.work.work_value (block2->root (), block2->block_work ()), system.work.work_value (block1->root (), initial_work));
|
||||||
|
|
|
@ -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
|
// 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 ()))
|
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
|
else
|
||||||
|
|
|
@ -1773,14 +1773,14 @@ void rai::block_store::block_put_raw (MDB_txn * transaction_a, MDB_dbi database_
|
||||||
assert (status2 == 0);
|
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 <uint8_t> vector;
|
std::vector <uint8_t> vector;
|
||||||
{
|
{
|
||||||
rai::vectorstream stream (vector);
|
rai::vectorstream stream (vector);
|
||||||
block_a.serialize (stream);
|
block_a.serialize (stream);
|
||||||
rai::block_hash successor (0);
|
rai::write (stream, successor_a.bytes);
|
||||||
rai::write (stream, successor.bytes);
|
|
||||||
}
|
}
|
||||||
block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()});
|
block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()});
|
||||||
set_predecessor predecessor (transaction_a, *this);
|
set_predecessor predecessor (transaction_a, *this);
|
||||||
|
|
|
@ -324,7 +324,7 @@ public:
|
||||||
|
|
||||||
MDB_dbi block_database (rai::block_type);
|
MDB_dbi block_database (rai::block_type);
|
||||||
void block_put_raw (MDB_txn *, MDB_dbi, rai::block_hash const &, MDB_val);
|
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 &);
|
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 &);
|
rai::block_hash block_successor (MDB_txn *, rai::block_hash const &);
|
||||||
void block_successor_clear (MDB_txn *, rai::block_hash const &);
|
void block_successor_clear (MDB_txn *, rai::block_hash const &);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue