1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 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.
9 #include "compressor.h"
10 #include "primitives/transaction.h"
11 #include "serialize.h"
13 /** Undo information for a CTxIn
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)
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
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
) { }
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
);
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
);
40 ::Serialize(s
, VARINT(this->nVersion
), nType
, nVersion
);
41 ::Serialize(s
, CTxOutCompressor(REF(txout
)), nType
, nVersion
);
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
);
49 fCoinBase
= nCode
& 1;
51 ::Unserialize(s
, VARINT(this->nVersion
), nType
, nVersion
);
52 ::Unserialize(s
, REF(CTxOutCompressor(REF(txout
))), nType
, nVersion
);
56 /** Undo information for a CTransaction */
60 // undo information for all txins
61 std::vector
<CTxInUndo
> vprevout
;
63 ADD_SERIALIZE_METHODS
;
65 template <typename Stream
, typename Operation
>
66 inline void SerializationOp(Stream
& s
, Operation ser_action
, int nType
, int nVersion
) {
71 /** Undo information for a CBlock */
75 std::vector
<CTxUndo
> vtxundo
; // for all but the coinbase
77 ADD_SERIALIZE_METHODS
;
79 template <typename Stream
, typename Operation
>
80 inline void SerializationOp(Stream
& s
, Operation ser_action
, int nType
, int nVersion
) {
85 #endif // BITCOIN_UNDO_H