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(&comm),
60 black_box(&decomm),
61 black_box(vars.clone()),
62 black_box(&inputs),
63 black_box(&gens),
64 black_box(&mut prover_transcript),
65 );
66 });
67 });
68 group.finish();
69 }
70}
71
72fn snark_verify_benchmark(c: &mut Criterion) {
73 for &s in [10, 12, 16].iter() {
74 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
75 let mut group = c.benchmark_group("SNARK_verify_benchmark");
76 group.plot_config(plot_config);
77
78 let num_vars = (2_usize).pow(s as u32);
79 let num_cons = num_vars;
80 let num_inputs = 10;
81 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
82
83 // produce public parameters
84 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
85
86 // produce a commitment to R1CS instance
87 let (comm, decomm) = SNARK::encode(&inst, &gens);
88
89 // produce a proof of satisfiability
90 let mut prover_transcript = Transcript::new(b"example");
91 let proof = SNARK::prove(
92 &inst,
93 &comm,
94 &decomm,
95 vars,
96 &inputs,
97 &gens,
98 &mut prover_transcript,
99 );
100
101 // verify the proof
102 let name = format!("SNARK_verify_{}", num_cons);
103 group.bench_function(&name, move |b| {
104 b.iter(|| {
105 let mut verifier_transcript = Transcript::new(b"example");
106 assert!(proof
107 .verify(
108 black_box(&comm),
109 black_box(&inputs),
110 black_box(&mut verifier_transcript),
111 black_box(&gens)
112 )
113 .is_ok());
114 });
115 });
116 group.finish();
117 }
118}
119
120fn set_duration() -> Criterion {
121 Criterion::default().sample_size(10)
122}
123
124criterion_group! {
125name = benches_snark;
126config = set_duration();
127targets = snark_encode_benchmark, snark_prove_benchmark, snark_verify_benchmark
128}
129
130criterion_main!(benches_snark);