undo.h raw

   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_UNDO_H
   7  #define BITCOIN_UNDO_H
   8  
   9  #include <coins.h>
  10  #include <compressor.h>
  11  #include <consensus/consensus.h>
  12  #include <primitives/transaction.h>
  13  #include <serialize.h>
  14  
  15  /** Formatter for undo information for a CTxIn
  16   *
  17   *  Contains the prevout's CTxOut being spent, and its metadata as well
  18   *  (coinbase or not, height). The serialization contains a dummy value of
  19   *  zero. This is compatible with older versions which expect to see
  20   *  the transaction version there.
  21   */
  22  struct TxInUndoFormatter
  23  {
  24      template<typename Stream>
  25      void Ser(Stream &s, const Coin& txout) {
  26          uint32_t nCode{(uint32_t{txout.nHeight} << 1) | uint32_t{txout.fCoinBase}};
  27          ::Serialize(s, VARINT(nCode));
  28          if (txout.nHeight > 0) {
  29              // Required to maintain compatibility with older undo format.
  30              ::Serialize(s, (unsigned char)0);
  31          }
  32          ::Serialize(s, Using<TxOutCompression>(txout.out));
  33      }
  34  
  35      template<typename Stream>
  36      void Unser(Stream &s, Coin& txout) {
  37          uint32_t nCode = 0;
  38          ::Unserialize(s, VARINT(nCode));
  39          txout.nHeight = nCode >> 1;
  40          txout.fCoinBase = nCode & 1;
  41          if (txout.nHeight > 0) {
  42              // Old versions stored the version number for the last spend of
  43              // a transaction's outputs. Non-final spends were indicated with
  44              // height = 0.
  45              unsigned int nVersionDummy;
  46              ::Unserialize(s, VARINT(nVersionDummy));
  47          }
  48          ::Unserialize(s, Using<TxOutCompression>(txout.out));
  49      }
  50  };
  51  
  52  /** Undo information for a CTransaction */
  53  class CTxUndo
  54  {
  55  public:
  56      // undo information for all txins
  57      std::vector<Coin> vprevout;
  58  
  59      SERIALIZE_METHODS(CTxUndo, obj) { READWRITE(Using<VectorFormatter<TxInUndoFormatter>>(obj.vprevout)); }
  60  };
  61  
  62  /** Undo information for a CBlock */
  63  class CBlockUndo
  64  {
  65  public:
  66      std::vector<CTxUndo> vtxundo; // for all but the coinbase
  67  
  68      SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); }
  69  };
  70  
  71  #endif // BITCOIN_UNDO_H
  72