Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
chonk.bench.cpp
Go to the documentation of this file.
1
6#include <benchmark/benchmark.h>
7#include <chrono>
8
17
18using namespace benchmark;
19using namespace bb;
20
21namespace {
22
26class ChonkBench : public benchmark::Fixture {
27 public:
28 // Number of function circuits to accumulate (based on Zac's target numbers)
29 static constexpr size_t NUM_ITERATIONS_MEDIUM_COMPLEXITY = 5;
30
31 void SetUp([[maybe_unused]] const ::benchmark::State& state) override
32 {
34 }
35};
36
40BENCHMARK_DEFINE_F(ChonkBench, VerificationOnly)(benchmark::State& state)
41{
42 size_t NUM_APP_CIRCUITS = 1;
43 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
44 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
45
46 for (auto _ : state) {
48 ChonkNativeVerifier verifier(vk_and_hash);
49 benchmark::DoNotOptimize(verifier.verify(proof));
50 }
51}
52
56BENCHMARK_DEFINE_F(ChonkBench, Full)(benchmark::State& state)
57{
58 size_t NUM_APP_CIRCUITS = static_cast<size_t>(state.range(0));
59 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
60
61 for (auto _ : state) {
63 accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
64 }
65}
66
70BENCHMARK_DEFINE_F(ChonkBench, ProofCompress)(benchmark::State& state)
71{
72 size_t NUM_APP_CIRCUITS = 1;
73 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
74 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
75
76 for (auto _ : state) {
77 benchmark::DoNotOptimize(ProofCompressor::compress_chonk_proof(proof));
78 }
79}
80
84BENCHMARK_DEFINE_F(ChonkBench, ProofDecompress)(benchmark::State& state)
85{
86 size_t NUM_APP_CIRCUITS = 1;
87 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
88 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
89
90 auto compressed = ProofCompressor::compress_chonk_proof(proof);
91 size_t mega_num_pub_inputs =
93
94 for (auto _ : state) {
95 benchmark::DoNotOptimize(ProofCompressor::decompress_chonk_proof(compressed, mega_num_pub_inputs));
96 }
97}
98
102BENCHMARK_DEFINE_F(ChonkBench, VerifyIndividual)(benchmark::State& state)
103{
104 const size_t num_proofs = static_cast<size_t>(state.range(0));
105 auto precomputed_vks = precompute_vks(1);
106
107 // Generate a single proof and reuse it N times
108 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(1, precomputed_vks);
109
110 for (auto _ : state) {
111 for (size_t i = 0; i < num_proofs; i++) {
112 ChonkNativeVerifier verifier(vk_and_hash);
113 benchmark::DoNotOptimize(verifier.verify(proof));
114 }
115 }
116}
117
118#define ARGS Arg(ChonkBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY)->Arg(2)
119
120BENCHMARK_REGISTER_F(ChonkBench, Full)->Unit(benchmark::kMillisecond)->ARGS;
121BENCHMARK_REGISTER_F(ChonkBench, VerificationOnly)->Unit(benchmark::kMillisecond);
122BENCHMARK_REGISTER_F(ChonkBench, ProofCompress)->Unit(benchmark::kMillisecond);
123BENCHMARK_REGISTER_F(ChonkBench, ProofDecompress)->Unit(benchmark::kMillisecond);
124BENCHMARK_REGISTER_F(ChonkBench, VerifyIndividual)->Unit(benchmark::kMillisecond)->Arg(1)->Arg(2)->Arg(4)->Arg(8);
125
129void bn254_point_decompression(benchmark::State& state)
130{
131 constexpr size_t NUM_POINTS = 1 << 17; // 131072 — typical circuit size
132
133 // Read compressed points from disk (32 bytes each, big-endian uint256_t)
134 auto compressed_buf = read_file(bb::srs::bb_crs_path() / "bn254_g1_compressed.dat", NUM_POINTS * sizeof(uint256_t));
136 for (size_t i = 0; i < NUM_POINTS; ++i) {
137 compressed[i] = from_buffer<uint256_t>(compressed_buf, i * sizeof(uint256_t));
138 }
139
140 for (auto _ : state) {
142 parallel_for([&](ThreadChunk chunk) {
143 for (auto i : chunk.range(NUM_POINTS)) {
144 points[i] = g1::affine_element::from_compressed(compressed[i]);
145 }
146 });
147 benchmark::DoNotOptimize(points);
148 }
149}
150BENCHMARK(bn254_point_decompression)->Unit(benchmark::kMillisecond);
151
152} // namespace
153
BENCHMARK_MAIN()
Verifier for Chonk IVC proofs (both native and recursive).
static std::vector< uint8_t > compress_chonk_proof(const ChonkProof &proof)
static ChonkProof decompress_chonk_proof(const std::vector< uint8_t > &compressed, size_t mega_num_public_inputs)
constexpr size_t NUM_POINTS
Definition fr.bench.cpp:127
#define GOOGLE_BB_BENCH_REPORTER(state)
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::pair< ChonkProof, std::shared_ptr< MegaZKFlavor::VKAndHash > > accumulate_and_prove_with_precomputed_vks(size_t num_app_circuits, auto &precomputed_vks, const bool large_first_app=true)
Perform a specified number of circuit accumulation rounds.
std::vector< std::shared_ptr< typename MegaFlavor::VerificationKey > > precompute_vks(const size_t num_app_circuits, const bool large_first_app=true)
std::vector< uint8_t > read_file(const std::string &filename, size_t bytes=0)
Definition file_io.hpp:31
BENCHMARK(bench_commit_structured_random_poly< curve::BN254 >) -> Unit(benchmark::kMillisecond)
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
Definition thread.cpp:111
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Computes Oink proof length from flavor traits.
auto range(size_t size, size_t offset=0) const
Definition thread.hpp:152