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 | } |