diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1023,12 +1023,17 @@ CheckForkWarningConditions(); } +// Called both upon regular invalid block discovery *and* InvalidateBlock void CChainState::InvalidChainFound(CBlockIndex *pindexNew) { AssertLockHeld(cs_main); if (!pindexBestInvalid || pindexNew->nChainWork > pindexBestInvalid->nChainWork) { pindexBestInvalid = pindexNew; } + if (pindexBestHeader != nullptr && + pindexBestHeader->GetAncestor(pindexNew->nHeight) == pindexNew) { + pindexBestHeader = ::ChainActive().Tip(); + } // If the invalid chain found is supposed to be finalized, we need to move // back the finalization point. @@ -1050,6 +1055,8 @@ FormatISO8601DateTime(tip->GetBlockTime())); } +// Same as InvalidChainFound, above, except not called directly from +// InvalidateBlock, which does its own setBlockIndexCandidates management. void CChainState::InvalidBlockFound(CBlockIndex *pindex, const BlockValidationState &state) { if (state.GetResult() != BlockValidationResult::BLOCK_MUTATED) {