diff options
author | Suhas Daftuar <sdaftuar@gmail.com> | 2019-02-21 13:46:25 -0500 |
---|---|---|
committer | Suhas Daftuar <sdaftuar@gmail.com> | 2019-05-02 15:29:09 -0400 |
commit | 54470e767bab37f9b7089782b1be73d5883bb244 (patch) | |
tree | 93593dd9585f122caa07da630ace4931e1ef5d33 /src | |
parent | 2120c31521aa51aa1984ee33250b8320506d3a0f (diff) | |
download | bitcoin-54470e767bab37f9b7089782b1be73d5883bb244.tar.xz |
Assert validation reasons are contextually correct
Diffstat (limited to 'src')
-rw-r--r-- | src/consensus/validation.h | 26 | ||||
-rw-r--r-- | src/net_processing.cpp | 3 | ||||
-rw-r--r-- | src/validation.cpp | 3 |
3 files changed, 32 insertions, 0 deletions
diff --git a/src/consensus/validation.h b/src/consensus/validation.h index ed1b047614..3079f3b08c 100644 --- a/src/consensus/validation.h +++ b/src/consensus/validation.h @@ -66,6 +66,32 @@ enum class ValidationInvalidReason { 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 */ class CValidationState { private: diff --git a/src/net_processing.cpp b/src/net_processing.cpp index c19befcf88..3319d3211a 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -975,6 +975,7 @@ void Misbehaving(NodeId pnode, int howmuch, const std::string& message) EXCLUSIV */ static bool TxRelayMayResultInDisconnect(const CValidationState& state) { + assert(IsTransactionReason(state.GetReason())); 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 // Probably non-standard or insufficient fee 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) { // Do not use rejection cache for witness transactions or // 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()); } } else { + assert(IsTransactionReason(state.GetReason())); if (!tx.HasWitness() && state.GetReason() != ValidationInvalidReason::TX_WITNESS_MUTATED) { // Do not use rejection cache for witness transactions or // witness-stripped transactions, as they can have been malleated. diff --git a/src/validation.cpp b/src/validation.cpp index a9cf425011..c29bff9d30 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -895,6 +895,7 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool state.Invalid(ValidationInvalidReason::TX_WITNESS_MUTATED, false, state.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage()); } + assert(IsTransactionReason(state.GetReason())); 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.GetRejectCode(), state.GetRejectReason(), state.GetDebugMessage()); } + assert(IsBlockReason(state.GetReason())); return error("%s: Consensus::CheckTxInputs: %s, %s", __func__, tx.GetHash().ToString(), FormatStateMessage(state)); } nFees += txfee; @@ -3507,6 +3509,7 @@ bool CChainState::AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CVali if (!CheckBlock(block, state, chainparams.GetConsensus()) || !ContextualCheckBlock(block, state, chainparams.GetConsensus(), pindex->pprev)) { + assert(IsBlockReason(state.GetReason())); if (state.IsInvalid() && state.GetReason() != ValidationInvalidReason::BLOCK_MUTATED) { pindex->nStatus |= BLOCK_FAILED_VALID; setDirtyBlockIndex.insert(pindex); |