Coverage Report

Created: 2025-06-10 13:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/bitcoin/src/primitives/block.h
Line
Count
Source
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
4.70M
    {
34
4.70M
        SetNull();
35
4.70M
    }
36
37
51.7M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<ParamsStream<SizeComputer&, TransactionSerParams>, CBlockHeader const, ActionSerialize>(CBlockHeader const&, ParamsStream<SizeComputer&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
37
8.96M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<VectorWriter, CBlockHeader const, ActionSerialize>(CBlockHeader const&, VectorWriter&, ActionSerialize)
Line
Count
Source
37
2.93k
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<ParamsStream<VectorWriter&, TransactionSerParams>, CBlockHeader const, ActionSerialize>(CBlockHeader const&, ParamsStream<VectorWriter&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
37
8.46k
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<DataStream, CBlockHeader, ActionUnserialize>(CBlockHeader&, DataStream&, ActionUnserialize)
Line
Count
Source
37
21.8k
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CBlockHeader, ActionUnserialize>(CBlockHeader&, ParamsStream<DataStream&, TransactionSerParams>&, ActionUnserialize)
Line
Count
Source
37
2.24M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<ParamsStream<SpanReader&, TransactionSerParams>, CBlockHeader, ActionUnserialize>(CBlockHeader&, ParamsStream<SpanReader&, TransactionSerParams>&, ActionUnserialize)
Line
Count
Source
37
23.6k
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>, CBlockHeader const, ActionSerialize>(CBlockHeader const&, ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
37
2.24M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
void CBlockHeader::SerializationOps<DataStream, CBlockHeader const, ActionSerialize>(CBlockHeader const&, DataStream&, ActionSerialize)
Line
Count
Source
37
2.22M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
Unexecuted instantiation: void CBlockHeader::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CBlockHeader const, ActionSerialize>(CBlockHeader const&, ParamsStream<DataStream&, TransactionSerParams>&, ActionSerialize)
Unexecuted instantiation: void CBlockHeader::SerializationOps<BufferedFile, CBlockHeader, ActionUnserialize>(CBlockHeader&, BufferedFile&, ActionUnserialize)
Unexecuted instantiation: void CBlockHeader::SerializationOps<ParamsStream<BufferedFile&, TransactionSerParams>, CBlockHeader, ActionUnserialize>(CBlockHeader&, ParamsStream<BufferedFile&, TransactionSerParams>&, ActionUnserialize)
Unexecuted instantiation: void CBlockHeader::SerializationOps<SizeComputer, CBlockHeader const, ActionSerialize>(CBlockHeader const&, SizeComputer&, ActionSerialize)
Unexecuted instantiation: void CBlockHeader::SerializationOps<AutoFile, CBlockHeader, ActionUnserialize>(CBlockHeader&, AutoFile&, ActionUnserialize)
void CBlockHeader::SerializationOps<HashWriter, CBlockHeader const, ActionSerialize>(CBlockHeader const&, HashWriter&, ActionSerialize)
Line
Count
Source
37
36.0M
    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
38
39
    void SetNull()
40
7.13M
    {
41
7.13M
        nVersion = 0;
42
7.13M
        hashPrevBlock.SetNull();
43
7.13M
        hashMerkleRoot.SetNull();
44
7.13M
        nTime = 0;
45
7.13M
        nBits = 0;
46
7.13M
        nNonce = 0;
47
7.13M
    }
48
49
    bool IsNull() const
50
0
    {
51
0
        return (nBits == 0);
52
0
    }
53
54
    uint256 GetHash() const;
55
56
    NodeSeconds Time() const
57
2.24M
    {
58
2.24M
        return NodeSeconds{std::chrono::seconds{nTime}};
59
2.24M
    }
60
61
    int64_t GetBlockTime() const
62
6.71M
    {
63
6.71M
        return (int64_t)nTime;
64
6.71M
    }
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
2.40M
    {
81
2.40M
        SetNull();
82
2.40M
    }
83
84
    CBlock(const CBlockHeader &header)
85
5.84k
    {
86
5.84k
        SetNull();
87
5.84k
        *(static_cast<CBlockHeader*>(this)) = header;
88
5.84k
    }
89
90
    SERIALIZE_METHODS(CBlock, obj)
91
13.4M
    {
92
13.4M
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
13.4M
    }
void CBlock::SerializationOps<ParamsStream<SizeComputer&, TransactionSerParams>, CBlock const, ActionSerialize>(CBlock const&, ParamsStream<SizeComputer&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
91
8.96M
    {
92
8.96M
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
8.96M
    }
void CBlock::SerializationOps<ParamsStream<VectorWriter&, TransactionSerParams>, CBlock const, ActionSerialize>(CBlock const&, ParamsStream<VectorWriter&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
91
8.46k
    {
92
8.46k
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
8.46k
    }
void CBlock::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CBlock, ActionUnserialize>(CBlock&, ParamsStream<DataStream&, TransactionSerParams>&, ActionUnserialize)
Line
Count
Source
91
2.24M
    {
92
2.24M
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
2.24M
    }
void CBlock::SerializationOps<ParamsStream<SpanReader&, TransactionSerParams>, CBlock, ActionUnserialize>(CBlock&, ParamsStream<SpanReader&, TransactionSerParams>&, ActionUnserialize)
Line
Count
Source
91
23.6k
    {
92
23.6k
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
23.6k
    }
void CBlock::SerializationOps<ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>, CBlock const, ActionSerialize>(CBlock const&, ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>&, ActionSerialize)
Line
Count
Source
91
2.24M
    {
92
2.24M
        READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93
2.24M
    }
Unexecuted instantiation: void CBlock::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CBlock const, ActionSerialize>(CBlock const&, ParamsStream<DataStream&, TransactionSerParams>&, ActionSerialize)
Unexecuted instantiation: void CBlock::SerializationOps<ParamsStream<BufferedFile&, TransactionSerParams>, CBlock, ActionUnserialize>(CBlock&, ParamsStream<BufferedFile&, TransactionSerParams>&, ActionUnserialize)
94
95
    void SetNull()
96
2.43M
    {
97
2.43M
        CBlockHeader::SetNull();
98
2.43M
        vtx.clear();
99
2.43M
        fChecked = false;
100
2.43M
        m_checked_witness_commitment = false;
101
2.43M
        m_checked_merkle_root = false;
102
2.43M
    }
103
104
    CBlockHeader GetBlockHeader() const
105
2.24M
    {
106
2.24M
        CBlockHeader block;
107
2.24M
        block.nVersion       = nVersion;
108
2.24M
        block.hashPrevBlock  = hashPrevBlock;
109
2.24M
        block.hashMerkleRoot = hashMerkleRoot;
110
2.24M
        block.nTime          = nTime;
111
2.24M
        block.nBits          = nBits;
112
2.24M
        block.nNonce         = nNonce;
113
2.24M
        return block;
114
2.24M
    }
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
106k
    CBlockLocator() = default;
137
138
167k
    explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
139
140
    SERIALIZE_METHODS(CBlockLocator, obj)
141
209k
    {
142
209k
        int nVersion = DUMMY_VERSION;
143
209k
        READWRITE(nVersion);
144
209k
        READWRITE(obj.vHave);
145
209k
    }
void CBlockLocator::SerializationOps<VectorWriter, CBlockLocator const, ActionSerialize>(CBlockLocator const&, VectorWriter&, ActionSerialize)
Line
Count
Source
141
91.6k
    {
142
91.6k
        int nVersion = DUMMY_VERSION;
143
91.6k
        READWRITE(nVersion);
144
91.6k
        READWRITE(obj.vHave);
145
91.6k
    }
void CBlockLocator::SerializationOps<DataStream, CBlockLocator, ActionUnserialize>(CBlockLocator&, DataStream&, ActionUnserialize)
Line
Count
Source
141
44.9k
    {
142
44.9k
        int nVersion = DUMMY_VERSION;
143
44.9k
        READWRITE(nVersion);
144
44.9k
        READWRITE(obj.vHave);
145
44.9k
    }
void CBlockLocator::SerializationOps<DataStream, CBlockLocator const, ActionSerialize>(CBlockLocator const&, DataStream&, ActionSerialize)
Line
Count
Source
141
72.8k
    {
142
72.8k
        int nVersion = DUMMY_VERSION;
143
72.8k
        READWRITE(nVersion);
144
72.8k
        READWRITE(obj.vHave);
145
72.8k
    }
146
147
    void SetNull()
148
22.1k
    {
149
22.1k
        vHave.clear();
150
22.1k
    }
151
152
    bool IsNull() const
153
79.1k
    {
154
79.1k
        return vHave.empty();
155
79.1k
    }
156
};
157
158
#endif // BITCOIN_PRIMITIVES_BLOCK_H