diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1047,6 +1047,13 @@ pindexBestInvalid = pindexNew; } + // If the invalid chain found is supposed to be finalized, we need to move + // back the finalization point. + if (pindexFinalized && + pindexFinalized->GetAncestor(pindexNew->nHeight) == pindexNew) { + pindexFinalized = pindexNew->pprev; + } + LogPrintf( "%s: invalid block=%s height=%d log2_work=%.8g date=%s\n", __func__, pindexNew->GetBlockHash().ToString(), pindexNew->nHeight, @@ -2446,6 +2453,7 @@ pindexNew->GetBlockHash().ToString(), pindexFinalized->nHeight); pindexNew->nStatus = pindexNew->nStatus.withFailed(); + InvalidChainFound(pindexNew); } const CBlockIndex *pindexFork = chainActive.FindFork(pindexNew); @@ -2986,6 +2994,12 @@ pindexBestInvalid = nullptr; } + // In case we are reconsidering something before the finalization point, + // move the finalization point to the last common ancestor. + if (pindexFinalized) { + pindexFinalized = LastCommonAncestor(pindex, pindexFinalized); + } + UpdateFlags(pindex, [](const BlockStatus status) { return status.withClearedFailureFlags(); }); diff --git a/test/functional/abc-finalize-block.py b/test/functional/abc-finalize-block.py --- a/test/functional/abc-finalize-block.py +++ b/test/functional/abc-finalize-block.py @@ -96,6 +96,11 @@ "Finalize block is alt_node's tip!" assert_equal(node.getfinalizedblockhash(), finalized_block) + self.log.info( + "Make sure reconsidering block move the finalization point...") + node.reconsiderblock(alt_node.getbestblockhash()) + assert_equal(node.getbestblockhash(), alt_node.getbestblockhash()) + if __name__ == '__main__': FinalizeBlockTest().main()