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
14
15using namespace benchmark;
16using namespace bb;
17
18namespace {
19
23class ChonkBench : public benchmark::Fixture {
24 public:
25 // Number of function circuits to accumulate (based on Zac's target numbers)
26 static constexpr size_t NUM_ITERATIONS_MEDIUM_COMPLEXITY = 5;
27
28 void SetUp([[maybe_unused]] const ::benchmark::State& state) override
29 {
31 }
32};
33
37BENCHMARK_DEFINE_F(ChonkBench, VerificationOnly)(benchmark::State& state)
38{
39 size_t NUM_APP_CIRCUITS = 1;
40 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
41 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
42
43 for (auto _ : state) {
45 ChonkNativeVerifier verifier(vk_and_hash);
46 benchmark::DoNotOptimize(verifier.verify(proof));
47 }
48}
49
53BENCHMARK_DEFINE_F(ChonkBench, Full)(benchmark::State& state)
54{
55 size_t NUM_APP_CIRCUITS = static_cast<size_t>(state.range(0));
56 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
57
58 for (auto _ : state) {
60 accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
61 }
62}
63
67BENCHMARK_DEFINE_F(ChonkBench, ProofCompress)(benchmark::State& state)
68{
69 size_t NUM_APP_CIRCUITS = 1;
70 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
71 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
72
73 for (auto _ : state) {
74 benchmark::DoNotOptimize(ProofCompressor::compress_chonk_proof(proof));
75 }
76}
77
81BENCHMARK_DEFINE_F(ChonkBench, ProofDecompress)(benchmark::State& state)
82{
83 size_t NUM_APP_CIRCUITS = 1;
84 auto precomputed_vks = precompute_vks(NUM_APP_CIRCUITS);
85 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(NUM_APP_CIRCUITS, precomputed_vks);
86
87 auto compressed = ProofCompressor::compress_chonk_proof(proof);
88 size_t mega_num_pub_inputs = proof.mega_proof.size() - ChonkProof::HIDING_KERNEL_PROOF_LENGTH_WITHOUT_PUBLIC_INPUTS;
89
90 for (auto _ : state) {
91 benchmark::DoNotOptimize(ProofCompressor::decompress_chonk_proof(compressed, mega_num_pub_inputs));
92 }
93}
94
98BENCHMARK_DEFINE_F(ChonkBench, VerifyIndividual)(benchmark::State& state)
99{
100 const size_t num_proofs = static_cast<size_t>(state.range(0));
101 auto precomputed_vks = precompute_vks(1);
102
103 // Generate a single proof and reuse it N times
104 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(1, precomputed_vks);
105
106 for (auto _ : state) {
107 for (size_t i = 0; i < num_proofs; i++) {
108 ChonkNativeVerifier verifier(vk_and_hash);
109 benchmark::DoNotOptimize(verifier.verify(proof));
110 }
111 }
112}
113
117BENCHMARK_DEFINE_F(ChonkBench, BatchVerify)(benchmark::State& state)
118{
119 const size_t num_proofs = static_cast<size_t>(state.range(0));
120 auto precomputed_vks = precompute_vks(1);
121
122 // Generate a single proof and reuse it N times
123 auto [proof, vk_and_hash] = accumulate_and_prove_with_precomputed_vks(1, precomputed_vks);
125 for (size_t i = 0; i < num_proofs; i++) {
126 inputs[i] = { proof, vk_and_hash };
127 }
128
129 for (auto _ : state) {
130 benchmark::DoNotOptimize(ChonkBatchVerifier::verify(inputs));
131 }
132}
133
134#define ARGS Arg(ChonkBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY)->Arg(2)
135
136BENCHMARK_REGISTER_F(ChonkBench, Full)->Unit(benchmark::kMillisecond)->ARGS;
137BENCHMARK_REGISTER_F(ChonkBench, VerificationOnly)->Unit(benchmark::kMillisecond);
138BENCHMARK_REGISTER_F(ChonkBench, ProofCompress)->Unit(benchmark::kMillisecond);
139BENCHMARK_REGISTER_F(ChonkBench, ProofDecompress)->Unit(benchmark::kMillisecond);
140BENCHMARK_REGISTER_F(ChonkBench, VerifyIndividual)->Unit(benchmark::kMillisecond)->Arg(1)->Arg(2)->Arg(4)->Arg(8);
141BENCHMARK_REGISTER_F(ChonkBench, BatchVerify)->Unit(benchmark::kMillisecond)->Arg(1)->Arg(2)->Arg(4)->Arg(8);
142
143} // namespace
144
BENCHMARK_MAIN()
static bool verify(std::span< const Input > inputs)
Verify multiple Chonk proofs with batched IPA verification.
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)
#define GOOGLE_BB_BENCH_REPORTER(state)
AvmProvingInputs inputs
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)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static constexpr size_t HIDING_KERNEL_PROOF_LENGTH_WITHOUT_PUBLIC_INPUTS