Browse Source

Proper indentation for CheckTxInputs and other minor fixes

0.16
Jorge Timón 8 years ago
parent
commit
3f0ee3e501
No known key found for this signature in database
GPG Key ID: 8866C18EA1C944A2
  1. 76
      src/consensus/tx_verify.cpp

76
src/consensus/tx_verify.cpp

@ -13,7 +13,7 @@
#include "chain.h" #include "chain.h"
#include "coins.h" #include "coins.h"
#include "utilmoneystr.h" #include "utilmoneystr.h"
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime) bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
{ {
if (tx.nLockTime == 0) if (tx.nLockTime == 0)
@ -207,44 +207,46 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe
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)
{ {
// This doesn't trigger the DoS code on purpose; if it did, it would make it easier // 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. // for an attacker to attempt to split the network.
if (!inputs.HaveInputs(tx)) if (!inputs.HaveInputs(tx)) {
return state.Invalid(false, 0, "", "Inputs unavailable"); return state.Invalid(false, 0, "", "Inputs unavailable");
}
CAmount nValueIn = 0;
CAmount nFees = 0; CAmount nValueIn = 0;
for (unsigned int i = 0; i < tx.vin.size(); i++) CAmount nFees = 0;
{ for (unsigned int i = 0; i < tx.vin.size(); ++i) {
const COutPoint &prevout = tx.vin[i].prevout; const COutPoint &prevout = tx.vin[i].prevout;
const Coin& coin = inputs.AccessCoin(prevout); const Coin& coin = inputs.AccessCoin(prevout);
assert(!coin.IsSpent()); assert(!coin.IsSpent());
// If prev is coinbase, check that it's matured // If prev is coinbase, check that it's matured
if (coin.IsCoinBase()) { if (coin.IsCoinBase() && nSpendHeight - coin.nHeight < COINBASE_MATURITY) {
if (nSpendHeight - coin.nHeight < COINBASE_MATURITY) return state.Invalid(false,
return state.Invalid(false, REJECT_INVALID, "bad-txns-premature-spend-of-coinbase",
REJECT_INVALID, "bad-txns-premature-spend-of-coinbase", strprintf("tried to spend coinbase at depth %d", nSpendHeight - coin.nHeight));
strprintf("tried to spend coinbase at depth %d", nSpendHeight - coin.nHeight)); }
}
// Check for negative or overflow input values
nValueIn += coin.out.nValue;
if (!MoneyRange(coin.out.nValue) || !MoneyRange(nValueIn))
return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputvalues-outofrange");
// Check for negative or overflow input values
nValueIn += coin.out.nValue;
if (!MoneyRange(coin.out.nValue) || !MoneyRange(nValueIn)) {
return state.DoS(100, false, REJECT_INVALID, "bad-txns-inputvalues-outofrange");
} }
}
if (nValueIn < tx.GetValueOut()) {
return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false,
strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(tx.GetValueOut())));
}
if (nValueIn < tx.GetValueOut()) // Tally transaction fees
return state.DoS(100, false, REJECT_INVALID, "bad-txns-in-belowout", false, CAmount nTxFee = nValueIn - tx.GetValueOut();
strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(tx.GetValueOut()))); if (nTxFee < 0) {
return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-negative");
// Tally transaction fees }
CAmount nTxFee = nValueIn - tx.GetValueOut(); nFees += nTxFee;
if (nTxFee < 0) if (!MoneyRange(nFees)) {
return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-negative"); return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-outofrange");
nFees += nTxFee; }
if (!MoneyRange(nFees))
return state.DoS(100, false, REJECT_INVALID, "bad-txns-fee-outofrange");
return true; return true;
} }

Loading…
Cancel
Save