/ src / undo.h
undo.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_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