diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1695,7 +1695,23 @@ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); } - FinalizeBlockAndInvalidate(config, state, pblockindex); + FinalizeBlock(config, state, pblockindex); + + // We have a valid candidate, make sure it is not parked. + if (!state.IsInvalid() && pblockindex->nStatus.isOnParkedChain()) { + UnparkBlock(pblockindex); + } + + // If the finalized block is not on the active chain, we may need to + // rewind. + if (!state.IsInvalid() && !::ChainActive().Contains(pblockindex)) { + const CBlockIndex *pindexFork = + ::ChainActive().FindFork(pblockindex); + CBlockIndex *pindexToInvalidate = ::ChainActive().Next(pindexFork); + if (pindexToInvalidate) { + InvalidateBlock(config, state, pindexToInvalidate); + } + } } if (state.IsValid()) { diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -913,9 +913,8 @@ * Mark a block as finalized. * A finalized block can not be reorged in any way. */ -bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, - CBlockIndex *pindex) - EXCLUSIVE_LOCKS_REQUIRED(cs_main); +bool FinalizeBlock(const Config &config, CValidationState &state, + const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main); /** Mark a block as invalid. */ bool InvalidateBlock(const Config &config, CValidationState &state, diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2247,8 +2247,8 @@ } }; -static bool FinalizeBlockInternal(const Config &config, CValidationState &state, - const CBlockIndex *pindex) +bool FinalizeBlock(const Config &config, CValidationState &state, + const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { AssertLockHeld(cs_main); if (pindex->nStatus.isInvalid()) { @@ -2386,7 +2386,7 @@ const CBlockIndex *pindexToFinalize = FindBlockToFinalize(config, pindexNew); if (pindexToFinalize && - !FinalizeBlockInternal(config, state, pindexToFinalize)) { + !FinalizeBlock(config, state, pindexToFinalize)) { return error("ConnectTip(): FinalizeBlock %s failed (%s)", pindexNew->GetBlockHash().ToString(), FormatStateMessage(state)); @@ -3086,31 +3086,6 @@ return true; } -bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, - CBlockIndex *pindex) { - AssertLockHeld(cs_main); - if (!FinalizeBlockInternal(config, state, pindex)) { - // state is set by FinalizeBlockInternal. - return false; - } - - // We have a valid candidate, make sure it is not parked. - if (pindex->nStatus.isOnParkedChain()) { - UnparkBlock(pindex); - } - - // If the finalized block is not on the active chain, we may need to rewind. - if (!::ChainActive().Contains(pindex)) { - const CBlockIndex *pindexFork = ::ChainActive().FindFork(pindex); - CBlockIndex *pindexToInvalidate = ::ChainActive().Next(pindexFork); - if (pindexToInvalidate) { - return InvalidateBlock(config, state, pindexToInvalidate); - } - } - - return true; -} - bool InvalidateBlock(const Config &config, CValidationState &state, CBlockIndex *pindex) { return ::ChainstateActive().UnwindBlock(config, state, pindex, true);