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