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