diff --git a/rai/core_test/ledger.cpp b/rai/core_test/ledger.cpp index 9fe8e36c..20d0c515 100644 --- a/rai/core_test/ledger.cpp +++ b/rai/core_test/ledger.cpp @@ -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); +} diff --git a/rai/secure/ledger.cpp b/rai/secure/ledger.cpp index 239d99e8..81ad22f9 100644 --- a/rai/secure/ledger.cpp +++ b/rai/secure/ledger.cpp @@ -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); + } } }