git / moonbite-core / src/undo.h · raw
// Copyright (c) 2009-2010 Satoshi Nakamoto// Copyright (c) 2009-2020 The Bitcoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#ifndef BITCOIN_UNDO_H#define BITCOIN_UNDO_H#include <coins.h>#include <compressor.h>#include <consensus/consensus.h>#include <mw/models/block/BlockUndo.h>#include <primitives/transaction.h>#include <serialize.h>#include <version.h>/** Formatter for undo information for a CTxIn * * Contains the prevout's CTxOut being spent, and its metadata as well * (coinbase or not, height). The serialization contains a dummy value of * zero. This is compatible with older versions which expect to see * the transaction version there. */struct TxInUndoFormatter{ template<typename Stream> void Ser(Stream &s, const Coin& txout) { ::Serialize(s, VARINT(txout.nHeight * uint32_t{2} + txout.fCoinBase )); if (txout.nHeight > 0) { // Required to maintain compatibility with older undo format. ::Serialize(s, (unsigned char)0); } ::Serialize(s, Using<TxOutCompression>(txout.out)); } template<typename Stream> void Unser(Stream &s, Coin& txout) { uint32_t nCode = 0; ::Unserialize(s, VARINT(nCode)); txout.nHeight = nCode >> 1; txout.fCoinBase = nCode & 1; if (txout.nHeight > 0) { // Old versions stored the version number for the last spend of // a transaction's outputs. Non-final spends were indicated with // height = 0. unsigned int nVersionDummy = 0; ::Unserialize(s, VARINT(nVersionDummy)); } ::Unserialize(s, Using<TxOutCompression>(txout.out)); }};/** Undo information for a CTransaction */class CTxUndo{public: // undo information for all txins std::vector<Coin> vprevout; SERIALIZE_METHODS(CTxUndo, obj) { READWRITE(Using<VectorFormatter<TxInUndoFormatter>>(obj.vprevout)); }};/** Undo information for a CBlock */class CBlockUndo{public: std::vector<CTxUndo> vtxundo; // for all but the coinbase mw::BlockUndo::CPtr mwundo; SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); if (obj.mwundo != nullptr) { READWRITE(obj.mwundo); } }};template <typename Stream>inline void UnserializeBlockUndo(CBlockUndo& blockundo, Stream& s, const unsigned int num_bytes){ const uint64_t num_txs = ::ReadCompactSize(s); blockundo.vtxundo.reserve(num_txs); for (uint64_t i = 0; i < num_txs; i++) { CTxUndo txundo; s >> txundo; blockundo.vtxundo.emplace_back(std::move(txundo)); } if (::GetSerializeSize(blockundo) < num_bytes) { // There's more data to read. MWEB rewind data must be available. s >> blockundo.mwundo; }}#endif // BITCOIN_UNDO_H