testudo/benches/snark.rs
benches/snark.rsRaw
1#![allow(clippy::assertions_on_result_states)]
2extern crate libspartan;
3extern crate merlin;
4
5use libspartan::{
6 parameters::poseidon_params,
7 poseidon_transcript::{self, PoseidonTranscript},
8 Instance, SNARKGens, SNARK,
9};
10use merlin::Transcript;
11
12use criterion::*;
13
14fn snark_encode_benchmark(c: &mut Criterion) {
15 for &s in [10, 12, 16].iter() {
16 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
17 let mut group = c.benchmark_group("SNARK_encode_benchmark");
18 group.plot_config(plot_config);
19
20 let num_vars = (2_usize).pow(s as u32);
21 let num_cons = num_vars;
22 let num_inputs = 10;
23 let (inst, _vars, _inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
24
25 // produce public parameters
26 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
27
28 // produce a commitment to R1CS instance
29 let name = format!("SNARK_encode_{}", num_cons);
30 group.bench_function(&name, move |b| {
31 b.iter(|| {
32 SNARK::encode(black_box(&inst), black_box(&gens));
33 });
34 });
35 group.finish();
36 }
37}
38
39fn snark_prove_benchmark(c: &mut Criterion) {
40 for &s in [10, 12, 16].iter() {
41 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
42 let mut group = c.benchmark_group("SNARK_prove_benchmark");
43 group.plot_config(plot_config);
44
45 let num_vars = (2_usize).pow(s as u32);
46 let num_cons = num_vars;
47 let num_inputs = 10;
48
49 let params = poseidon_params();
50
51 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
52
53 // produce public parameters
54 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
55
56 // produce a commitment to R1CS instance
57 let (comm, decomm) = SNARK::encode(&inst, &gens);
58
59 // produce a proof
60 let name = format!("SNARK_prove_{}", num_cons);
61 group.bench_function(&name, move |b| {
62 b.iter(|| {
63 let mut prover_transcript = PoseidonTranscript::new(¶ms);
64 SNARK::prove(
65 black_box(&inst),
66 black_box(&comm),
67 black_box(&decomm),
68 black_box(vars.clone()),
69 black_box(&inputs),
70 black_box(&gens),
71 black_box(&mut prover_transcript),
72 );
73 });
74 });
75 group.finish();
76 }
77}
78
79fn snark_verify_benchmark(c: &mut Criterion) {
80 for &s in [10, 12, 16].iter() {
81 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
82 let mut group = c.benchmark_group("SNARK_verify_benchmark");
83 group.plot_config(plot_config);
84
85 let params = poseidon_params();
86
87 let num_vars = (2_usize).pow(s as u32);
88 let num_cons = num_vars;
89 let num_inputs = 10;
90 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
91
92 // produce public parameters
93 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
94
95 // produce a commitment to R1CS instance
96 let (comm, decomm) = SNARK::encode(&inst, &gens);
97
98 // produce a proof of satisfiability
99 let mut prover_transcript = PoseidonTranscript::new(¶ms);
100 let proof = SNARK::prove(
101 &inst,
102 &comm,
103 &decomm,
104 vars,
105 &inputs,
106 &gens,
107 &mut prover_transcript,
108 );
109
110 // verify the proof
111 let name = format!("SNARK_verify_{}", num_cons);
112 group.bench_function(&name, move |b| {
113 b.iter(|| {
114 let mut verifier_transcript = PoseidonTranscript::new(¶ms);
115 assert!(proof
116 .verify(
117 black_box(&comm),
118 black_box(&inputs),
119 black_box(&mut verifier_transcript),
120 black_box(&gens)
121 )
122 .is_ok());
123 });
124 });
125 group.finish();
126 }
127}
128
129fn set_duration() -> Criterion {
130 Criterion::default().sample_size(10)
131}
132
133criterion_group! {
134name = benches_snark;
135config = set_duration();
136targets = snark_encode_benchmark, snark_prove_benchmark, snark_verify_benchmark
137}
138
139criterion_main!(benches_snark);