Skip to content

Commit 852aca5

Browse files
ProcessNextHeaders bench
1 parent fd06825 commit 852aca5

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/bench/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ add_executable(bench_bitcoin
2727
examples.cpp
2828
gcs_filter.cpp
2929
hashpadding.cpp
30+
header_sync.cpp
3031
index_blockfilter.cpp
3132
load_external.cpp
3233
lockedpool.cpp

src/bench/header_sync.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <bench/bench.h>
2+
#include <headerssync.h>
3+
#include <test/util/setup_common.h>
4+
#include <chainparams.h>
5+
#include <validation.h>
6+
#include <pow.h>
7+
8+
void FindProofOfWork(CBlockHeader& starting_header)
9+
{
10+
while (!CheckProofOfWork(starting_header.GetHash(), starting_header.nBits, Params().GetConsensus())) {
11+
++(starting_header.nNonce);
12+
}
13+
}
14+
15+
void GenerateHeaders(std::vector<CBlockHeader>& headers,
16+
size_t count, const uint256& starting_hash, const int nVersion, int prev_time,
17+
const uint256& merkle_root, const uint32_t nBits)
18+
{
19+
uint256 prev_hash = starting_hash;
20+
21+
while (headers.size() < count) {
22+
headers.emplace_back();
23+
CBlockHeader& next_header = headers.back();;
24+
next_header.nVersion = nVersion;
25+
next_header.hashPrevBlock = prev_hash;
26+
next_header.hashMerkleRoot = merkle_root;
27+
next_header.nTime = prev_time+1;
28+
next_header.nBits = nBits;
29+
30+
FindProofOfWork(next_header);
31+
prev_hash = next_header.GetHash();
32+
prev_time = next_header.nTime;
33+
}
34+
return;
35+
}
36+
37+
static void ProcessNextHeadersPresyncBench(benchmark::Bench& bench) {
38+
int target_blocks = 15000;
39+
int chain_work = target_blocks * 2;
40+
41+
auto testing_setup = MakeNoLogFileContext<const TestChain100Setup>(ChainType::REGTEST);
42+
43+
const CBlockIndex* chain_start = WITH_LOCK(::cs_main, return testing_setup->m_node.chainman->m_blockman.GetAllBlockIndices()).back();
44+
std::vector<CBlockHeader> chain;
45+
GenerateHeaders(chain, target_blocks, chain_start->GetBlockHash(),
46+
chain_start->nVersion, chain_start->nTime,
47+
ArithToUint256(0), chain_start->nBits);
48+
49+
bench.run([&] {
50+
std::vector<CBlockHeader> chain1 = chain;
51+
std::vector<CBlockHeader> chain2 = chain;
52+
HeadersSyncState* hss = new HeadersSyncState(0, Params().GetConsensus(), chain_start, chain_work);
53+
auto result = hss->ProcessNextHeaders(chain1, true);
54+
assert(result.success);
55+
assert(hss->GetState() == HeadersSyncState::State::REDOWNLOAD);
56+
auto result2 = hss->ProcessNextHeaders(chain2, true);
57+
assert(result2.success);
58+
assert(hss->GetState() == HeadersSyncState::State::FINAL);
59+
});
60+
}
61+
62+
BENCHMARK(ProcessNextHeadersPresyncBench, benchmark::PriorityLevel::HIGH);

0 commit comments

Comments
 (0)