]>
Commit | Line | Data |
---|---|---|
999a2ab4 | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2013 The Bitcoin Core developers |
999a2ab4 | 3 | // Distributed under the MIT software license, see the accompanying |
4 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |
5 | ||
84738627 PJ |
6 | #ifndef BITCOIN_UNDO_H |
7 | #define BITCOIN_UNDO_H | |
999a2ab4 | 8 | |
561e9e9d | 9 | #include "compressor.h" |
d2270111 | 10 | #include "primitives/transaction.h" |
999a2ab4 | 11 | #include "serialize.h" |
12 | ||
13 | /** Undo information for a CTxIn | |
14 | * | |
15 | * Contains the prevout's CTxOut being spent, and if this was the | |
16 | * last output of the affected transaction, its metadata as well | |
17 | * (coinbase or not, height, transaction version) | |
18 | */ | |
19 | class CTxInUndo | |
20 | { | |
21 | public: | |
22 | CTxOut txout; // the txout data before being spent | |
23 | bool fCoinBase; // if the outpoint was the last unspent: whether it belonged to a coinbase | |
24 | unsigned int nHeight; // if the outpoint was the last unspent: its height | |
25 | int nVersion; // if the outpoint was the last unspent: its version | |
26 | ||
27 | CTxInUndo() : txout(), fCoinBase(false), nHeight(0), nVersion(0) {} | |
28 | CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), nHeight(nHeightIn), nVersion(nVersionIn) { } | |
29 | ||
30 | unsigned int GetSerializeSize(int nType, int nVersion) const { | |
31 | return ::GetSerializeSize(VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion) + | |
32 | (nHeight > 0 ? ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion) : 0) + | |
33 | ::GetSerializeSize(CTxOutCompressor(REF(txout)), nType, nVersion); | |
34 | } | |
35 | ||
36 | template<typename Stream> | |
37 | void Serialize(Stream &s, int nType, int nVersion) const { | |
38 | ::Serialize(s, VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion); | |
39 | if (nHeight > 0) | |
40 | ::Serialize(s, VARINT(this->nVersion), nType, nVersion); | |
41 | ::Serialize(s, CTxOutCompressor(REF(txout)), nType, nVersion); | |
42 | } | |
43 | ||
44 | template<typename Stream> | |
45 | void Unserialize(Stream &s, int nType, int nVersion) { | |
46 | unsigned int nCode = 0; | |
47 | ::Unserialize(s, VARINT(nCode), nType, nVersion); | |
48 | nHeight = nCode / 2; | |
49 | fCoinBase = nCode & 1; | |
50 | if (nHeight > 0) | |
51 | ::Unserialize(s, VARINT(this->nVersion), nType, nVersion); | |
52 | ::Unserialize(s, REF(CTxOutCompressor(REF(txout))), nType, nVersion); | |
53 | } | |
54 | }; | |
55 | ||
56 | /** Undo information for a CTransaction */ | |
57 | class CTxUndo | |
58 | { | |
59 | public: | |
60 | // undo information for all txins | |
61 | std::vector<CTxInUndo> vprevout; | |
62 | ||
63 | ADD_SERIALIZE_METHODS; | |
64 | ||
65 | template <typename Stream, typename Operation> | |
66 | inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { | |
67 | READWRITE(vprevout); | |
68 | } | |
69 | }; | |
70 | ||
937ba572 | 71 | /** Undo information for a CBlock */ |
72 | class CBlockUndo | |
73 | { | |
74 | public: | |
75 | std::vector<CTxUndo> vtxundo; // for all but the coinbase | |
a8ac403d | 76 | uint256 old_tree_root; |
937ba572 | 77 | |
78 | ADD_SERIALIZE_METHODS; | |
79 | ||
80 | template <typename Stream, typename Operation> | |
81 | inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { | |
82 | READWRITE(vtxundo); | |
a8ac403d | 83 | READWRITE(old_tree_root); |
937ba572 | 84 | } |
85 | }; | |
86 | ||
84738627 | 87 | #endif // BITCOIN_UNDO_H |