testudo/benches/snark.rs
benches/snark.rsRaw
1extern crate byteorder;
2extern crate core;
3extern crate criterion;
4extern crate digest;
5extern crate libspartan;
6extern crate merlin;
7extern crate rand;
8extern crate sha3;
9
10use libspartan::r1csinstance::R1CSInstance;
11use libspartan::spartan::{SNARKGens, SNARK};
12use merlin::Transcript;
13
14use criterion::*;
15
16fn snark_encode_benchmark(c: &mut Criterion) {
17 for &s in [10, 12, 16].iter() {
18 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
19 let mut group = c.benchmark_group("SNARK_encode_benchmark");
20 group.plot_config(plot_config);
21
22 let num_vars = (2 as usize).pow(s as u32);
23 let num_cons = num_vars;
24 let num_inputs = 10;
25 let (inst, _vars, _input) =
26 R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
27 let n = inst.get_num_vars();
28
29 // produce public parameters
30 let gens = SNARKGens::new(&inst.size());
31
32 let name = format!("SNARK_encode_{}", n);
33 group.bench_function(&name, move |b| {
34 b.iter(|| {
35 SNARK::encode(black_box(&inst), black_box(&gens));
36 });
37 });
38 group.finish();
39 }
40}
41
42fn snark_prove_benchmark(c: &mut Criterion) {
43 for &s in [10, 12, 16].iter() {
44 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
45 let mut group = c.benchmark_group("SNARK_prove_benchmark");
46 group.plot_config(plot_config);
47
48 let num_vars = (2 as usize).pow(s as u32);
49 let num_cons = num_vars;
50 let num_inputs = 10;
51
52 let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
53 let n = inst.get_num_vars();
54
55 // produce public parameters
56 let gens = SNARKGens::new(&inst.size());
57
58 // encode the R1CS instance
59 let (_comm, decomm) = SNARK::encode(&inst, &gens);
60
61 // produce a proof
62 let name = format!("SNARK_prove_{}", n);
63 group.bench_function(&name, move |b| {
64 b.iter(|| {
65 let mut prover_transcript = Transcript::new(b"example");
66 SNARK::prove(
67 black_box(&inst),
68 black_box(&decomm),
69 black_box(vars.clone()),
70 black_box(&input),
71 black_box(&gens),
72 black_box(&mut prover_transcript),
73 );
74 });
75 });
76 group.finish();
77 }
78}
79
80fn snark_verify_benchmark(c: &mut Criterion) {
81 for &s in [10, 12, 16].iter() {
82 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
83 let mut group = c.benchmark_group("SNARK_verify_benchmark");
84 group.plot_config(plot_config);
85
86 let num_vars = (2 as usize).pow(s as u32);
87 let num_cons = num_vars;
88 let num_inputs = 10;
89 let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
90 let n = inst.get_num_vars();
91
92 // produce public parameters
93 let gens = SNARKGens::new(&inst.size());
94
95 // encode the R1CS instance
96 let (comm, decomm) = SNARK::encode(&inst, &gens);
97
98 // produce a proof of satisfiability
99 let mut prover_transcript = Transcript::new(b"example");
100 let proof = SNARK::prove(&inst, &decomm, vars, &input, &gens, &mut prover_transcript);
101
102 let name = format!("SNARK_verify_{}", n);
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(&input),
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);