/ src / primitives / block.h
block.h
  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