block.h raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-present 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_PRIMITIVES_BLOCK_H
   7  #define BITCOIN_PRIMITIVES_BLOCK_H
   8  
   9  #include <primitives/transaction.h>
  10  #include <serialize.h>
  11  #include <uint256.h>
  12  #include <util/time.h>
  13  
  14  #include <cstdint>
  15  #include <string>
  16  #include <utility>
  17  #include <vector>
  18  
  19  /** Nodes collect new transactions into a block, hash them into a hash tree,
  20   * and scan through nonce values to make the block's hash satisfy proof-of-work
  21   * requirements.  When they solve the proof-of-work, they broadcast the block
  22   * to everyone and the block is added to the block chain.  The first transaction
  23   * in the block is a special one that creates a new coin owned by the creator
  24   * of the block.
  25   */
  26  class CBlockHeader
  27  {
  28  public:
  29      // header
  30      int32_t nVersion;
  31      uint256 hashPrevBlock;
  32      uint256 hashMerkleRoot;
  33      uint32_t nTime;
  34      uint32_t nBits;
  35      uint32_t nNonce;
  36  
  37      CBlockHeader()
  38      {
  39          SetNull();
  40      }
  41  
  42      SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
  43  
  44      void SetNull()
  45      {
  46          nVersion = 0;
  47          hashPrevBlock.SetNull();
  48          hashMerkleRoot.SetNull();
  49          nTime = 0;
  50          nBits = 0;
  51          nNonce = 0;
  52      }
  53  
  54      bool IsNull() const
  55      {
  56          return (nBits == 0);
  57      }
  58  
  59      uint256 GetHash() const;
  60  
  61      NodeSeconds Time() const
  62      {
  63          return NodeSeconds{std::chrono::seconds{nTime}};
  64      }
  65  
  66      int64_t GetBlockTime() const
  67      {
  68          return (int64_t)nTime;
  69      }
  70  };
  71  
  72  
  73  class CBlock : public CBlockHeader
  74  {
  75  public:
  76      // network and disk
  77      std::vector<CTransactionRef> vtx;
  78  
  79      // Memory-only flags for caching expensive checks
  80      mutable bool fChecked;                            // CheckBlock()
  81      mutable bool m_checked_witness_commitment{false}; // CheckWitnessCommitment()
  82      mutable bool m_checked_merkle_root{false};        // CheckMerkleRoot()
  83  
  84      CBlock()
  85      {
  86          SetNull();
  87      }
  88  
  89      CBlock(const CBlockHeader &header)
  90      {
  91          SetNull();
  92          *(static_cast<CBlockHeader*>(this)) = header;
  93      }
  94  
  95      SERIALIZE_METHODS(CBlock, obj)
  96      {
  97          READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
  98      }
  99  
 100      void SetNull()
 101      {
 102          CBlockHeader::SetNull();
 103          vtx.clear();
 104          fChecked = false;
 105          m_checked_witness_commitment = false;
 106          m_checked_merkle_root = false;
 107      }
 108  
 109      std::string ToString() const;
 110  };
 111  
 112  /** Describes a place in the block chain to another node such that if the
 113   * other node doesn't have the same branch, it can find a recent common trunk.
 114   * The further back it is, the further before the fork it may be.
 115   */
 116  struct CBlockLocator
 117  {
 118      /** Historically CBlockLocator's version field has been written to network
 119       * streams as the negotiated protocol version and to disk streams as the
 120       * client version, but the value has never been used.
 121       *
 122       * Hard-code to the highest protocol version ever written to a network stream.
 123       * SerParams can be used if the field requires any meaning in the future,
 124       **/
 125      static constexpr int DUMMY_VERSION = 70016;
 126  
 127      std::vector<uint256> vHave;
 128  
 129      CBlockLocator() = default;
 130  
 131      explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
 132  
 133      SERIALIZE_METHODS(CBlockLocator, obj)
 134      {
 135          int nVersion = DUMMY_VERSION;
 136          READWRITE(nVersion);
 137          READWRITE(obj.vHave);
 138      }
 139  
 140      void SetNull()
 141      {
 142          vHave.clear();
 143      }
 144  
 145      bool IsNull() const
 146      {
 147          return vHave.empty();
 148      }
 149  };
 150  
 151  #endif // BITCOIN_PRIMITIVES_BLOCK_H
 152