]> Git Repo - VerusCoin.git/blob - src/undo.h
Implement accurate memory accounting for mempool
[VerusCoin.git] / src / undo.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2013 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 "compressor.h" 
10 #include "primitives/transaction.h"
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
71 /** Undo information for a CBlock */
72 class CBlockUndo
73 {
74 public:
75     std::vector<CTxUndo> vtxundo; // for all but the coinbase
76     uint256 old_tree_root;
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);
83         READWRITE(old_tree_root);
84     }
85 };
86
87 #endif // BITCOIN_UNDO_H
This page took 0.028343 seconds and 4 git commands to generate.