@ -154,6 +154,10 @@ public:
bool ActivateBestChain ( CValidationState & state , const CChainParams & chainparams , std : : shared_ptr < const CBlock > pblock ) ;
/**
* If a block header hasn ' t already been seen , call CheckBlockHeader on it , ensure
* that it doesn ' t descend from an invalid block , and then add it to mapBlockIndex .
*/
bool AcceptBlockHeader ( const CBlockHeader & block , CValidationState & state , const CChainParams & chainparams , CBlockIndex * * ppindex ) ;
bool AcceptBlock ( const std : : shared_ptr < const CBlock > & pblock , CValidationState & state , const CChainParams & chainparams , CBlockIndex * * ppindex , bool fRequested , const CDiskBlockPos * dbp , bool * fNewBlock ) ;
@ -185,6 +189,11 @@ private:
CBlockIndex * AddToBlockIndex ( const CBlockHeader & block ) ;
/** Create a new block index entry for a given block hash */
CBlockIndex * InsertBlockIndex ( const uint256 & hash ) ;
/**
* Make various assertions about the state of the block index .
*
* By default this only executes fully when using the Regtest chain ; see : fCheckBlockIndex .
*/
void CheckBlockIndex ( const Consensus : : Params & consensusParams ) ;
void InvalidBlockFound ( CBlockIndex * pindex , const CValidationState & state ) ;
@ -2654,6 +2663,10 @@ static void NotifyHeaderTip() {
* Make the best chain active , in multiple steps . The result is either failure
* or an activated best chain . pblock is either nullptr or a pointer to a block
* that is already loaded ( to avoid loading it again from disk ) .
*
* ActivateBestChain is split into steps ( see ActivateBestChainStep ) so that
* we avoid holding cs_main for an extended period of time ; the length of this
* call may be quite long during reindexing or a substantial reorg .
*/
bool CChainState : : ActivateBestChain ( CValidationState & state , const CChainParams & chainparams , std : : shared_ptr < const CBlock > pblock ) {
// Note that while we're often called here from ProcessNewBlock, this is
@ -3357,6 +3370,9 @@ bool CChainState::AcceptBlockHeader(const CBlockHeader& block, CValidationState&
if ( ! ContextualCheckBlockHeader ( block , state , chainparams , pindexPrev , GetAdjustedTime ( ) ) )
return error ( " %s: Consensus::ContextualCheckBlockHeader: %s, %s " , __func__ , hash . ToString ( ) , FormatStateMessage ( state ) ) ;
// If the previous block index isn't valid, determine if it descends from any block which
// has been found invalid (g_failed_blocks), then mark pindexPrev and any blocks
// between them as failed.
if ( ! pindexPrev - > IsValid ( BLOCK_VALID_SCRIPTS ) ) {
for ( const CBlockIndex * failedit : m_failed_blocks ) {
if ( pindexPrev - > GetAncestor ( failedit - > nHeight ) = = failedit ) {