1 // Copyright (c) 2017-2020 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 <consensus/consensus.h>
8 #include <primitives/transaction.h>
9 #include <script/interpreter.h>
10 #include <consensus/validation.h>
11 
12 // TODO remove the following dependencies
13 #include <chain.h>
14 #include <coins.h>
15 #include <util/moneystr.h>
16 
IsFinalTx(const CTransaction & tx,int nBlockHeight,int64_t nBlockTime)17 bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
18 {
19     if (tx.nLockTime == 0)
20         return true;
21     if ((int64_t)tx.nLockTime < ((int64_t)tx.nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
22         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     for (const auto& txin : tx.vin) {
33         if (!(txin.nSequence == CTxIn::SEQUENCE_FINAL))
34             return false;
35     }
36     return true;
37 }
38 
CalculateSequenceLocks(const CTransaction & tx,int flags,std::vector<int> & prevHeights,const CBlockIndex & block)39 std::pair<int, int64_t> CalculateSequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block)
40 {
41     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     int nMinHeight = -1;
49     int64_t nMinTime = -1;
50 
51     // tx.nVersion is signed integer so requires cast to unsigned otherwise
52     // we would be doing a signed comparison and half the range of nVersion
53     // wouldn't support BIP 68.
54     bool fEnforceBIP68 = static_cast<uint32_t>(tx.nVersion) >= 2
55                       && flags & LOCKTIME_VERIFY_SEQUENCE;
56 
57     // Do not enforce sequence numbers as a relative lock time
58     // unless we have been instructed to
59     if (!fEnforceBIP68) {
60         return std::make_pair(nMinHeight, nMinTime);
61     }
62 
63     for (size_t txinIndex = 0; txinIndex < tx.vin.size(); txinIndex++) {
64         const CTxIn& txin = tx.vin[txinIndex];
65 
66         // Sequence numbers with the most significant bit set are not
67         // treated as relative lock-times, nor are they given any
68         // consensus-enforced meaning at this point.
69         if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG) {
70             // The height of this input is not relevant for sequence locks
71             prevHeights[txinIndex] = 0;
72             continue;
73         }
74 
75         int nCoinHeight = prevHeights[txinIndex];
76 
77         if (txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) {
78             int64_t nCoinTime = block.GetAncestor(std::max(nCoinHeight-1, 0))->GetMedianTimePast();
79             // NOTE: Subtract 1 to maintain nLockTime semantics
80             // BIP 68 relative lock times have the semantics of calculating
81             // the first block or time at which the transaction would be
82             // valid. When calculating the effective block time or height
83             // for the entire transaction, we switch to using the
84             // semantics of nLockTime which is the last invalid block
85             // time or height.  Thus we subtract 1 from the calculated
86             // time or height.
87 
88             // Time-based relative lock-times are measured from the
89             // smallest allowed timestamp of the block containing the
90             // txout being spent, which is the median time past of the
91             // block prior.
92             nMinTime = std::max(nMinTime, nCoinTime + (int64_t)((txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) << CTxIn::SEQUENCE_LOCKTIME_GRANULARITY) - 1);
93         } else {
94             nMinHeight = std::max(nMinHeight, nCoinHeight + (int)(txin.nSequence & CTxIn::SEQUENCE_LOCKTIME_MASK) - 1);
95         }
96     }
97 
98     return std::make_pair(nMinHeight, nMinTime);
99 }
100 
EvaluateSequenceLocks(const CBlockIndex & block,std::pair<int,int64_t> lockPair)101 bool EvaluateSequenceLocks(const CBlockIndex& block, std::pair<int, int64_t> lockPair)
102 {
103     assert(block.pprev);
104     int64_t nBlockTime = block.pprev->GetMedianTimePast();
105     if (lockPair.first >= block.nHeight || lockPair.second >= nBlockTime)
106         return false;
107 
108     return true;
109 }
110 
SequenceLocks(const CTransaction & tx,int flags,std::vector<int> & prevHeights,const CBlockIndex & block)111 bool SequenceLocks(const CTransaction &tx, int flags, std::vector<int>& prevHeights, const CBlockIndex& block)
112 {
113     return EvaluateSequenceLocks(block, CalculateSequenceLocks(tx, flags, prevHeights, block));
114 }
115 
GetLegacySigOpCount(const CTransaction & tx)116 unsigned int GetLegacySigOpCount(const CTransaction& tx)
117 {
118     unsigned int nSigOps = 0;
119     for (const auto& txin : tx.vin)
120     {
121         nSigOps += txin.scriptSig.GetSigOpCount(false);
122     }
123     for (const auto& txout : tx.vout)
124     {
125         nSigOps += txout.scriptPubKey.GetSigOpCount(false);
126     }
127     return nSigOps;
128 }
129 
GetP2SHSigOpCount(const CTransaction & tx,const CCoinsViewCache & inputs)130 unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& inputs)
131 {
132     if (tx.IsCoinBase())
133         return 0;
134 
135     unsigned int nSigOps = 0;
136     for (unsigned int i = 0; i < tx.vin.size(); i++)
137     {
138         const Coin& coin = inputs.AccessCoin(tx.vin[i].prevout);
139         assert(!coin.IsSpent());
140         const CTxOut &prevout = coin.out;
141         if (prevout.scriptPubKey.IsPayToScriptHash())
142             nSigOps += prevout.scriptPubKey.GetSigOpCount(tx.vin[i].scriptSig);
143     }
144     return nSigOps;
145 }
146 
GetTransactionSigOpCost(const CTransaction & tx,const CCoinsViewCache & inputs,int flags)147 int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, int flags)
148 {
149     int64_t nSigOps = GetLegacySigOpCount(tx) * WITNESS_SCALE_FACTOR;
150 
151     if (tx.IsCoinBase())
152         return nSigOps;
153 
154     if (flags & SCRIPT_VERIFY_P2SH) {
155         nSigOps += GetP2SHSigOpCount(tx, inputs) * WITNESS_SCALE_FACTOR;
156     }
157 
158     for (unsigned int i = 0; i < tx.vin.size(); i++)
159     {
160         const Coin& coin = inputs.AccessCoin(tx.vin[i].prevout);
161         assert(!coin.IsSpent());
162         const CTxOut &prevout = coin.out;
163         nSigOps += CountWitnessSigOps(tx.vin[i].scriptSig, prevout.scriptPubKey, &tx.vin[i].scriptWitness, flags);
164     }
165     return nSigOps;
166 }
167 
CheckTxInputs(const CTransaction & tx,TxValidationState & state,const CCoinsViewCache & inputs,int nSpendHeight,CAmount & txfee)168 bool Consensus::CheckTxInputs(const CTransaction& tx, TxValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight, CAmount& txfee)
169 {
170     // are the actual inputs available?
171     if (!inputs.HaveInputs(tx)) {
172         return state.Invalid(TxValidationResult::TX_MISSING_INPUTS, "bad-txns-inputs-missingorspent",
173                          strprintf("%s: inputs missing/spent", __func__));
174     }
175 
176     CAmount nValueIn = 0;
177     for (unsigned int i = 0; i < tx.vin.size(); ++i) {
178         const COutPoint &prevout = tx.vin[i].prevout;
179         const Coin& coin = inputs.AccessCoin(prevout);
180         assert(!coin.IsSpent());
181 
182         // If prev is coinbase, check that it's matured
183         if (coin.IsCoinBase() && nSpendHeight - coin.nHeight < COINBASE_MATURITY) {
184             return state.Invalid(TxValidationResult::TX_PREMATURE_SPEND, "bad-txns-premature-spend-of-coinbase",
185                 strprintf("tried to spend coinbase at depth %d", nSpendHeight - coin.nHeight));
186         }
187 
188         // Check for negative or overflow input values
189         nValueIn += coin.out.nValue;
190         if (!MoneyRange(coin.out.nValue) || !MoneyRange(nValueIn)) {
191             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-inputvalues-outofrange");
192         }
193     }
194 
195     const CAmount value_out = tx.GetValueOut();
196     if (nValueIn < value_out) {
197         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-in-belowout",
198             strprintf("value in (%s) < value out (%s)", FormatMoney(nValueIn), FormatMoney(value_out)));
199     }
200 
201     // Tally transaction fees
202     const CAmount txfee_aux = nValueIn - value_out;
203     if (!MoneyRange(txfee_aux)) {
204         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-fee-outofrange");
205     }
206 
207     txfee = txfee_aux;
208     return true;
209 }
210