diff options
author | MarcoFalke <falke.marco@gmail.com> | 2019-10-08 14:42:17 -0400 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2019-10-24 14:58:34 -0400 |
commit | fa928134075220254a15107c1d9702f4e66271f8 (patch) | |
tree | d21688f45f6634ef8ab2cb204991089a1daa8682 /src/consensus/tx_check.cpp | |
parent | d53828cb79688d72a18d2cc550dcd1dfe2d3dd85 (diff) |
consensus: Explain why fCheckDuplicateInputs can not be skipped and remove it
Diffstat (limited to 'src/consensus/tx_check.cpp')
-rw-r--r-- | src/consensus/tx_check.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/consensus/tx_check.cpp b/src/consensus/tx_check.cpp index 1206035839..6793f871cf 100644 --- a/src/consensus/tx_check.cpp +++ b/src/consensus/tx_check.cpp @@ -7,7 +7,7 @@ #include <primitives/transaction.h> #include <consensus/validation.h> -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()) @@ -31,14 +31,15 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe return state.Invalid(ValidationInvalidReason::CONSENSUS, false, "bad-txns-txouttotal-toolarge"); } - // Check for duplicate inputs - note that this check is slow so we skip it in CheckBlock - if (fCheckDuplicateInputs) { - std::set<COutPoint> vInOutPoints; - for (const auto& txin : tx.vin) - { - if (!vInOutPoints.insert(txin.prevout).second) - return state.Invalid(ValidationInvalidReason::CONSENSUS, false, "bad-txns-inputs-duplicate"); - } + // Check for duplicate inputs (see CVE-2018-17144) + // While Consensus::CheckTxInputs does check if all inputs of a tx are available, and UpdateCoins marks all inputs + // of a tx as spent, it does not check if the tx has duplicate inputs. + // Failure to run this check will result in either a crash or an inflation bug, depending on the implementation of + // the underlying coins database. + std::set<COutPoint> vInOutPoints; + for (const auto& txin : tx.vin) { + if (!vInOutPoints.insert(txin.prevout).second) + return state.Invalid(ValidationInvalidReason::CONSENSUS, false, "bad-txns-inputs-duplicate"); } if (tx.IsCoinBase()) |