31 : m_id(id), m_consensus_params(consensus_params),
32 m_chain_start(chain_start),
33 m_minimum_required_work(minimum_required_work),
34 m_current_chain_work(chain_start->nChainWork),
36 m_last_header_received(m_chain_start->GetBlockHeader()),
37 m_current_height(chain_start->
nHeight) {
55 "Initial headers sync started with peer=%d: height=%i, "
56 "max_commitments=%i, min_work=%s\n",
85 const std::vector<CBlockHeader> &received_headers,
86 const bool full_headers_message) {
89 Assume(!received_headers.empty());
90 if (received_headers.empty()) {
117 "Initial headers sync aborted with peer=%d: incomplete "
118 "headers message at height=%i (presync phase)\n",
128 for (
const auto &hdr : received_headers) {
147 "Initial headers sync complete with peer=%d: "
148 "releasing all at height=%i (redownload phase)\n",
150 }
else if (full_headers_message) {
160 "Initial headers sync aborted with peer=%d: incomplete "
161 "headers message at height=%i (redownload phase)\n",
174 const std::vector<CBlockHeader> &headers) {
176 Assume(headers.size() > 0);
177 if (headers.size() == 0) {
192 "Initial headers sync aborted with peer=%d: non-continuous "
193 "headers at height=%i (presync phase)\n",
200 for (
const auto &hdr : headers) {
214 "Initial headers sync transition with peer=%d: reached "
215 "sufficient work at height=%i, redownloading from height=%i\n",
238 LogPrintf(
"Initial headers sync aborted with peer=%d: invalid "
239 "difficulty transition at height=%i (presync phase)\n",
252 LogPrintf(
"Initial headers sync aborted with peer=%d: exceeded max "
253 "commitments at height=%i (presync phase)\n",
279 "Initial headers sync aborted with peer=%d: non-continuous "
280 "headers at height=%i (redownload phase)\n",
286 uint32_t previous_nBits{0};
294 previous_nBits, header.
nBits)) {
296 "Initial headers sync aborted with peer=%d: invalid "
297 "difficulty transition at height=%i (redownload phase)\n",
319 "Initial headers sync aborted with peer=%d: commitment "
320 "overrun at height=%i (redownload phase)\n",
329 if (commitment != expected_commitment) {
331 "Initial headers sync aborted with peer=%d: commitment "
332 "mismatch at height=%i (redownload phase)\n",
347 std::vector<CBlockHeader> ret;
372 std::vector<BlockHash> locator;
386 locator.insert(locator.end(), chain_start_locator.begin(),
387 chain_start_locator.end());
arith_uint256 GetBlockProof(const CBlockIndex &block)
std::vector< BlockHash > LocatorEntries(const CBlockIndex *index)
Construct a list of hash entries to put in a locator.
static constexpr int64_t MAX_FUTURE_BLOCK_TIME
Maximum amount of time that a block timestamp is allowed to exceed the current network-adjusted time ...
#define Assume(val)
Assume is the identity function.
The block chain is a tree shaped structure starting with the genesis block at the root,...
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
int64_t GetMedianTimePast() const
BlockHash GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
256-bit unsigned big integer.
std::string ToString() const
size_type size() const noexcept
Count the number of bits in the container.
#define LogPrint(category,...)
bool PermittedDifficultyTransition(const Consensus::Params ¶ms, int64_t height, uint32_t old_nbits, uint32_t new_nbits)
Return false if the proof-of-work requirement specified by new_nbits at a given height is not possibl...
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Parameters that influence chain consensus.
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
NodeClock::time_point GetAdjustedTime()