LCOV - code coverage report
Current view: top level - src - undo.h (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 22 22 100.0 %
Date: 2020-09-26 01:30:44 Functions: 40 40 100.0 %

          Line data    Source code
       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             : #include <version.h>
      15             : 
      16             : /** Formatter for undo information for a CTxIn
      17             :  *
      18             :  *  Contains the prevout's CTxOut being spent, and its metadata as well
      19             :  *  (coinbase or not, height). The serialization contains a dummy value of
      20             :  *  zero. This is compatible with older versions which expect to see
      21             :  *  the transaction version there.
      22             :  */
      23             : struct TxInUndoFormatter
      24             : {
      25             :     template<typename Stream>
      26      296104 :     void Ser(Stream &s, const Coin& txout) {
      27      296104 :         ::Serialize(s, VARINT(txout.nHeight * uint32_t{2} + txout.fCoinBase ));
      28      296104 :         if (txout.nHeight > 0) {
      29             :             // Required to maintain compatibility with older undo format.
      30      296104 :             ::Serialize(s, (unsigned char)0);
      31      296104 :         }
      32      296104 :         ::Serialize(s, Using<TxOutCompression>(txout.out));
      33      296104 :     }
      34             : 
      35             :     template<typename Stream>
      36       18097 :     void Unser(Stream &s, Coin& txout) {
      37       18097 :         uint32_t nCode = 0;
      38       18097 :         ::Unserialize(s, VARINT(nCode));
      39       18097 :         txout.nHeight = nCode >> 1;
      40       18097 :         txout.fCoinBase = nCode & 1;
      41       18097 :         if (txout.nHeight > 0) {
      42             :             // Old versions stored the version number for the last spend of
      43             :             // a transaction's outputs. Non-final spends were indicated with
      44             :             // height = 0.
      45       18097 :             unsigned int nVersionDummy;
      46       18097 :             ::Unserialize(s, VARINT(nVersionDummy));
      47       18097 :         }
      48       18097 :         ::Unserialize(s, Using<TxOutCompression>(txout.out));
      49       18097 :     }
      50             : };
      51             : 
      52             : /** Undo information for a CTransaction */
      53    22673348 : class CTxUndo
      54             : {
      55             : public:
      56             :     // undo information for all txins
      57             :     std::vector<Coin> vprevout;
      58             : 
      59      540867 :     SERIALIZE_METHODS(CTxUndo, obj) { READWRITE(Using<VectorFormatter<TxInUndoFormatter>>(obj.vprevout)); }
      60             : };
      61             : 
      62             : /** Undo information for a CBlock */
      63      315812 : class CBlockUndo
      64             : {
      65             : public:
      66             :     std::vector<CTxUndo> vtxundo; // for all but the coinbase
      67             : 
      68      572676 :     SERIALIZE_METHODS(CBlockUndo, obj) { READWRITE(obj.vtxundo); }
      69             : };
      70             : 
      71             : #endif // BITCOIN_UNDO_H

Generated by: LCOV version 1.15