mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-09 10:43:19 -05:00
Assert validation reasons are contextually correct
This commit is contained in:
parent
2120c31521
commit
54470e767b
3 changed files with 32 additions and 0 deletions
|
@ -66,6 +66,32 @@ enum class ValidationInvalidReason {
|
||||||
TX_MEMPOOL_POLICY, //!< violated mempool's fee/size/descendant/RBF/etc limits
|
TX_MEMPOOL_POLICY, //!< violated mempool's fee/size/descendant/RBF/etc limits
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline bool IsTransactionReason(ValidationInvalidReason r)
|
||||||
|
{
|
||||||
|
return r == ValidationInvalidReason::NONE ||
|
||||||
|
r == ValidationInvalidReason::CONSENSUS ||
|
||||||
|
r == ValidationInvalidReason::RECENT_CONSENSUS_CHANGE ||
|
||||||
|
r == ValidationInvalidReason::TX_NOT_STANDARD ||
|
||||||
|
r == ValidationInvalidReason::TX_MISSING_INPUTS ||
|
||||||
|
r == ValidationInvalidReason::TX_WITNESS_MUTATED ||
|
||||||
|
r == ValidationInvalidReason::TX_CONFLICT ||
|
||||||
|
r == ValidationInvalidReason::TX_MEMPOOL_POLICY;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool IsBlockReason(ValidationInvalidReason r)
|
||||||
|
{
|
||||||
|
return r == ValidationInvalidReason::NONE ||
|
||||||
|
r == ValidationInvalidReason::CONSENSUS ||
|
||||||
|
r == ValidationInvalidReason::RECENT_CONSENSUS_CHANGE ||
|
||||||
|
r == ValidationInvalidReason::CACHED_INVALID ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_INVALID_HEADER ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_MUTATED ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_MISSING_PREV ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_INVALID_PREV ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_TIME_FUTURE ||
|
||||||
|
r == ValidationInvalidReason::BLOCK_CHECKPOINT;
|
||||||
|
}
|
||||||
|
|
||||||
/** Capture information about block/transaction validation */
|
/** Capture information about block/transaction validation */
|
||||||
class CValidationState {
|
class CValidationState {
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -975,6 +975,7 @@ void Misbehaving(NodeId pnode, int howmuch, const std::string& message) EXCLUSIV
|
||||||
*/
|
*/
|
||||||
static bool TxRelayMayResultInDisconnect(const CValidationState& state)
|
static bool TxRelayMayResultInDisconnect(const CValidationState& state)
|
||||||
{
|
{
|
||||||
|
assert(IsTransactionReason(state.GetReason()));
|
||||||
return state.GetReason() == ValidationInvalidReason::CONSENSUS;
|
return state.GetReason() == ValidationInvalidReason::CONSENSUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1806,6 +1807,7 @@ void static ProcessOrphanTx(CConnman* connman, std::set<uint256>& orphan_work_se
|
||||||
// Has inputs but not accepted to mempool
|
// Has inputs but not accepted to mempool
|
||||||
// Probably non-standard or insufficient fee
|
// Probably non-standard or insufficient fee
|
||||||
LogPrint(BCLog::MEMPOOL, " removed orphan tx %s\n", orphanHash.ToString());
|
LogPrint(BCLog::MEMPOOL, " removed orphan tx %s\n", orphanHash.ToString());
|
||||||
|
assert(IsTransactionReason(orphan_state.GetReason()));
|
||||||
if (!orphanTx.HasWitness() && orphan_state.GetReason() != ValidationInvalidReason::TX_WITNESS_MUTATED) {
|
if (!orphanTx.HasWitness() && orphan_state.GetReason() != ValidationInvalidReason::TX_WITNESS_MUTATED) {
|
||||||
// Do not use rejection cache for witness transactions or
|
// Do not use rejection cache for witness transactions or
|
||||||
// witness-stripped transactions, as they can have been malleated.
|
// witness-stripped transactions, as they can have been malleated.
|
||||||
|
@ -2523,6 +2525,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
||||||
recentRejects->insert(tx.GetHash());
|
recentRejects->insert(tx.GetHash());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
assert(IsTransactionReason(state.GetReason()));
|
||||||
if (!tx.HasWitness() && state.GetReason() != ValidationInvalidReason::TX_WITNESS_MUTATED) {
|
if (!tx.HasWitness() && state.GetReason() != ValidationInvalidReason::TX_WITNESS_MUTATED) {
|
||||||
// Do not use rejection cache for witness transactions or
|
// Do not use rejection cache for witness transactions or
|
||||||
// witness-stripped transactions, as they can have been malleated.
|
// witness-stripped transactions, as they can have been malleated.
|
||||||
|
|
|
@ -895,6 +895,7 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool
|
||||||
state.Invalid(ValidationInvalidReason::TX_WITNESS_MUTATED, false,
|
state.Invalid(ValidationInvalidReason::TX_WITNESS_MUTATED, false,
|
||||||
state.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage());
|
state.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage());
|
||||||
}
|
}
|
||||||
|
assert(IsTransactionReason(state.GetReason()));
|
||||||
return false; // state filled in by CheckInputs
|
return false; // state filled in by CheckInputs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1970,6 +1971,7 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl
|
||||||
state.Invalid(ValidationInvalidReason::CONSENSUS, false,
|
state.Invalid(ValidationInvalidReason::CONSENSUS, false,
|
||||||
state.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage());
|
state.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage());
|
||||||
}
|
}
|
||||||
|
assert(IsBlockReason(state.GetReason()));
|
||||||
return error("%s: Consensus::CheckTxInputs: %s, %s", __func__, tx.GetHash().ToString(), FormatStateMessage(state));
|
return error("%s: Consensus::CheckTxInputs: %s, %s", __func__, tx.GetHash().ToString(), FormatStateMessage(state));
|
||||||
}
|
}
|
||||||
nFees += txfee;
|
nFees += txfee;
|
||||||
|
@ -3507,6 +3509,7 @@ bool CChainState::AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CVali
|
||||||
|
|
||||||
if (!CheckBlock(block, state, chainparams.GetConsensus()) ||
|
if (!CheckBlock(block, state, chainparams.GetConsensus()) ||
|
||||||
!ContextualCheckBlock(block, state, chainparams.GetConsensus(), pindex->pprev)) {
|
!ContextualCheckBlock(block, state, chainparams.GetConsensus(), pindex->pprev)) {
|
||||||
|
assert(IsBlockReason(state.GetReason()));
|
||||||
if (state.IsInvalid() && state.GetReason() != ValidationInvalidReason::BLOCK_MUTATED) {
|
if (state.IsInvalid() && state.GetReason() != ValidationInvalidReason::BLOCK_MUTATED) {
|
||||||
pindex->nStatus |= BLOCK_FAILED_VALID;
|
pindex->nStatus |= BLOCK_FAILED_VALID;
|
||||||
setDirtyBlockIndex.insert(pindex);
|
setDirtyBlockIndex.insert(pindex);
|
||||||
|
|
Loading…
Add table
Reference in a new issue