@@ -133,11 +133,6 @@ arith_uint256 nMinimumChainWork;
133133
134134CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
135135
136- // Internal stuff
137- namespace {
138- CBlockIndex* pindexBestInvalid = nullptr ;
139- } // namespace
140-
141136// Internal stuff from blockstorage ...
142137extern RecursiveMutex cs_LastBlockFile;
143138extern std::vector<CBlockFileInfo> vinfoBlockFile;
@@ -155,23 +150,24 @@ CBlockIndex* BlockManager::LookupBlockIndex(const uint256& hash) const
155150 return it == m_block_index.end () ? nullptr : it->second ;
156151}
157152
158- CBlockIndex* BlockManager ::FindForkInGlobalIndex (const CChain& chain, const CBlockLocator& locator)
153+ CBlockIndex* CChainState ::FindForkInGlobalIndex (const CBlockLocator& locator) const
159154{
160155 AssertLockHeld (cs_main);
161156
162157 // Find the latest block common to locator and chain - we expect that
163158 // locator.vHave is sorted descending by height.
164159 for (const uint256& hash : locator.vHave ) {
165- CBlockIndex* pindex = LookupBlockIndex (hash);
160+ CBlockIndex* pindex{m_blockman. LookupBlockIndex (hash)} ;
166161 if (pindex) {
167- if (chain .Contains (pindex))
162+ if (m_chain .Contains (pindex)) {
168163 return pindex;
169- if (pindex->GetAncestor (chain.Height ()) == chain.Tip ()) {
170- return chain.Tip ();
164+ }
165+ if (pindex->GetAncestor (m_chain.Height ()) == m_chain.Tip ()) {
166+ return m_chain.Tip ();
171167 }
172168 }
173169 }
174- return chain .Genesis ();
170+ return m_chain .Genesis ();
175171}
176172
177173bool CheckInputScripts (const CTransaction& tx, TxValidationState& state,
@@ -1478,7 +1474,7 @@ void CChainState::CheckForkWarningConditions()
14781474 return ;
14791475 }
14801476
1481- if (pindexBestInvalid && pindexBestInvalid ->nChainWork > m_chain.Tip ()->nChainWork + (GetBlockProof (*m_chain.Tip ()) * 6 )) {
1477+ if (m_chainman. m_best_invalid && m_chainman. m_best_invalid ->nChainWork > m_chain.Tip ()->nChainWork + (GetBlockProof (*m_chain.Tip ()) * 6 )) {
14821478 LogPrintf (" %s: Warning: Found invalid chain at least ~6 blocks longer than our best chain.\n Chain state database corruption likely.\n " , __func__);
14831479 SetfLargeWorkInvalidChainFound (true );
14841480 } else {
@@ -1489,8 +1485,9 @@ void CChainState::CheckForkWarningConditions()
14891485// Called both upon regular invalid block discovery *and* InvalidateBlock
14901486void CChainState::InvalidChainFound (CBlockIndex* pindexNew)
14911487{
1492- if (!pindexBestInvalid || pindexNew->nChainWork > pindexBestInvalid->nChainWork )
1493- pindexBestInvalid = pindexNew;
1488+ if (!m_chainman.m_best_invalid || pindexNew->nChainWork > m_chainman.m_best_invalid ->nChainWork ) {
1489+ m_chainman.m_best_invalid = pindexNew;
1490+ }
14941491 if (pindexBestHeader != nullptr && pindexBestHeader->GetAncestor (pindexNew->nHeight ) == pindexNew) {
14951492 pindexBestHeader = m_chain.Tip ();
14961493 }
@@ -1512,7 +1509,7 @@ void CChainState::InvalidBlockFound(CBlockIndex* pindex, const BlockValidationSt
15121509{
15131510 if (state.GetResult () != BlockValidationResult::BLOCK_MUTATED) {
15141511 pindex->nStatus |= BLOCK_FAILED_VALID;
1515- m_blockman .m_failed_blocks .insert (pindex);
1512+ m_chainman .m_failed_blocks .insert (pindex);
15161513 setDirtyBlockIndex.insert (pindex);
15171514 setBlockIndexCandidates.erase (pindex);
15181515 InvalidChainFound (pindex);
@@ -2653,8 +2650,9 @@ CBlockIndex* CChainState::FindMostWorkChain() {
26532650 bool fMissingData = !(pindexTest->nStatus & BLOCK_HAVE_DATA);
26542651 if (fFailedChain || fMissingData ) {
26552652 // Candidate chain is not usable (either invalid or missing data)
2656- if (fFailedChain && (pindexBestInvalid == nullptr || pindexNew->nChainWork > pindexBestInvalid->nChainWork ))
2657- pindexBestInvalid = pindexNew;
2653+ if (fFailedChain && (m_chainman.m_best_invalid == nullptr || pindexNew->nChainWork > m_chainman.m_best_invalid ->nChainWork )) {
2654+ m_chainman.m_best_invalid = pindexNew;
2655+ }
26582656 CBlockIndex *pindexFailed = pindexNew;
26592657 // Remove the entire chain from the set.
26602658 while (pindexTest != pindexFailed) {
@@ -3065,7 +3063,7 @@ bool CChainState::InvalidateBlock(BlockValidationState& state, CBlockIndex* pind
30653063 to_mark_failed->nStatus |= BLOCK_FAILED_VALID;
30663064 setDirtyBlockIndex.insert (to_mark_failed);
30673065 setBlockIndexCandidates.erase (to_mark_failed);
3068- m_blockman .m_failed_blocks .insert (to_mark_failed);
3066+ m_chainman .m_failed_blocks .insert (to_mark_failed);
30693067
30703068 // If any new blocks somehow arrived while we were disconnecting
30713069 // (above), then the pre-calculation of what should go into
@@ -3106,11 +3104,11 @@ void CChainState::ResetBlockFailureFlags(CBlockIndex *pindex) {
31063104 if (it->second ->IsValid (BLOCK_VALID_TRANSACTIONS) && it->second ->HaveTxsDownloaded () && setBlockIndexCandidates.value_comp ()(m_chain.Tip (), it->second )) {
31073105 setBlockIndexCandidates.insert (it->second );
31083106 }
3109- if (it->second == pindexBestInvalid ) {
3107+ if (it->second == m_chainman. m_best_invalid ) {
31103108 // Reset invalid block marker if it was pointing to one of those.
3111- pindexBestInvalid = nullptr ;
3109+ m_chainman. m_best_invalid = nullptr ;
31123110 }
3113- m_blockman .m_failed_blocks .erase (it->second );
3111+ m_chainman .m_failed_blocks .erase (it->second );
31143112 }
31153113 it++;
31163114 }
@@ -3120,7 +3118,7 @@ void CChainState::ResetBlockFailureFlags(CBlockIndex *pindex) {
31203118 if (pindex->nStatus & BLOCK_FAILED_MASK) {
31213119 pindex->nStatus &= ~BLOCK_FAILED_MASK;
31223120 setDirtyBlockIndex.insert (pindex);
3123- m_blockman .m_failed_blocks .erase (pindex);
3121+ m_chainman .m_failed_blocks .erase (pindex);
31243122 }
31253123 pindex = pindex->pprev ;
31263124 }
@@ -3481,14 +3479,14 @@ static bool ContextualCheckBlock(const CBlock& block, BlockValidationState& stat
34813479 return true ;
34823480}
34833481
3484- bool BlockManager ::AcceptBlockHeader (const CBlockHeader& block, BlockValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex)
3482+ bool ChainstateManager ::AcceptBlockHeader (const CBlockHeader& block, BlockValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex)
34853483{
34863484 AssertLockHeld (cs_main);
34873485 // Check for duplicate
34883486 uint256 hash = block.GetHash ();
3489- BlockMap::iterator miSelf = m_block_index.find (hash);
3487+ BlockMap::iterator miSelf{m_blockman. m_block_index .find (hash)} ;
34903488 if (hash != chainparams.GetConsensus ().hashGenesisBlock ) {
3491- if (miSelf != m_block_index.end ()) {
3489+ if (miSelf != m_blockman. m_block_index .end ()) {
34923490 // Block header is already known.
34933491 CBlockIndex* pindex = miSelf->second ;
34943492 if (ppindex)
@@ -3507,8 +3505,8 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, BlockValidationS
35073505
35083506 // Get prev block index
35093507 CBlockIndex* pindexPrev = nullptr ;
3510- BlockMap::iterator mi = m_block_index.find (block.hashPrevBlock );
3511- if (mi == m_block_index.end ()) {
3508+ BlockMap::iterator mi{m_blockman. m_block_index .find (block.hashPrevBlock )} ;
3509+ if (mi == m_blockman. m_block_index .end ()) {
35123510 LogPrint (BCLog::VALIDATION, " %s: %s prev block not found\n " , __func__, hash.ToString ());
35133511 return state.Invalid (BlockValidationResult::BLOCK_MISSING_PREV, " prev-blk-not-found" );
35143512 }
@@ -3517,7 +3515,7 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, BlockValidationS
35173515 LogPrint (BCLog::VALIDATION, " %s: %s prev block invalid\n " , __func__, hash.ToString ());
35183516 return state.Invalid (BlockValidationResult::BLOCK_INVALID_PREV, " bad-prevblk" );
35193517 }
3520- if (!ContextualCheckBlockHeader (block, state, * this , chainparams, pindexPrev, GetAdjustedTime ())) {
3518+ if (!ContextualCheckBlockHeader (block, state, m_blockman , chainparams, pindexPrev, GetAdjustedTime ())) {
35213519 LogPrint (BCLog::VALIDATION, " %s: Consensus::ContextualCheckBlockHeader: %s, %s\n " , __func__, hash.ToString (), state.ToString ());
35223520 return false ;
35233521 }
@@ -3561,7 +3559,7 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, BlockValidationS
35613559 }
35623560 }
35633561 }
3564- CBlockIndex* pindex = AddToBlockIndex (block);
3562+ CBlockIndex* pindex{m_blockman. AddToBlockIndex (block)} ;
35653563
35663564 if (ppindex)
35673565 *ppindex = pindex;
@@ -3577,8 +3575,7 @@ bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>&
35773575 LOCK (cs_main);
35783576 for (const CBlockHeader& header : headers) {
35793577 CBlockIndex *pindex = nullptr ; // Use a temp pindex instead of ppindex to avoid a const_cast
3580- bool accepted = m_blockman.AcceptBlockHeader (
3581- header, state, chainparams, &pindex);
3578+ bool accepted{AcceptBlockHeader (header, state, chainparams, &pindex)};
35823579 ActiveChainstate ().CheckBlockIndex ();
35833580
35843581 if (!accepted) {
@@ -3608,7 +3605,7 @@ bool CChainState::AcceptBlock(const std::shared_ptr<const CBlock>& pblock, Block
36083605 CBlockIndex *pindexDummy = nullptr ;
36093606 CBlockIndex *&pindex = ppindex ? *ppindex : pindexDummy;
36103607
3611- bool accepted_header = m_blockman .AcceptBlockHeader (block, state, m_params, &pindex);
3608+ bool accepted_header{m_chainman .AcceptBlockHeader (block, state, m_params, &pindex)} ;
36123609 CheckBlockIndex ();
36133610
36143611 if (!accepted_header)
@@ -4014,8 +4011,9 @@ bool BlockManager::LoadBlockIndex(
40144011 }
40154012 }
40164013 }
4017- if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork ))
4018- pindexBestInvalid = pindex;
4014+ if (pindex->nStatus & BLOCK_FAILED_MASK && (!chainman.m_best_invalid || pindex->nChainWork > chainman.m_best_invalid ->nChainWork )) {
4015+ chainman.m_best_invalid = pindex;
4016+ }
40194017 if (pindex->pprev )
40204018 pindex->BuildSkip ();
40214019 if (pindex->IsValid (BLOCK_VALID_TREE) && (pindexBestHeader == nullptr || CBlockIndexWorkComparator ()(pindexBestHeader, pindex)))
@@ -4026,7 +4024,6 @@ bool BlockManager::LoadBlockIndex(
40264024}
40274025
40284026void BlockManager::Unload () {
4029- m_failed_blocks.clear ();
40304027 m_blocks_unlinked.clear ();
40314028
40324029 for (const BlockMap::value_type& entry : m_block_index) {
@@ -4364,7 +4361,6 @@ void UnloadBlockIndex(CTxMemPool* mempool, ChainstateManager& chainman)
43644361{
43654362 LOCK (cs_main);
43664363 chainman.Unload ();
4367- pindexBestInvalid = nullptr ;
43684364 pindexBestHeader = nullptr ;
43694365 if (mempool) mempool->clear ();
43704366 vinfoBlockFile.clear ();
@@ -5341,7 +5337,9 @@ void ChainstateManager::Unload()
53415337 chainstate->UnloadBlockIndex ();
53425338 }
53435339
5340+ m_failed_blocks.clear ();
53445341 m_blockman.Unload ();
5342+ m_best_invalid = nullptr ;
53455343}
53465344
53475345void ChainstateManager::Reset ()
0 commit comments