From eaae127cf4e4e31123a777e8bac5d4053257af57 Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Mon, 17 Sep 2018 15:50:55 -0400 Subject: [PATCH 1/2] Fix crash bug with duplicate inputs within a transaction Introduced by #9049 --- src/validation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 47bb7676031d..9a92fac3f8e5 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3437,7 +3437,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P // Check transactions for (const auto& tx : block.vtx) - if (!CheckTransaction(*tx, state, false)) + if (!CheckTransaction(*tx, state, true)) return state.Invalid(false, state.GetRejectCode(), state.GetRejectReason(), strprintf("Transaction check failed (tx hash %s) %s", tx->GetHash().ToString(), state.GetDebugMessage())); From 3964a58ce2e46b82223cf09b84e412138da9f520 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 19 Sep 2018 00:29:35 +0300 Subject: [PATCH 2/2] Remove redundant parameter fCheckDuplicateInputs from CheckTransaction --- src/validation.cpp | 18 ++++++++---------- src/validation.h | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 9a92fac3f8e5..3b067eea9195 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -513,7 +513,7 @@ int GetUTXOConfirmations(const COutPoint& outpoint) } -bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fCheckDuplicateInputs) +bool CheckTransaction(const CTransaction& tx, CValidationState &state) { // Basic checks that don't depend on any context if (tx.vin.empty()) @@ -539,14 +539,12 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge"); } - // Check for duplicate inputs - note that this check is slow so we skip it in CheckBlock - if (fCheckDuplicateInputs) { - std::set vInOutPoints; - for (const auto& txin : tx.vin) - { - if (!vInOutPoints.insert(txin.prevout).second) - return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate"); - } + // Check for duplicate inputs + std::set vInOutPoints; + for (const auto& txin : tx.vin) + { + if (!vInOutPoints.insert(txin.prevout).second) + return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate"); } if (tx.IsCoinBase()) @@ -3437,7 +3435,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P // Check transactions for (const auto& tx : block.vtx) - if (!CheckTransaction(*tx, state, true)) + if (!CheckTransaction(*tx, state)) return state.Invalid(false, state.GetRejectCode(), state.GetRejectReason(), strprintf("Transaction check failed (tx hash %s) %s", tx->GetHash().ToString(), state.GetDebugMessage())); diff --git a/src/validation.h b/src/validation.h index 8c45bbb4e2f3..ff406e63cd17 100644 --- a/src/validation.h +++ b/src/validation.h @@ -388,7 +388,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight); /** Transaction validation functions */ /** Context-independent validity checks */ -bool CheckTransaction(const CTransaction& tx, CValidationState& state, bool fCheckDuplicateInputs=true); +bool CheckTransaction(const CTransaction& tx, CValidationState& state); namespace Consensus {