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