aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2016-11-01 11:03:18 -0400
committerMatt Corallo <git@bluematt.me>2016-11-09 11:28:00 -0800
commiteecffe50efc3944d713c701fa375dacbf17fb7cf (patch)
treedf2cbe0fad1e266ac0c5f5e0e6b8c7e87a3b70e1 /src
parentb2e178a2d2e387b147f0d87e64fc773d5ec799d0 (diff)
Remove redundant duplicate-input check from CheckTransaction
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp20
-rw-r--r--src/main.h2
2 files changed, 12 insertions, 10 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7e5b9528b9..c8af01983c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1104,7 +1104,7 @@ int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& i
-bool CheckTransaction(const CTransaction& tx, CValidationState &state)
+bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fCheckDuplicateInputs)
{
// Basic checks that don't depend on any context
if (tx.vin.empty())
@@ -1128,13 +1128,15 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
}
- // Check for duplicate inputs
- set<COutPoint> vInOutPoints;
- for (const auto& txin : tx.vin)
- {
- if (vInOutPoints.count(txin.prevout))
- return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate");
- vInOutPoints.insert(txin.prevout);
+ // Check for duplicate inputs - note that this check is slow so we skip it in CheckBlock
+ if (fCheckDuplicateInputs) {
+ set<COutPoint> vInOutPoints;
+ for (const auto& txin : tx.vin)
+ {
+ if (vInOutPoints.count(txin.prevout))
+ return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-duplicate");
+ vInOutPoints.insert(txin.prevout);
+ }
}
if (tx.IsCoinBase())
@@ -3461,7 +3463,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P
// Check transactions
for (const auto& tx : block.vtx)
- if (!CheckTransaction(tx, state))
+ if (!CheckTransaction(tx, state, false))
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/main.h b/src/main.h
index 9343330587..21829b6c25 100644
--- a/src/main.h
+++ b/src/main.h
@@ -343,7 +343,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 CheckTransaction(const CTransaction& tx, CValidationState& state, bool fCheckDuplicateInputs=true);
namespace Consensus {