mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 15:19:07 +01:00
refactor: Add ChainstateManager::CurrentChainstate() method
CurrentChainstate() is basically the same as ActiveChainstate() except it requires cs_main to be locked when it is called, instead of locking cs_main internally. The name "current" should also be less confusing than "active" because multiple chainstates can be active, and CurrentChainstate() returns the chainstate targeting the current network tip, regardless of what chainstates are being downloaded or how they are used.
This commit is contained in:
@@ -3841,7 +3841,7 @@ void ChainstateManager::ReceivedBlockTransactions(const CBlock& block, CBlockInd
|
||||
// m_chain_tx_count value is not zero, assert that value is actually correct.
|
||||
auto prev_tx_sum = [](CBlockIndex& block) { return block.nTx + (block.pprev ? block.pprev->m_chain_tx_count : 0); };
|
||||
if (!Assume(pindexNew->m_chain_tx_count == 0 || pindexNew->m_chain_tx_count == prev_tx_sum(*pindexNew) ||
|
||||
pindexNew == GetSnapshotBaseBlock())) {
|
||||
pindexNew == CurrentChainstate().SnapshotBase())) {
|
||||
LogWarning("Internal bug detected: block %d has unexpected m_chain_tx_count %i that should be %i (%s %s). Please report this issue here: %s\n",
|
||||
pindexNew->nHeight, pindexNew->m_chain_tx_count, prev_tx_sum(*pindexNew), CLIENT_NAME, FormatFullVersion(), CLIENT_BUGREPORT);
|
||||
pindexNew->m_chain_tx_count = 0;
|
||||
@@ -4974,7 +4974,7 @@ bool ChainstateManager::LoadBlockIndex()
|
||||
// VALID_TRANSACTIONS (eg if we haven't yet downloaded the block),
|
||||
// so we special-case the snapshot block as a potential candidate
|
||||
// here.
|
||||
if (pindex == GetSnapshotBaseBlock() ||
|
||||
if (pindex == CurrentChainstate().SnapshotBase() ||
|
||||
(pindex->IsValid(BLOCK_VALID_TRANSACTIONS) &&
|
||||
(pindex->HaveNumChainTxs() || pindex->pprev == nullptr))) {
|
||||
|
||||
@@ -5263,7 +5263,7 @@ void ChainstateManager::CheckBlockIndex() const
|
||||
// to earlier blocks that have not been downloaded or validated yet, so
|
||||
// checks for later blocks can assume the earlier blocks were validated and
|
||||
// be stricter, testing for more requirements.
|
||||
const CBlockIndex* snap_base{GetSnapshotBaseBlock()};
|
||||
const CBlockIndex* snap_base{CurrentChainstate().SnapshotBase()};
|
||||
const CBlockIndex *snap_first_missing{}, *snap_first_notx{}, *snap_first_notv{}, *snap_first_nocv{}, *snap_first_nosv{};
|
||||
auto snap_update_firsts = [&] {
|
||||
if (pindex == snap_base) {
|
||||
@@ -6357,11 +6357,6 @@ ChainstateRole Chainstate::GetRole() const
|
||||
return m_target_blockhash ? ChainstateRole::BACKGROUND : m_assumeutxo == Assumeutxo::UNVALIDATED ? ChainstateRole::ASSUMEDVALID : ChainstateRole::NORMAL;
|
||||
}
|
||||
|
||||
const CBlockIndex* ChainstateManager::GetSnapshotBaseBlock() const
|
||||
{
|
||||
return m_active_chainstate ? m_active_chainstate->SnapshotBase() : nullptr;
|
||||
}
|
||||
|
||||
void ChainstateManager::RecalculateBestHeader()
|
||||
{
|
||||
AssertLockHeld(cs_main);
|
||||
|
||||
Reference in New Issue
Block a user