Bitcoin Core 31.99.0
P2P Digital Currency
headerssync.h
Go to the documentation of this file.
1// Copyright (c) 2022-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_HEADERSSYNC_H
6#define BITCOIN_HEADERSSYNC_H
7
8#include <arith_uint256.h>
9#include <chain.h>
10#include <consensus/params.h>
11#include <net.h>
12#include <primitives/block.h>
13#include <uint256.h>
14#include <util/bitdeque.h>
15#include <util/hasher.h>
16
17#include <deque>
18#include <stdexcept>
19#include <vector>
20
21// A compressed CBlockHeader, which leaves out the prevhash
23 // header
24 int32_t nVersion{0};
26 uint32_t nTime{0};
27 uint32_t nBits{0};
28 uint32_t nNonce{0};
29
31 {
33 }
34
35 explicit CompressedHeader(const CBlockHeader& header)
36 : nVersion{header.nVersion},
38 nTime{header.nTime},
39 nBits{header.nBits},
40 nNonce{header.nNonce}
41 {
42 }
43
44 CBlockHeader GetFullHeader(const uint256& hash_prev_block) const
45 {
47 ret.nVersion = nVersion;
48 ret.hashPrevBlock = hash_prev_block;
49 ret.hashMerkleRoot = hashMerkleRoot;
50 ret.nTime = nTime;
51 ret.nBits = nBits;
52 ret.nNonce = nNonce;
53 return ret;
54 };
55};
56
104{
105public:
106 struct SystemClockError : std::runtime_error {
107 using std::runtime_error::runtime_error;
108 };
109
110 ~HeadersSyncState() = default;
111
112 enum class State {
116 PRESYNC,
120 REDOWNLOAD,
122 FINAL
123 };
124
126 State GetState() const { return m_download_state; }
127
129 int64_t GetPresyncHeight() const { return m_current_height; }
130
132 uint32_t GetPresyncTime() const { return m_last_header_received.nTime; }
133
136
147 HeadersSyncState(NodeId id, const Consensus::Params& consensus_params,
148 const HeadersSyncParams& params, const CBlockIndex& chain_start,
149 const arith_uint256& minimum_required_work);
150
153 std::vector<CBlockHeader> pow_validated_headers;
154 bool success{false};
155 bool request_more{false};
156 };
157
178 ProcessingResult ProcessNextHeaders(std::span<const CBlockHeader>
179 received_headers, bool full_headers_message);
180
187
188protected:
193 const size_t m_commit_offset;
194
195private:
199 void Finalize();
200
208 bool ValidateAndStoreHeadersCommitments(std::span<const CBlockHeader> headers);
209
211 bool ValidateAndProcessSingleHeader(const CBlockHeader& current);
212
216
218 std::vector<CBlockHeader> PopHeadersReadyForAcceptance();
219
220private:
223
226
229
232
235
238
241
244
250 uint64_t m_max_commitments{0};
251
254
257
261 std::deque<CompressedHeader> m_redownloaded_headers;
262
265
271
277
280
286
289};
290
291#endif // BITCOIN_HEADERSSYNC_H
int ret
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:27
uint32_t nTime
Definition: block.h:33
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: chain.h:94
HeadersSyncState:
Definition: headerssync.h:104
arith_uint256 GetPresyncWork() const
Return the amount of work in the chain received during the PRESYNC phase.
Definition: headerssync.h:135
uint64_t m_max_commitments
m_max_commitments is a bound we calculate on how long an honest peer's chain could be,...
Definition: headerssync.h:250
arith_uint256 m_redownload_chain_work
The accumulated work on the redownloaded chain.
Definition: headerssync.h:279
@ PRESYNC
PRESYNC means the peer has not yet demonstrated their chain has sufficient work and we're only buildi...
bool ValidateAndStoreHeadersCommitments(std::span< const CBlockHeader > headers)
Only called in PRESYNC.
CBlockHeader m_last_header_received
Store the latest header received while in PRESYNC (initialized to m_chain_start)
Definition: headerssync.h:253
arith_uint256 m_current_chain_work
Work that we've seen so far on the peer's chain.
Definition: headerssync.h:237
int64_t m_current_height
Height of m_last_header_received.
Definition: headerssync.h:256
HeadersSyncState(NodeId id, const Consensus::Params &consensus_params, const HeadersSyncParams &params, const CBlockIndex &chain_start, const arith_uint256 &minimum_required_work)
Construct a HeadersSyncState object representing a headers sync via this download-twice mechanism).
Definition: headerssync.cpp:17
uint32_t GetPresyncTime() const
Return the block timestamp of the last header received during the PRESYNC phase.
Definition: headerssync.h:132
const arith_uint256 m_minimum_required_work
Minimum work that we're looking for on this chain.
Definition: headerssync.h:234
std::vector< CBlockHeader > PopHeadersReadyForAcceptance()
Return a set of headers that satisfy our proof-of-work threshold.
const Consensus::Params & m_consensus_params
We use the consensus params in our anti-DoS calculations.
Definition: headerssync.h:225
bool ValidateAndProcessSingleHeader(const CBlockHeader &current)
In PRESYNC, process and update state for a single header.
~HeadersSyncState()=default
State m_download_state
Current state of our headers sync.
Definition: headerssync.h:288
bool ValidateAndStoreRedownloadedHeader(const CBlockHeader &header)
In REDOWNLOAD, check a header's commitment (if applicable) and add to buffer for later processing.
bitdeque m_header_commitments
A queue of commitment bits, created during the 1st phase, and verified during the 2nd.
Definition: headerssync.h:243
const NodeId m_id
NodeId of the peer (used for log messages)
Definition: headerssync.h:222
ProcessingResult ProcessNextHeaders(std::span< const CBlockHeader > received_headers, bool full_headers_message)
Process a batch of headers, once a sync via this mechanism has started.
Definition: headerssync.cpp:76
int64_t m_redownload_buffer_last_height
Height of last header in m_redownloaded_headers.
Definition: headerssync.h:264
std::deque< CompressedHeader > m_redownloaded_headers
During phase 2 (REDOWNLOAD), we buffer redownloaded headers in memory until enough commitments have b...
Definition: headerssync.h:261
State GetState() const
Return the current state of our download.
Definition: headerssync.h:126
bool m_process_all_remaining_headers
Set this to true once we encounter the target blockheader during phase 2 (REDOWNLOAD).
Definition: headerssync.h:285
const HeadersSyncParams m_params
Parameters that impact memory usage for a given chain, especially when attacked.
Definition: headerssync.h:228
void Finalize()
Clear out all download state that might be in progress (freeing any used memory), and mark this objec...
Definition: headerssync.cpp:59
uint256 m_redownload_buffer_last_hash
Hash of last header in m_redownloaded_headers (initialized to m_chain_start).
Definition: headerssync.h:270
uint256 m_redownload_buffer_first_prev_hash
The hashPrevBlock entry for the first header in m_redownloaded_headers We need this to reconstruct th...
Definition: headerssync.h:276
const CBlockIndex & m_chain_start
Store the last block in our block index that the peer's chain builds from.
Definition: headerssync.h:231
const size_t m_commit_offset
The (secret) offset on the heights for which to create commitments.
Definition: headerssync.h:193
const SaltedUint256Hasher m_hasher
m_hasher is a salted hasher for making our 1-bit commitments to headers we've seen.
Definition: headerssync.h:240
int64_t GetPresyncHeight() const
Return the height reached during the PRESYNC phase.
Definition: headerssync.h:129
CBlockLocator NextHeadersRequestLocator() const
Issue the next GETHEADERS message to our peer.
256-bit unsigned big integer.
constexpr void SetNull()
Definition: uint256.h:57
Class that mimics std::deque<bool>, but with std::vector<bool>'s bit packing.
Definition: bitdeque.h:24
256-bit opaque blob.
Definition: uint256.h:196
HTTPHeaders headers
int64_t NodeId
Definition: net.h:105
@ FINAL
Neither this tx nor a mempool ancestor signals rbf.
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:117
uint32_t nBits
Definition: headerssync.h:27
uint32_t nTime
Definition: headerssync.h:26
uint32_t nNonce
Definition: headerssync.h:28
uint256 hashMerkleRoot
Definition: headerssync.h:25
int32_t nVersion
Definition: headerssync.h:24
CBlockHeader GetFullHeader(const uint256 &hash_prev_block) const
Definition: headerssync.h:44
CompressedHeader(const CBlockHeader &header)
Definition: headerssync.h:35
Parameters that influence chain consensus.
Definition: params.h:88
Configuration for headers sync memory usage.
Definition: chainparams.h:64
Result data structure for ProcessNextHeaders.
Definition: headerssync.h:152
std::vector< CBlockHeader > pow_validated_headers
Definition: headerssync.h:153