Branch data Line data Source code
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 : 1047116 : CBlockHeader()
33 : 1047116 : {
34 : 1047116 : SetNull();
35 : 1047116 : }
36 : :
37 : 9689812 : SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
38 : :
39 : 1657320 : void SetNull()
40 : : {
41 : 1657320 : nVersion = 0;
42 : 1657320 : hashPrevBlock.SetNull();
43 : 1657320 : hashMerkleRoot.SetNull();
44 : 1657320 : nTime = 0;
45 : 1657320 : nBits = 0;
46 : 1657320 : nNonce = 0;
47 : 1657320 : }
48 : :
49 : 168135 : bool IsNull() const
50 : : {
51 [ + - + - : 168135 : return (nBits == 0);
+ - + - ]
[ + + ]
52 : : }
53 : :
54 : : uint256 GetHash() const;
55 : :
56 : 181805 : NodeSeconds Time() const
57 : : {
58 : 181805 : return NodeSeconds{std::chrono::seconds{nTime}};
59 : : }
60 : :
61 : 579427 : int64_t GetBlockTime() const
62 : : {
63 [ + + ]: 579427 : return (int64_t)nTime;
64 : : }
65 : : };
66 : :
67 : :
68 [ + - + - : 646139 : 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 : 302983 : CBlock()
80 : 302983 : {
81 : 302983 : SetNull();
82 : 302983 : }
83 : :
84 : 156303 : CBlock(const CBlockHeader &header)
85 : 156303 : {
86 : 156303 : SetNull();
87 : 156303 : *(static_cast<CBlockHeader*>(this)) = header;
88 : 156303 : }
89 : :
90 : 2635580 : SERIALIZE_METHODS(CBlock, obj)
91 : : {
92 : 1358060 : READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
93 : 1358055 : }
94 : :
95 : 589301 : void SetNull()
96 : : {
97 : 589301 : CBlockHeader::SetNull();
98 : 589301 : vtx.clear();
99 : 589301 : fChecked = false;
100 : 589301 : m_checked_witness_commitment = false;
101 : 589301 : m_checked_merkle_root = false;
102 : 589301 : }
103 : :
104 : 51721 : CBlockHeader GetBlockHeader() const
105 : : {
106 : 51721 : CBlockHeader block;
107 : 51721 : block.nVersion = nVersion;
108 : 51721 : block.hashPrevBlock = hashPrevBlock;
109 : 51721 : block.hashMerkleRoot = hashMerkleRoot;
110 : 51721 : block.nTime = nTime;
111 : 51721 : block.nBits = nBits;
112 : 51721 : block.nNonce = nNonce;
113 : 51721 : 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 [ + - + - ]: 22363 : 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 [ + - ]: 1049 : CBlockLocator() = default;
137 : :
138 : 6254 : explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
139 : :
140 : 4396 : SERIALIZE_METHODS(CBlockLocator, obj)
141 : : {
142 : 8510 : int nVersion = DUMMY_VERSION;
143 : 8510 : READWRITE(nVersion);
144 : 8510 : READWRITE(obj.vHave);
145 : 4396 : }
146 : :
147 : 96 : void SetNull()
148 : : {
149 [ - + + - : 166 : vHave.clear();
- + ]
150 : : }
151 : :
152 : 6749 : bool IsNull() const
153 : : {
154 [ + + + + ]: 6749 : return vHave.empty();
[ + + ][ - -
+ - + - ]
155 : : }
156 : : };
157 : :
158 : : #endif // BITCOIN_PRIMITIVES_BLOCK_H
|