/ src / primitives / transaction.h
transaction.h
  1  // Copyright (c) 2009-2010 Satoshi Nakamoto
  2  // Copyright (c) 2009-present The Bitcoin Core developers
  3  // Distributed under the MIT software license, see the accompanying
  4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  5  
  6  #ifndef BITCOIN_PRIMITIVES_TRANSACTION_H
  7  #define BITCOIN_PRIMITIVES_TRANSACTION_H
  8  
  9  #include <attributes.h>
 10  #include <consensus/amount.h>
 11  #include <primitives/transaction_identifier.h> // IWYU pragma: export
 12  #include <script/script.h>
 13  #include <serialize.h>
 14  
 15  #include <compare>
 16  #include <cstddef>
 17  #include <cstdint>
 18  #include <ios>
 19  #include <limits>
 20  #include <memory>
 21  #include <numeric>
 22  #include <string>
 23  #include <tuple>
 24  #include <utility>
 25  #include <vector>
 26  
 27  /** An outpoint - a combination of a transaction hash and an index n into its vout */
 28  class COutPoint
 29  {
 30  public:
 31      Txid hash;
 32      uint32_t n;
 33  
 34      static constexpr uint32_t NULL_INDEX = std::numeric_limits<uint32_t>::max();
 35  
 36      COutPoint(): n(NULL_INDEX) { }
 37      COutPoint(const Txid& hashIn, uint32_t nIn): hash(hashIn), n(nIn) { }
 38  
 39      SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }
 40  
 41      void SetNull() { hash.SetNull(); n = NULL_INDEX; }
 42      bool IsNull() const { return (hash.IsNull() && n == NULL_INDEX); }
 43  
 44      friend bool operator<(const COutPoint& a, const COutPoint& b)
 45      {
 46          return std::tie(a.hash, a.n) < std::tie(b.hash, b.n);
 47      }
 48  
 49      friend bool operator==(const COutPoint& a, const COutPoint& b)
 50      {
 51          return (a.hash == b.hash && a.n == b.n);
 52      }
 53  
 54      std::string ToString() const;
 55  };
 56  
 57  /** An input of a transaction.  It contains the location of the previous
 58   * transaction's output that it claims and a signature that matches the
 59   * output's public key.
 60   */
 61  class CTxIn
 62  {
 63  public:
 64      COutPoint prevout;
 65      CScript scriptSig;
 66      uint32_t nSequence;
 67      CScriptWitness scriptWitness; //!< Only serialized through CTransaction
 68  
 69      /**
 70       * Setting nSequence to this value for every input in a transaction
 71       * disables nLockTime/IsFinalTx().
 72       * It fails OP_CHECKLOCKTIMEVERIFY/CheckLockTime() for any input that has
 73       * it set (BIP 65).
 74       * It has SEQUENCE_LOCKTIME_DISABLE_FLAG set (BIP 68/112).
 75       */
 76      static const uint32_t SEQUENCE_FINAL = 0xffffffff;
 77      /**
 78       * This is the maximum sequence number that enables both nLockTime and
 79       * OP_CHECKLOCKTIMEVERIFY (BIP 65).
 80       * It has SEQUENCE_LOCKTIME_DISABLE_FLAG set (BIP 68/112).
 81       */
 82      static const uint32_t MAX_SEQUENCE_NONFINAL{SEQUENCE_FINAL - 1};
 83  
 84      // Below flags apply in the context of BIP 68. BIP 68 requires the tx
 85      // version to be set to 2, or higher.
 86      /**
 87       * If this flag is set, CTxIn::nSequence is NOT interpreted as a
 88       * relative lock-time.
 89       * It skips SequenceLocks() for any input that has it set (BIP 68).
 90       * It fails OP_CHECKSEQUENCEVERIFY/CheckSequence() for any input that has
 91       * it set (BIP 112).
 92       */
 93      static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG = (1U << 31);
 94  
 95      /**
 96       * If CTxIn::nSequence encodes a relative lock-time and this flag
 97       * is set, the relative lock-time has units of 512 seconds,
 98       * otherwise it specifies blocks with a granularity of 1. */
 99      static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG = (1 << 22);
100  
101      /**
102       * If CTxIn::nSequence encodes a relative lock-time, this mask is
103       * applied to extract that lock-time from the sequence field. */
104      static const uint32_t SEQUENCE_LOCKTIME_MASK = 0x0000ffff;
105  
106      /**
107       * In order to use the same number of bits to encode roughly the
108       * same wall-clock duration, and because blocks are naturally
109       * limited to occur every 600s on average, the minimum granularity
110       * for time-based relative lock-time is fixed at 512 seconds.
111       * Converting from CTxIn::nSequence to seconds is performed by
112       * multiplying by 512 = 2^9, or equivalently shifting up by
113       * 9 bits. */
114      static const int SEQUENCE_LOCKTIME_GRANULARITY = 9;
115  
116      CTxIn()
117      {
118          nSequence = SEQUENCE_FINAL;
119      }
120  
121      explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
122      CTxIn(Txid hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
123  
124      SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }
125  
126      friend bool operator==(const CTxIn& a, const CTxIn& b)
127      {
128          return (a.prevout   == b.prevout &&
129                  a.scriptSig == b.scriptSig &&
130                  a.nSequence == b.nSequence);
131      }
132  
133      std::string ToString() const;
134  };
135  
136  /** An output of a transaction.  It contains the public key that the next input
137   * must be able to sign with to claim it.
138   */
139  class CTxOut
140  {
141  public:
142      CAmount nValue;
143      CScript scriptPubKey;
144  
145      CTxOut()
146      {
147          SetNull();
148      }
149  
150      CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn);
151  
152      SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }
153  
154      void SetNull()
155      {
156          nValue = -1;
157          scriptPubKey.clear();
158      }
159  
160      bool IsNull() const
161      {
162          return (nValue == -1);
163      }
164  
165      friend bool operator==(const CTxOut& a, const CTxOut& b)
166      {
167          return (a.nValue       == b.nValue &&
168                  a.scriptPubKey == b.scriptPubKey);
169      }
170  
171      std::string ToString() const;
172  };
173  
174  struct CMutableTransaction;
175  
176  struct TransactionSerParams {
177      const bool allow_witness;
178      SER_PARAMS_OPFUNC
179  };
180  static constexpr TransactionSerParams TX_WITH_WITNESS{.allow_witness = true};
181  static constexpr TransactionSerParams TX_NO_WITNESS{.allow_witness = false};
182  
183  /**
184   * Basic transaction serialization format:
185   * - uint32_t version
186   * - std::vector<CTxIn> vin
187   * - std::vector<CTxOut> vout
188   * - uint32_t nLockTime
189   *
190   * Extended transaction serialization format:
191   * - uint32_t version
192   * - unsigned char dummy = 0x00
193   * - unsigned char flags (!= 0)
194   * - std::vector<CTxIn> vin
195   * - std::vector<CTxOut> vout
196   * - if (flags & 1):
197   *   - CScriptWitness scriptWitness; (deserialized into CTxIn)
198   * - uint32_t nLockTime
199   */
200  template<typename Stream, typename TxType>
201  void UnserializeTransaction(TxType& tx, Stream& s, const TransactionSerParams& params)
202  {
203      const bool fAllowWitness = params.allow_witness;
204  
205      s >> tx.version;
206      unsigned char flags = 0;
207      tx.vin.clear();
208      tx.vout.clear();
209      /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */
210      s >> tx.vin;
211      if (tx.vin.size() == 0 && fAllowWitness) {
212          /* We read a dummy or an empty vin. */
213          s >> flags;
214          if (flags != 0) {
215              s >> tx.vin;
216              s >> tx.vout;
217          }
218      } else {
219          /* We read a non-empty vin. Assume a normal vout follows. */
220          s >> tx.vout;
221      }
222      if ((flags & 1) && fAllowWitness) {
223          /* The witness flag is present, and we support witnesses. */
224          flags ^= 1;
225          for (size_t i = 0; i < tx.vin.size(); i++) {
226              s >> tx.vin[i].scriptWitness.stack;
227          }
228          if (!tx.HasWitness()) {
229              /* It's illegal to encode witnesses when all witness stacks are empty. */
230              throw std::ios_base::failure("Superfluous witness record");
231          }
232      }
233      if (flags) {
234          /* Unknown flag in the serialization */
235          throw std::ios_base::failure("Unknown transaction optional data");
236      }
237      s >> tx.nLockTime;
238  }
239  
240  template<typename Stream, typename TxType>
241  void SerializeTransaction(const TxType& tx, Stream& s, const TransactionSerParams& params)
242  {
243      const bool fAllowWitness = params.allow_witness;
244  
245      s << tx.version;
246      unsigned char flags = 0;
247      // Consistency check
248      if (fAllowWitness) {
249          /* Check whether witnesses need to be serialized. */
250          if (tx.HasWitness()) {
251              flags |= 1;
252          }
253      }
254      if (flags) {
255          /* Use extended format in case witnesses are to be serialized. */
256          std::vector<CTxIn> vinDummy;
257          s << vinDummy;
258          s << flags;
259      }
260      s << tx.vin;
261      s << tx.vout;
262      if (flags & 1) {
263          for (size_t i = 0; i < tx.vin.size(); i++) {
264              s << tx.vin[i].scriptWitness.stack;
265          }
266      }
267      s << tx.nLockTime;
268  }
269  
270  template<typename TxType>
271  inline CAmount CalculateOutputValue(const TxType& tx)
272  {
273      return std::accumulate(tx.vout.cbegin(), tx.vout.cend(), CAmount{0}, [](CAmount sum, const auto& txout) { return sum + txout.nValue; });
274  }
275  
276  
277  /** The basic transaction that is broadcasted on the network and contained in
278   * blocks.  A transaction can contain multiple inputs and outputs.
279   */
280  class CTransaction
281  {
282  public:
283      // Default transaction version.
284      static const uint32_t CURRENT_VERSION{2};
285  
286      // The local variables are made const to prevent unintended modification
287      // without updating the cached hash value. However, CTransaction is not
288      // actually immutable; deserialization and assignment are implemented,
289      // and bypass the constness. This is safe, as they update the entire
290      // structure, including the hash.
291      const std::vector<CTxIn> vin;
292      const std::vector<CTxOut> vout;
293      const uint32_t version;
294      const uint32_t nLockTime;
295  
296  private:
297      /** Memory only. */
298      const bool m_has_witness;
299      const Txid hash;
300      const Wtxid m_witness_hash;
301  
302      Txid ComputeHash() const;
303      Wtxid ComputeWitnessHash() const;
304  
305      bool ComputeHasWitness() const;
306  
307  public:
308      /** Convert a CMutableTransaction into a CTransaction. */
309      explicit CTransaction(const CMutableTransaction& tx);
310      explicit CTransaction(CMutableTransaction&& tx);
311  
312      template <typename Stream>
313      inline void Serialize(Stream& s) const {
314          SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
315      }
316  
317      /** This deserializing constructor is provided instead of an Unserialize method.
318       *  Unserialize is not possible, since it would require overwriting const fields. */
319      template <typename Stream>
320      CTransaction(deserialize_type, const TransactionSerParams& params, Stream& s) : CTransaction(CMutableTransaction(deserialize, params, s)) {}
321      template <typename Stream>
322      CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {}
323  
324      bool IsNull() const {
325          return vin.empty() && vout.empty();
326      }
327  
328      const Txid& GetHash() const LIFETIMEBOUND { return hash; }
329      const Wtxid& GetWitnessHash() const LIFETIMEBOUND { return m_witness_hash; };
330  
331      // Return sum of txouts.
332      CAmount GetValueOut() const;
333  
334      /**
335       * Calculate the total transaction size in bytes, including witness data.
336       * "Total Size" defined in BIP141 and BIP144.
337       * @return Total transaction size in bytes
338       */
339      unsigned int ComputeTotalSize() const;
340  
341      bool IsCoinBase() const
342      {
343          return (vin.size() == 1 && vin[0].prevout.IsNull());
344      }
345  
346      friend bool operator==(const CTransaction& a, const CTransaction& b)
347      {
348          return a.GetWitnessHash() == b.GetWitnessHash();
349      }
350  
351      std::string ToString() const;
352  
353      bool HasWitness() const { return m_has_witness; }
354  };
355  
356  /** A mutable version of CTransaction. */
357  struct CMutableTransaction
358  {
359      std::vector<CTxIn> vin;
360      std::vector<CTxOut> vout;
361      uint32_t version;
362      uint32_t nLockTime;
363  
364      explicit CMutableTransaction();
365      explicit CMutableTransaction(const CTransaction& tx);
366  
367      template <typename Stream>
368      inline void Serialize(Stream& s) const {
369          SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
370      }
371  
372      template <typename Stream>
373      inline void Unserialize(Stream& s) {
374          UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
375      }
376  
377      template <typename Stream>
378      CMutableTransaction(deserialize_type, const TransactionSerParams& params, Stream& s) {
379          UnserializeTransaction(*this, s, params);
380      }
381  
382      template <typename Stream>
383      CMutableTransaction(deserialize_type, Stream& s) {
384          Unserialize(s);
385      }
386  
387      /** Compute the hash of this CMutableTransaction. This is computed on the
388       * fly, as opposed to GetHash() in CTransaction, which uses a cached result.
389       */
390      Txid GetHash() const;
391  
392      bool HasWitness() const
393      {
394          for (size_t i = 0; i < vin.size(); i++) {
395              if (!vin[i].scriptWitness.IsNull()) {
396                  return true;
397              }
398          }
399          return false;
400      }
401  };
402  
403  typedef std::shared_ptr<const CTransaction> CTransactionRef;
404  template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); }
405  
406  #endif // BITCOIN_PRIMITIVES_TRANSACTION_H