|
| 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