/ src / consensus / tx_verify.cpp
tx_verify.cpp
  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  {
 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  
 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              const int64_t nCoinTime{Assert(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  
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  
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  
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  
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  
147  int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, uint32_t 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  
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  }