diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3680,7 +3680,7 @@ case avalanche::BlockUpdate::Status::Invalid: case avalanche::BlockUpdate::Status::Rejected: { BlockValidationState state; - ParkBlock(config, state, pindex); + ::ChainstateActive().ParkBlock(config, state, pindex); if (!state.IsValid()) { return error("Database error: %s", state.GetRejectReason()); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1737,7 +1737,7 @@ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); } } - InvalidateBlock(config, state, pblockindex); + ::ChainstateActive().InvalidateBlock(config, state, pblockindex); if (state.IsValid()) { ActivateBestChain(config, state); @@ -1776,7 +1776,7 @@ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); } } - ParkBlock(config, state, pblockindex); + ::ChainstateActive().ParkBlock(config, state, pblockindex); if (state.IsValid()) { ActivateBestChain(config, state); diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -830,14 +830,18 @@ // Manual block validity manipulation: bool PreciousBlock(const Config &config, BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(cs_main); + /** Mark a block as invalid. */ + bool InvalidateBlock(const Config &config, BlockValidationState &state, + CBlockIndex *pindex); + /** Park a block. */ + bool ParkBlock(const Config &config, BlockValidationState &state, + CBlockIndex *pindex); /** * Finalize a block. * A finalized block can not be reorged in any way. */ bool FinalizeBlock(const Config &config, BlockValidationState &state, CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main); - bool UnwindBlock(const Config &config, BlockValidationState &state, - CBlockIndex *pindex, bool invalidate); void ResetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main); template @@ -906,6 +910,8 @@ bool RollforwardBlock(const CBlockIndex *pindex, CCoinsViewCache &inputs, const Consensus::Params ¶ms) EXCLUSIVE_LOCKS_REQUIRED(cs_main); + bool UnwindBlock(const Config &config, BlockValidationState &state, + CBlockIndex *pindex, bool invalidate); }; /** @@ -916,14 +922,6 @@ bool PreciousBlock(const Config &config, BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(cs_main); -/** Mark a block as invalid. */ -bool InvalidateBlock(const Config &config, BlockValidationState &state, - CBlockIndex *pindex); - -/** Park a block. */ -bool ParkBlock(const Config &config, BlockValidationState &state, - CBlockIndex *pindex); - /** Remove invalidity status from a block and its descendants. */ void ResetBlockFailureFlags(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main); diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2919,32 +2919,6 @@ std::move(pblock)); } -bool CChainState::FinalizeBlock(const Config &config, - BlockValidationState &state, - CBlockIndex *pindex) { - AssertLockHeld(cs_main); - if (!MarkBlockAsFinal(config, state, pindex)) { - // state is set by MarkBlockAsFinal. - 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 CChainState::PreciousBlock(const Config &config, BlockValidationState &state, CBlockIndex *pindex) { @@ -3110,14 +3084,42 @@ return true; } -bool InvalidateBlock(const Config &config, BlockValidationState &state, - CBlockIndex *pindex) { - return ::ChainstateActive().UnwindBlock(config, state, pindex, true); +bool CChainState::InvalidateBlock(const Config &config, + BlockValidationState &state, + CBlockIndex *pindex) { + return UnwindBlock(config, state, pindex, true); } -bool ParkBlock(const Config &config, BlockValidationState &state, - CBlockIndex *pindex) { - return ::ChainstateActive().UnwindBlock(config, state, pindex, false); +bool CChainState::ParkBlock(const Config &config, BlockValidationState &state, + CBlockIndex *pindex) { + return UnwindBlock(config, state, pindex, false); +} + +bool CChainState::FinalizeBlock(const Config &config, + BlockValidationState &state, + CBlockIndex *pindex) { + AssertLockHeld(cs_main); + if (!MarkBlockAsFinal(config, state, pindex)) { + // state is set by MarkBlockAsFinal. + 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 UnwindBlock(config, state, pindexToInvalidate, + true /* invalidating */); + } + } + + return true; } template