diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -44,6 +44,7 @@ #include #include +class BlockPolicyValidationState; class CChainParams; class Chainstate; class ChainstateManager; @@ -981,6 +982,7 @@ bool &fInvalidFound, ConnectTrace &connectTrace) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs); bool ConnectTip(const Config &config, BlockValidationState &state, + BlockPolicyValidationState &blockPolicyState, CBlockIndex *pindexNew, const std::shared_ptr &pblock, ConnectTrace &connectTrace, diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2654,6 +2654,7 @@ * The block is added to connectTrace if connection succeeds. */ bool Chainstate::ConnectTip(const Config &config, BlockValidationState &state, + BlockPolicyValidationState &blockPolicyState, CBlockIndex *pindexNew, const std::shared_ptr &pblock, ConnectTrace &connectTrace, @@ -2731,7 +2732,6 @@ if (std::find_if_not( parkingPolicies.begin(), parkingPolicies.end(), [&](const auto &policy) { - BlockPolicyValidationState blockPolicyState; bool ret = (*policy)(blockPolicyState); if (!ret) { LogPrintf("Park block because it " @@ -3069,7 +3069,8 @@ // Connect new blocks. for (CBlockIndex *pindexConnect : reverse_iterate(vpindexToConnect)) { - if (!ConnectTip(config, state, pindexConnect, + BlockPolicyValidationState blockPolicyState; + if (!ConnectTip(config, state, blockPolicyState, pindexConnect, pindexConnect == pindexMostWork ? pblock : std::shared_ptr(), @@ -3086,8 +3087,8 @@ break; } - if (pindexConnect->nStatus.isParked()) { - // The block was parked due to a policy violation. + if (blockPolicyState.IsInvalid()) { + // The block violates a policy rule. fContinue = false; break; }