Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
eccvm.bench.cpp
Go to the documentation of this file.
1#include <benchmark/benchmark.h>
2
9
10using namespace benchmark;
11using namespace bb;
12
16
17namespace {
18
19Builder generate_trace(size_t target_num_gates)
20{
22 using G1 = typename Flavor::CycleGroup;
23 using Fr = typename G1::Fr;
24
25 auto generators = get_precomputed_generators<G1, "test generators", 2>();
26
27 typename G1::element a = generators[0];
28 typename G1::element b = generators[1];
31
32 // Each loop adds 163 gates. Note: builder.get_estimated_num_finalized_gates() is very expensive here (bug?) and
33 // it's actually painful to use a `while` loop
34 size_t num_iterations = target_num_gates / 163;
35 for (size_t _ = 0; _ < num_iterations; _++) {
36 op_queue->add_accumulate(a);
37 op_queue->mul_accumulate(a, x);
38 op_queue->mul_accumulate(b, x);
39 op_queue->mul_accumulate(b, y);
40 op_queue->add_accumulate(a);
41 op_queue->mul_accumulate(b, x);
42 op_queue->eq_and_reset();
43 op_queue->merge();
44 }
45
47 op_queue->append_hiding_op(Fq::random_element(), Fq::random_element());
48
49 Builder builder{ op_queue };
50 return builder;
51}
52
53void eccvm_generate_prover(State& state) noexcept
54{
55
56 size_t target_num_gates = 1 << static_cast<size_t>(state.range(0));
57 for (auto _ : state) {
58 Builder builder = generate_trace(target_num_gates);
59 std::shared_ptr<Transcript> prover_transcript = std::make_shared<Transcript>();
60 ECCVMProver prover(builder, prover_transcript);
61 };
62}
63
64void eccvm_prove(State& state) noexcept
65{
66
67 size_t target_num_gates = 1 << static_cast<size_t>(state.range(0));
68 Builder builder = generate_trace(target_num_gates);
69 std::shared_ptr<Transcript> prover_transcript = std::make_shared<Transcript>();
70 ECCVMProver prover(builder, prover_transcript);
71 for (auto _ : state) {
72 auto [proof, opening_claim] = prover.construct_proof();
73 auto ipa_transcript = std::make_shared<Transcript>();
74 IPA<Flavor::Curve>::compute_opening_proof(prover.key->commitment_key, opening_claim, ipa_transcript);
75 };
76}
77
78template <typename Prover> void construct_proof(State& state) noexcept
79{
80 size_t target_num_gates = 1 << static_cast<size_t>(state.range(0));
81 for (auto _ : state) {
82 Builder builder = generate_trace(target_num_gates);
83 std::shared_ptr<Transcript> prover_transcript = std::make_shared<Transcript>();
84 Prover prover(builder, prover_transcript);
85 auto [proof, opening_claim] = prover.construct_proof();
86 auto ipa_transcript = std::make_shared<Transcript>();
87 IPA<Flavor::Curve>::compute_opening_proof(prover.key->commitment_key, opening_claim, ipa_transcript);
88 benchmark::DoNotOptimize(proof);
89 };
90}
91
92template <typename Prover> void execute_sumcheck(State& state) noexcept
93{
94 size_t target_num_gates = 1 << static_cast<size_t>(state.range(0));
95 for (auto _ : state) {
96 state.PauseTiming();
97 Builder builder = generate_trace(target_num_gates);
98 std::shared_ptr<Transcript> prover_transcript = std::make_shared<Transcript>();
99 Prover prover(builder, prover_transcript);
100 prover.execute_preamble_round();
101 prover.execute_wire_commitments_round();
102 prover.execute_log_derivative_commitments_round();
103 prover.execute_grand_product_computation_round();
104 state.ResumeTiming();
105
106 prover.execute_relation_check_rounds();
107 benchmark::DoNotOptimize(prover.sumcheck_output);
108 };
109}
110
111void eccvm_full_prove(State& state) noexcept
112{
113 construct_proof<ECCVMProver>(state);
114}
115
116void eccvm_full_sumcheck(State& state) noexcept
117{
118 execute_sumcheck<ECCVMProver>(state);
119}
120
121void eccvm_ipa(State& state) noexcept
122{
123 size_t target_num_gates = 1 << static_cast<size_t>(state.range(0));
124 Builder builder = generate_trace(target_num_gates);
125 std::shared_ptr<Transcript> prover_transcript = std::make_shared<Transcript>();
126 ECCVMProver prover(builder, prover_transcript);
127 auto [proof, opening_claim] = prover.construct_proof();
128 for (auto _ : state) {
129 auto ipa_transcript = std::make_shared<Transcript>();
130 IPA<Flavor::Curve>::compute_opening_proof(prover.key->commitment_key, opening_claim, ipa_transcript);
131 };
132}
133
134BENCHMARK(eccvm_generate_prover)->Unit(kMillisecond)->DenseRange(12, CONST_ECCVM_LOG_N);
135BENCHMARK(eccvm_prove)->Unit(kMillisecond)->DenseRange(12, CONST_ECCVM_LOG_N);
136BENCHMARK(eccvm_ipa)->Unit(kMillisecond)->DenseRange(12, CONST_ECCVM_LOG_N);
137BENCHMARK(eccvm_full_prove)->Unit(kMillisecond)->DenseRange(12, CONST_ECCVM_LOG_N);
138BENCHMARK(eccvm_full_sumcheck)->Unit(kMillisecond)->DenseRange(12, CONST_ECCVM_LOG_N);
139} // namespace
140
141int main(int argc, char** argv)
142{
144 benchmark::Initialize(&argc, argv);
145 benchmark::RunSpecifiedBenchmarks();
146 benchmark::Shutdown();
147 return 0;
148}
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
BaseTranscript< Codec, HashFunction > Transcript
std::pair< Proof, OpeningClaim > construct_proof()
std::shared_ptr< ProvingKey > key
IPA (inner product argument) commitment scheme class.
Definition ipa.hpp:86
bb::fq BaseField
Definition bn254.hpp:19
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
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
constexpr std::span< const typename Group::affine_element > get_precomputed_generators()
BENCHMARK(bench_commit_structured_random_poly< curve::BN254 >) -> Unit(benchmark::kMillisecond)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Curve::AffineElement G1
static field random_element(numeric::RNG *engine=nullptr) noexcept