diff options
author | Jorge Timón <jtimon@jtimon.cc> | 2016-08-11 04:42:36 +0200 |
---|---|---|
committer | Jorge Timón <jtimon@jtimon.cc> | 2017-09-20 23:25:52 +0200 |
commit | 832e0744cb8b1e1625cdb19b257f97316ac16a90 (patch) | |
tree | 401102620abe59c6ab82e9a9008ecece577d81a3 /src/consensus/tx_verify.cpp | |
parent | 3f0ee3e5011430461c7c61f4f2d406bf3cd8b54b (diff) |
Optimization: Minimize the number of times it is checked that no money is created
by individual transactions to 2 places (but call only once in each):
- ConnectBlock ( before calculated fees per txs twice )
- AcceptToMemoryPoolWorker ( before called CheckTxInputs 4 times and calculated
fees per tx one extra time )
Also call tx.GetValueOut() only once per call of CheckTxInputs (instead of 2)
Diffstat (limited to 'src/consensus/tx_verify.cpp')
-rw-r--r-- | src/consensus/tx_verify.cpp | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 25647ba6af..f2f85edad9 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -205,16 +205,15 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe return true; } -bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight) +bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee) { - // This doesn't trigger the DoS code on purpose; if it did, it would make it easier - // for an attacker to attempt to split the network. + // are the actual inputs available? if (!inputs.HaveInputs(tx)) { - return state.Invalid(false, 0, "", "Inputs unavailable"); + return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputs-missingorspent", false, + strprintf("%s: inputs missing/spent", __func__)); } CAmount nValueIn = 0; - CAmount nFees = 0; for (unsigned int i = 0; i < tx.vin.size(); ++i) { const COutPoint &prevout = tx.vin[i].prevout; const Coin& coin = inputs.AccessCoin(prevout); @@ -234,19 +233,18 @@ bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, c } } - if (nValueIn < tx.GetValueOut()) { + const CAmount value_out = tx.GetValueOut(); + if (nValueIn < value_out) { return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false, - strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()))); + strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(value_out))); } // Tally transaction fees - CAmount nTxFee = nValueIn - tx.GetValueOut(); - if (nTxFee < 0) { - return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-negative"); - } - nFees += nTxFee; - if (!MoneyRange(nFees)) { + const CAmount txfee_aux = nValueIn - value_out; + if (!MoneyRange(txfee_aux)) { return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-outofrange"); } + + txfee = txfee_aux; return true; } |