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