Branch data Line data Source code
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 : 201690 : void Ser(Stream &s, const Coin& txout) {
26 : 201690 : uint32_t nCode{(uint32_t{txout.nHeight} << 1) | uint32_t{txout.fCoinBase}};
27 : 201690 : ::Serialize(s, VARINT(nCode));
28 [ + - ]: 201690 : if (txout.nHeight > 0) {
29 : : // Required to maintain compatibility with older undo format.
30 : 201690 : ::Serialize(s, (unsigned char)0);
31 : : }
32 : 201690 : ::Serialize(s, Using<TxOutCompression>(txout.out));
33 : 201690 : }
34 : :
35 : : template<typename Stream>
36 : 27431 : void Unser(Stream &s, Coin& txout) {
37 : 27431 : uint32_t nCode = 0;
38 : 27431 : ::Unserialize(s, VARINT(nCode));
39 : 27431 : txout.nHeight = nCode >> 1;
40 : 27431 : txout.fCoinBase = nCode & 1;
41 [ + - ]: 27431 : 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 : 27431 : ::Unserialize(s, VARINT(nVersionDummy));
47 : : }
48 : 27431 : ::Unserialize(s, Using<TxOutCompression>(txout.out));
49 : 27431 : }
50 : : };
51 : :
52 : : /** Undo information for a CTransaction */
53 [ + - ]: 480730 : class CTxUndo
54 : : {
55 : : public:
56 : : // undo information for all txins
57 : : std::vector<Coin> vprevout;
58 : :
59 : 290462 : SERIALIZE_METHODS(CTxUndo, obj) { READWRITE(Using<VectorFormatter<TxInUndoFormatter>>(obj.vprevout)); }
60 : : };
61 : :
62 : : /** Undo information for a CBlock */
63 : 245889 : class CBlockUndo
64 : : {
65 : : public:
66 : : std::vector<CTxUndo> vtxundo; // for all but the coinbase
67 : :
68 : 439270 : SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); }
69 : : };
70 : :
71 : : #endif // BITCOIN_UNDO_H
|