undo.h raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-2020 The Limenka 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 LIMENKA_UNDO_H
   7  #define LIMENKA_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          ::Serialize(s, VARINT(txout.nHeight * uint32_t{2} + txout.fCoinBase ));
  27          if (txout.nHeight > 0) {
  28              // Required to maintain compatibility with older undo format.
  29              ::Serialize(s, (unsigned char)0);
  30          }
  31          ::Serialize(s, Using<TxOutCompression>(txout.out));
  32      }
  33  
  34      template<typename Stream>
  35      void Unser(Stream &s, Coin& txout) {
  36          uint32_t nCode = 0;
  37          ::Unserialize(s, VARINT(nCode));
  38          txout.nHeight = nCode >> 1;
  39          txout.fCoinBase = nCode & 1;
  40          if (txout.nHeight > 0) {
  41              // Old versions stored the version number for the last spend of
  42              // a transaction's outputs. Non-final spends were indicated with
  43              // height = 0.
  44              unsigned int nVersionDummy;
  45              ::Unserialize(s, VARINT(nVersionDummy));
  46          }
  47          ::Unserialize(s, Using<TxOutCompression>(txout.out));
  48      }
  49  };
  50  
  51  /** Undo information for a CTransaction */
  52  class CTxUndo
  53  {
  54  public:
  55      // undo information for all txins
  56      std::vector<Coin> vprevout;
  57  
  58      SERIALIZE_METHODS(CTxUndo, obj) { READWRITE(Using<VectorFormatter<TxInUndoFormatter>>(obj.vprevout)); }
  59  };
  60  
  61  /** Undo information for a CBlock */
  62  class CBlockUndo
  63  {
  64  public:
  65      std::vector<CTxUndo> vtxundo; // for all but the coinbase
  66  
  67      SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); }
  68  };
  69  
  70  #endif // LIMENKA_UNDO_H
  71