LCOV - code coverage report
Current view: top level - src/primitives - block.h (source / functions) Coverage Total Hit
Test: total_coverage.info Lines: 100.0 % 50 50
Test Date: 2026-02-04 05:05:50 Functions: 100.0 % 31 31
Branches: 51.4 % 74 38

             Branch data     Line data    Source code
       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                 :     1096758 :     CBlockHeader()
      38                 :     1096758 :     {
      39                 :     1096758 :         SetNull();
      40                 :     1096758 :     }
      41                 :             : 
      42   [ #  #  #  # ]:    41094966 :     SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
      43                 :             : 
      44                 :     1758893 :     void SetNull()
      45                 :             :     {
      46                 :     1758893 :         nVersion = 0;
      47                 :     1758893 :         hashPrevBlock.SetNull();
      48                 :     1758893 :         hashMerkleRoot.SetNull();
      49                 :     1758893 :         nTime = 0;
      50                 :     1758893 :         nBits = 0;
      51                 :     1758893 :         nNonce = 0;
      52                 :     1758893 :     }
      53                 :             : 
      54                 :      171716 :     bool IsNull() const
      55                 :             :     {
      56 [ +  + ][ +  -  :      171716 :         return (nBits == 0);
          +  -  +  -  +  
                      - ]
      57                 :             :     }
      58                 :             : 
      59                 :             :     uint256 GetHash() const;
      60                 :             : 
      61                 :      196796 :     NodeSeconds Time() const
      62                 :             :     {
      63                 :      196796 :         return NodeSeconds{std::chrono::seconds{nTime}};
      64                 :             :     }
      65                 :             : 
      66                 :      626662 :     int64_t GetBlockTime() const
      67                 :             :     {
      68         [ +  + ]:      626662 :         return (int64_t)nTime;
      69                 :             :     }
      70                 :             : };
      71                 :             : 
      72                 :             : 
      73         [ +  + ]:      706128 : 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                 :      356705 :     CBlock()
      85                 :      356705 :     {
      86                 :      356705 :         SetNull();
      87                 :      356705 :     }
      88                 :             : 
      89                 :      153150 :     CBlock(const CBlockHeader &header)
      90                 :      153150 :     {
      91                 :      153150 :         SetNull();
      92                 :      153150 :         *(static_cast<CBlockHeader*>(this)) = header;
      93                 :      153150 :     }
      94                 :             : 
      95   [ #  #  #  # ]:     2604145 :     SERIALIZE_METHODS(CBlock, obj)
      96                 :             :     {
      97                 :     1340524 :         READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
      98                 :     1340516 :     }
      99                 :             : 
     100                 :      644972 :     void SetNull()
     101                 :             :     {
     102                 :      644972 :         CBlockHeader::SetNull();
     103                 :      644972 :         vtx.clear();
     104                 :      644972 :         fChecked = false;
     105                 :      644972 :         m_checked_witness_commitment = false;
     106                 :      644972 :         m_checked_merkle_root = false;
     107                 :      644972 :     }
     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   [ +  -  #  #  :      150471 : 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                 :       24041 :     explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
     132                 :             : 
     133                 :       85778 :     SERIALIZE_METHODS(CBlockLocator, obj)
     134                 :             :     {
     135                 :       42889 :         int nVersion = DUMMY_VERSION;
     136                 :       42889 :         READWRITE(nVersion);
     137                 :       42889 :         READWRITE(obj.vHave);
     138                 :       42889 :     }
     139                 :             : 
     140                 :          50 :     void SetNull()
     141                 :             :     {
     142         [ -  + ]:         135 :         vHave.clear();
     143                 :             :     }
     144                 :             : 
     145                 :       98685 :     bool IsNull() const
     146                 :             :     {
     147   [ +  +  +  + ]:       98685 :         return vHave.empty();
           [ +  +  #  # ]
     148                 :             :     }
     149                 :             : };
     150                 :             : 
     151                 :             : #endif // BITCOIN_PRIMITIVES_BLOCK_H
        

Generated by: LCOV version 2.0-1