checkblock.cpp raw
1 // Copyright (c) 2016-2022 The Limenka 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 #include <bench/bench.h>
6 #include <bench/data/block413567.raw.h>
7 #include <chainparams.h>
8 #include <common/args.h>
9 #include <consensus/validation.h>
10 #include <primitives/block.h>
11 #include <primitives/transaction.h>
12 #include <serialize.h>
13 #include <span.h>
14 #include <streams.h>
15 #include <util/chaintype.h>
16 #include <validation.h>
17
18 #include <cassert>
19 #include <cstddef>
20 #include <memory>
21 #include <optional>
22 #include <vector>
23
24 // These are the two major time-sinks which happen after we have fully received
25 // a block off the wire, but before we can relay the block on to peers using
26 // compact block relay.
27
28 static void DeserializeBlockTest(benchmark::Bench& bench)
29 {
30 DataStream stream(benchmark::data::block413567);
31 std::byte a{0};
32 stream.write({&a, 1}); // Prevent compaction
33
34 bench.unit("block").run([&] {
35 CBlock block;
36 stream >> TX_WITH_WITNESS(block);
37 bool rewound = stream.Rewind(benchmark::data::block413567.size());
38 assert(rewound);
39 });
40 }
41
42 static void DeserializeAndCheckBlockTest(benchmark::Bench& bench)
43 {
44 DataStream stream(benchmark::data::block413567);
45 std::byte a{0};
46 stream.write({&a, 1}); // Prevent compaction
47
48 ArgsManager bench_args;
49 const auto chainParams = CreateChainParams(bench_args, ChainType::MAIN);
50
51 bench.unit("block").run([&] {
52 CBlock block; // Note that CBlock caches its checked state, so we need to recreate it here
53 stream >> TX_WITH_WITNESS(block);
54 bool rewound = stream.Rewind(benchmark::data::block413567.size());
55 assert(rewound);
56
57 BlockValidationState validationState;
58 bool checked = CheckBlock(block, validationState, chainParams->GetConsensus());
59 assert(checked);
60 });
61 }
62
63 BENCHMARK(DeserializeBlockTest, benchmark::PriorityLevel::HIGH);
64 BENCHMARK(DeserializeAndCheckBlockTest, benchmark::PriorityLevel::HIGH);
65