24 const std::vector<CBlockHeader>& all_headers,
25 std::vector<CBlockHeader>& new_headers)
27 Assume(!new_headers.empty());
30 all_headers.empty() ? &genesis_header : &all_headers.back()};
32 for (
auto& header : new_headers) {
33 header.hashPrevBlock = prev_header->GetHash();
35 prev_header = &header;
60 const uint256 genesis_hash = genesis_header.GetHash();
70 std::vector<CBlockHeader> all_headers;
71 std::vector<CBlockHeader>::const_iterator redownloaded_it;
73 bool requested_more{
true};
75 while (requested_more) {
76 std::vector<CBlockHeader> headers;
80 if (presync || fuzzed_data_provider.
ConsumeBool()) {
82 if (!deser_headers || deser_headers->empty())
return;
88 headers.swap(*deser_headers);
89 }
else if (
auto num_headers_left{std::distance(redownloaded_it, all_headers.cend())}; num_headers_left > 0) {
92 auto begin_it{redownloaded_it};
94 headers.insert(headers.cend(), begin_it, redownloaded_it);
97 if (headers.empty())
return;
101 if (result.request_more) {
103 all_headers.insert(all_headers.cend(), headers.cbegin(), headers.cend());
107 redownloaded_it = all_headers.cbegin();