Fix epoch block fork process_result

This commit is contained in:
Lee Bousfield 2018-07-31 20:02:48 -06:00 committed by clemahieu
commit 4b546c6d88
2 changed files with 35 additions and 6 deletions

View file

@ -2344,3 +2344,21 @@ TEST (ledger, epoch_blocks_receive_upgrade)
rai::open_block open2 (send3.hash (), destination2.pub, destination2.pub, destination2.prv, destination2.pub, 0);
ASSERT_EQ (rai::process_result::unreceivable, ledger.process (transaction, open2).code);
}
TEST (ledger, epoch_blocks_fork)
{
bool init (false);
rai::block_store store (init, rai::unique_path ());
ASSERT_TRUE (!init);
rai::stat stats;
rai::keypair epoch_key;
rai::ledger ledger (store, stats, 123, epoch_key.pub);
rai::genesis genesis;
rai::transaction transaction (store.environment, nullptr, true);
genesis.initialize (transaction, store);
rai::keypair destination;
rai::send_block send1 (genesis.hash (), rai::account (0), rai::genesis_amount, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0);
ASSERT_EQ (rai::process_result::progress, ledger.process (transaction, send1).code);
rai::state_block epoch1 (rai::genesis_account, genesis.hash (), rai::genesis_account, rai::genesis_amount, 123, epoch_key.prv, epoch_key.pub, 0);
ASSERT_EQ (rai::process_result::fork, ledger.process (transaction, epoch1).code);
}

View file

@ -181,16 +181,27 @@ public:
void ledger_processor::state_block (rai::state_block const & block_a)
{
result.code = rai::process_result::progress;
// Check if this is an epoch block
rai::account_info info;
ledger.store.account_get (transaction, block_a.hashables.account, info);
if (block_a.hashables.balance == info.balance && !ledger.epoch_link.is_zero () && block_a.hashables.link == ledger.epoch_link)
rai::amount prev_balance (0);
if (!block_a.hashables.previous.is_zero ())
{
epoch_block_impl (block_a);
result.code = ledger.store.block_exists (transaction, block_a.hashables.previous) ? rai::process_result::progress : rai::process_result::gap_previous;
if (result.code == rai::process_result::progress)
{
prev_balance = ledger.balance (transaction, block_a.hashables.previous);
}
}
else
if (result.code == rai::process_result::progress)
{
state_block_impl (block_a);
if (block_a.hashables.balance == prev_balance && !ledger.epoch_link.is_zero () && block_a.hashables.link == ledger.epoch_link)
{
epoch_block_impl (block_a);
}
else
{
state_block_impl (block_a);
}
}
}