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 : : #include <version.h> 15 : : 16 : : /** Formatter for undo information for a CTxIn 17 : : * 18 : : * Contains the prevout's CTxOut being spent, and its metadata as well 19 : : * (coinbase or not, height). The serialization contains a dummy value of 20 : : * zero. This is compatible with older versions which expect to see 21 : : * the transaction version there. 22 : : */ 23 : : struct TxInUndoFormatter 24 : : { 25 : : template<typename Stream> 26 : 0 : void Ser(Stream &s, const Coin& txout) { 27 : 0 : ::Serialize(s, VARINT(txout.nHeight * uint32_t{2} + txout.fCoinBase )); 28 [ # # # # : 0 : if (txout.nHeight > 0) { # # ] 29 : : // Required to maintain compatibility with older undo format. 30 : 0 : ::Serialize(s, (unsigned char)0); 31 : 0 : } 32 : 0 : ::Serialize(s, Using<TxOutCompression>(txout.out)); 33 : 0 : } 34 : : 35 : : template<typename Stream> 36 : 0 : void Unser(Stream &s, Coin& txout) { 37 : 0 : uint32_t nCode = 0; 38 : 0 : ::Unserialize(s, VARINT(nCode)); 39 : 0 : txout.nHeight = nCode >> 1; 40 : 0 : txout.fCoinBase = nCode & 1; 41 [ # # ]: 0 : 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 : 0 : ::Unserialize(s, VARINT(nVersionDummy)); 47 : 0 : } 48 : 0 : ::Unserialize(s, Using<TxOutCompression>(txout.out)); 49 : 0 : } 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 : 0 : 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 : 0 : SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); } 69 : : }; 70 : : 71 : : #endif // BITCOIN_UNDO_H