| Line | Count | Source (jump to first uncovered line) | ||||||
| 1 | // Copyright (c) 2017-2021 The Bitcoin Core developers | |||||||
| 2 | // Distributed under the MIT software license, see the accompanying | |||||||
| 3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||||
| 4 | ||||||||
| 5 | #include <consensus/tx_verify.h> | |||||||
| 6 | ||||||||
| 7 | #include <chain.h> | |||||||
| 8 | #include <coins.h> | |||||||
| 9 | #include <consensus/amount.h> | |||||||
| 10 | #include <consensus/consensus.h> | |||||||
| 11 | #include <consensus/validation.h> | |||||||
| 12 | #include <primitives/transaction.h> | |||||||
| 13 | #include <script/interpreter.h> | |||||||
| 14 | #include <util/check.h> | |||||||
| 15 | #include <util/moneystr.h> | |||||||
| 16 | ||||||||
| 17 | bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime) | |||||||
| 18 | 888k | { | ||||||
| 19 | 888k | if (tx.nLockTime == 0) | ||||||
| 20 | 803k | return true; | ||||||
| 21 | 84.4k | if ((int64_t)tx.nLockTime < ((int64_t)tx.nLockTime < LOCKTIME_THRESHOLD ? | ||||||
| 22 | 576 | return true; | ||||||
| 23 | ||||||||
| 24 | // Even if tx.nLockTime isn't satisfied by nBlockHeight/nBlockTime, a | |||||||
| 25 | // transaction is still considered final if all inputs' nSequence == | |||||||
| 26 | // SEQUENCE_FINAL (0xffffffff), in which case nLockTime is ignored. | |||||||
| 27 | // | |||||||
| 28 | // Because of this behavior OP_CHECKLOCKTIMEVERIFY/CheckLockTime() will | |||||||
| 29 | // also check that the spending input's nSequence != SEQUENCE_FINAL, | |||||||
| 30 | // ensuring that an unsatisfied nLockTime value will actually cause | |||||||
| 31 | // IsFinalTx() to return false here: | |||||||
| 32 | 83.8k |     for (const auto& txin : tx.vin) { | ||||||
| 33 | 83.8k | if (!(txin.nSequence == CTxIn::SEQUENCE_FINAL)) | ||||||
| 34 | 65.6k | return false; | ||||||
| 35 | 83.8k | } | ||||||
| 36 | 18.2k | return true; | ||||||
| 37 | 83.8k | } | ||||||
| 38 | ||||||||
| 39 | std::pair<int, int64_t> CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block) | |||||||
| 40 | 761k | { | ||||||
| 41 | 761k | assert(prevHeights.size() == tx.vin.size()); | ||||||
| 42 | ||||||||
| 43 | // Will be set to the equivalent height- and time-based nLockTime | |||||||
| 44 | // values that would be necessary to satisfy all relative lock- | |||||||
| 45 | // time constraints given our view of block chain history. | |||||||
| 46 | // The semantics of nLockTime are the last invalid height/time, so | |||||||
| 47 | // use -1 to have the effect of any height or time being valid. | |||||||
| 48 | 761k | int nMinHeight = -1; | ||||||
| 49 | 761k | int64_t nMinTime = -1; | ||||||
| 50 | ||||||||
| 51 | 761k | bool fEnforceBIP68 = tx.version >= 2 && flags & LOCKTIME_VERIFY_SEQUENCE; | ||||||
| 52 | ||||||||
| 53 | // Do not enforce sequence numbers as a relative lock time | |||||||
| 54 | // unless we have been instructed to | |||||||
| 55 | 761k |     if (!fEnforceBIP68) { | ||||||
| 56 | 0 |         return std::make_pair(nMinHeight, nMinTime); | ||||||
| 57 | 0 |     } | ||||||
| 58 | ||||||||
| 59 | 1.52M | 
 | ||||||
| 60 | 761k | const CTxIn& txin = tx.vin[txinIndex]; | ||||||
| 61 | ||||||||
| 62 | // Sequence numbers with the most significant bit set are not | |||||||
| 63 | // treated as relative lock-times, nor are they given any | |||||||
| 64 | // consensus-enforced meaning at this point. | |||||||
| 65 | 761k |         if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG) { | ||||||
| 66 | // The height of this input is not relevant for sequence locks | |||||||
| 67 | 741k | prevHeights[txinIndex] = 0; | ||||||
| 68 | 741k | continue; | ||||||
| 69 | 741k | } | ||||||
| 70 | ||||||||
| 71 | 20.2k | int nCoinHeight = prevHeights[txinIndex]; | ||||||
| 72 | ||||||||
| 73 | 20.2k |         if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) { | ||||||
| 74 | 14.4k |             const int64_t nCoinTime{Assert(block.GetAncestor(std::max(nCoinHeight - 1, 0)))->GetMedianTimePast()};
 | ||||||
| 75 | // NOTE: Subtract 1 to maintain nLockTime semantics | |||||||
| 76 | // BIP 68 relative lock times have the semantics of calculating | |||||||
| 77 | // the first block or time at which the transaction would be | |||||||
| 78 | // valid. When calculating the effective block time or height | |||||||
| 79 | // for the entire transaction, we switch to using the | |||||||
| 80 | // semantics of nLockTime which is the last invalid block | |||||||
| 81 | // time or height. Thus we subtract 1 from the calculated | |||||||
| 82 | // time or height. | |||||||
| 83 | ||||||||
| 84 | // Time-based relative lock-times are measured from the | |||||||
| 85 | // smallest allowed timestamp of the block containing the | |||||||
| 86 | // txout being spent, which is the median time past of the | |||||||
| 87 | // block prior. | |||||||
| 88 | 14.4k | nMinTime = std::max(nMinTime, nCoinTime + (int64_t)((txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) << CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) - 1); | ||||||
| 89 | 14.4k |         } else { | ||||||
| 90 | 5.78k | nMinHeight = std::max(nMinHeight, nCoinHeight + (int)(txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) - 1); | ||||||
| 91 | 5.78k | } | ||||||
| 92 | 20.2k | } | ||||||
| 93 | ||||||||
| 94 | 761k | return std::make_pair(nMinHeight, nMinTime); | ||||||
| 95 | 761k | } | ||||||
| 96 | ||||||||
| 97 | bool EvaluateSequenceLocks(const CBlockIndex& block, std::pair<int, int64_t> lockPair) | |||||||
| 98 | 761k | { | ||||||
| 99 | 761k | assert(block.pprev); | ||||||
| 100 | 761k | int64_t nBlockTime = block.pprev->GetMedianTimePast(); | ||||||
| 101 | 761k | if (lockPair.first >= block.nHeight || | ||||||
| 102 | 16.1k | return false; | ||||||
| 103 | ||||||||
| 104 | 745k | return true; | ||||||
| 105 | 761k | } | ||||||
| 106 | ||||||||
| 107 | bool SequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block) | |||||||
| 108 | 107k | { | ||||||
| 109 | 107k | return EvaluateSequenceLocks(block, CalculateSequenceLocks(tx, flags, prevHeights, block)); | ||||||
| 110 | 107k | } | ||||||
| 111 | ||||||||
| 112 | unsigned int GetLegacySigOpCount(const CTransaction& tx) | |||||||
| 113 | 1.25M | { | ||||||
| 114 | 1.25M | unsigned int nSigOps = 0; | ||||||
| 115 | 1.25M | for (const auto& txin : tx.vin) | ||||||
| 116 | 1.25M |     { | ||||||
| 117 | 1.25M | nSigOps += txin.scriptSig.GetSigOpCount(false); | ||||||
| 118 | 1.25M | } | ||||||
| 119 | 1.25M | for (const auto& txout : tx.vout) | ||||||
| 120 | 1.61M |     { | ||||||
| 121 | 1.61M | nSigOps += txout.scriptPubKey.GetSigOpCount(false); | ||||||
| 122 | 1.61M | } | ||||||
| 123 | 1.25M | return nSigOps; | ||||||
| 124 | 1.25M | } | ||||||
| 125 | ||||||||
| 126 | unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& inputs) | |||||||
| 127 | 745k | { | ||||||
| 128 | 745k | if (tx.IsCoinBase()) | ||||||
| 129 | 0 |         return 0; | ||||||
| 130 | ||||||||
| 131 | 745k | unsigned int nSigOps = 0; | ||||||
| 132 | 1.49M | for (unsigned int i = 0; i < tx.vin.size(); | ||||||
| 133 | 745k |     { | ||||||
| 134 | 745k | const Coin& coin = inputs.AccessCoin(tx.vin[i].prevout); | ||||||
| 135 | 745k | assert(!coin.IsSpent()); | ||||||
| 136 | 745k | const CTxOut &prevout = coin.out; | ||||||
| 137 | 745k | if (prevout.scriptPubKey.IsPayToScriptHash()) | ||||||
| 138 | 0 |             nSigOps += prevout.scriptPubKey.GetSigOpCount(tx.vin[i].scriptSig); | ||||||
| 139 | 745k | } | ||||||
| 140 | 745k | return nSigOps; | ||||||
| 141 | 745k | } | ||||||
| 142 | ||||||||
| 143 | int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, uint32_t flags) | |||||||
| 144 | 770k | { | ||||||
| 145 | 770k | int64_t nSigOps = GetLegacySigOpCount(tx) * WITNESS_SCALE_FACTOR; | ||||||
| 146 | ||||||||
| 147 | 770k | if (tx.IsCoinBase()) | ||||||
| 148 | 25.0k | return nSigOps; | ||||||
| 149 | ||||||||
| 150 | 745k |     if (flags & SCRIPT_VERIFY_P2SH) { | ||||||
| 151 | 745k | nSigOps += GetP2SHSigOpCount(tx, inputs) * WITNESS_SCALE_FACTOR; | ||||||
| 152 | 745k | } | ||||||
| 153 | ||||||||
| 154 | 1.49M | for (unsigned int i = 0; i < tx.vin.size(); | ||||||
| 155 | 745k |     { | ||||||
| 156 | 745k | const Coin& coin = inputs.AccessCoin(tx.vin[i].prevout); | ||||||
| 157 | 745k | assert(!coin.IsSpent()); | ||||||
| 158 | 745k | const CTxOut &prevout = coin.out; | ||||||
| 159 | 745k | nSigOps += CountWitnessSigOps(tx.vin[i].scriptSig, prevout.scriptPubKey, &tx.vin[i].scriptWitness, flags); | ||||||
| 160 | 745k | } | ||||||
| 161 | 745k | return nSigOps; | ||||||
| 162 | 745k | } | ||||||
| 163 | ||||||||
| 164 | bool Consensus::CheckTxInputs(const CTransaction& tx, TxValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee) | |||||||
| 165 | 17.2M | { | ||||||
| 166 | // are the actual inputs available? | |||||||
| 167 | 17.2M |     if (!inputs.HaveInputs(tx)) { | ||||||
| 168 | 2.67k | return state.Invalid(TxValidationResult::TX_MISSING_INPUTS, "bad-txns-inputs-missingorspent", | ||||||
| 169 | 2.67k |                          strprintf("%s: inputs missing/spent", __func__));
 | ||||||
| 170 | 2.67k | } | ||||||
| 171 | ||||||||
| 172 | 17.2M | CAmount nValueIn = 0; | ||||||
| 173 | 34.5M | for (unsigned int i = 0; i < tx.vin.size(); | ||||||
| 174 | 17.2M | const COutPoint &prevout = tx.vin[i].prevout; | ||||||
| 175 | 17.2M | const Coin& coin = inputs.AccessCoin(prevout); | ||||||
| 176 | 17.2M | assert(!coin.IsSpent()); | ||||||
| 177 | ||||||||
| 178 | // If prev is coinbase, check that it's matured | |||||||
| 179 | 17.2M | if (coin.IsCoinBase() && | ||||||
| 180 | 0 |             return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "bad-txns-premature-spend-of-coinbase", | ||||||
| 181 | 0 | strprintf("tried to spend coinbase at depth %d", nSpendHeight - coin.nHeight)); 
 | ||||||
| 182 | 0 |         } | ||||||
| 183 | ||||||||
| 184 | // Check for negative or overflow input values | |||||||
| 185 | 17.2M | nValueIn += coin.out.nValue; | ||||||
| 186 | 17.2M |         if (!MoneyRange(coin.out.nValue) || !MoneyRange(nValueIn)) { | ||||||
| 187 | 0 |             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-inputvalues-outofrange"); | ||||||
| 188 | 0 |         } | ||||||
| 189 | 17.2M | } | ||||||
| 190 | ||||||||
| 191 | 17.2M | const CAmount value_out = tx.GetValueOut(); | ||||||
| 192 | 17.2M |     if (nValueIn < value_out) { | ||||||
| 193 | 0 |         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-in-belowout", | ||||||
| 194 | 0 | strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(value_out))); 
 | ||||||
| 195 | 0 |     } | ||||||
| 196 | ||||||||
| 197 | // Tally transaction fees | |||||||
| 198 | 17.2M | const CAmount txfee_aux = nValueIn - value_out; | ||||||
| 199 | 17.2M |     if (!MoneyRange(txfee_aux)) { | ||||||
| 200 | 0 |         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-fee-outofrange"); | ||||||
| 201 | 0 |     } | ||||||
| 202 | ||||||||
| 203 | 17.2M | txfee = txfee_aux; | ||||||
| 204 | 17.2M | return true; | ||||||
| 205 | 17.2M | } |