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