mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Tighten requirements for adding elements to setBlockIndexCandidates
When using assumeutxo, we only need the background chainstate to consider blocks that are on the chain leading to the snapshotted block. Note that this introduces the new invariant that we can only have an assumeutxo snapshot where the snapshotted blockhash is in our block index. Unknown block hashes that are somehow passed in will cause assertion failures when processing new blocks. Includes test fixes and improvements by Andrew Chow and Fabian Jahr.
This commit is contained in:
@@ -77,6 +77,13 @@ BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
|
||||
// After adding some blocks to the tip, best block should have changed.
|
||||
BOOST_CHECK(::g_best_block != curr_tip);
|
||||
|
||||
// Grab block 1 from disk; we'll add it to the background chain later.
|
||||
std::shared_ptr<CBlock> pblockone = std::make_shared<CBlock>();
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
chainman.m_blockman.ReadBlockFromDisk(*pblockone, *chainman.ActiveChain()[1]);
|
||||
}
|
||||
|
||||
BOOST_REQUIRE(CreateAndActivateUTXOSnapshot(
|
||||
this, NoMalleation, /*reset_chainstate=*/ true));
|
||||
|
||||
@@ -104,11 +111,7 @@ BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
|
||||
assert(false);
|
||||
}()};
|
||||
|
||||
// Create a block to append to the validation chain.
|
||||
std::vector<CMutableTransaction> noTxns;
|
||||
CScript scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
||||
CBlock validation_block = this->CreateBlock(noTxns, scriptPubKey, background_cs);
|
||||
auto pblock = std::make_shared<const CBlock>(validation_block);
|
||||
// Append the first block to the background chain.
|
||||
BlockValidationState state;
|
||||
CBlockIndex* pindex = nullptr;
|
||||
const CChainParams& chainparams = Params();
|
||||
@@ -118,18 +121,18 @@ BOOST_FIXTURE_TEST_CASE(chainstate_update_tip, TestChain100Setup)
|
||||
// once it is changed to support multiple chainstates.
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
bool checked = CheckBlock(*pblock, state, chainparams.GetConsensus());
|
||||
bool checked = CheckBlock(*pblockone, state, chainparams.GetConsensus());
|
||||
BOOST_CHECK(checked);
|
||||
bool accepted = chainman.AcceptBlock(
|
||||
pblock, state, &pindex, true, nullptr, &newblock, true);
|
||||
pblockone, state, &pindex, true, nullptr, &newblock, true);
|
||||
BOOST_CHECK(accepted);
|
||||
}
|
||||
|
||||
// UpdateTip is called here
|
||||
bool block_added = background_cs.ActivateBestChain(state, pblock);
|
||||
bool block_added = background_cs.ActivateBestChain(state, pblockone);
|
||||
|
||||
// Ensure tip is as expected
|
||||
BOOST_CHECK_EQUAL(background_cs.m_chain.Tip()->GetBlockHash(), validation_block.GetHash());
|
||||
BOOST_CHECK_EQUAL(background_cs.m_chain.Tip()->GetBlockHash(), pblockone->GetHash());
|
||||
|
||||
// g_best_block should be unchanged after adding a block to the background
|
||||
// validation chain.
|
||||
|
||||
Reference in New Issue
Block a user