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