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