testudo/benches/snark.rs
benches/snark.rsRaw
1extern crate libspartan;
2extern crate merlin;
3
4use libspartan::{
5 parameters::poseidon_params, poseidon_transcript::PoseidonTranscript, Instance, SNARKGens, SNARK,
6};
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 params = poseidon_params();
46
47 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
48
49 // produce public parameters
50 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
51
52 // produce a commitment to R1CS instance
53 let (comm, decomm) = SNARK::encode(&inst, &gens);
54
55 // produce a proof
56 let name = format!("SNARK_prove_{}", num_cons);
57 group.bench_function(&name, move |b| {
58 b.iter(|| {
59 let mut prover_transcript = PoseidonTranscript::new(¶ms);
60 SNARK::prove(
61 black_box(&inst),
62 black_box(&comm),
63 black_box(&decomm),
64 black_box(vars.clone()),
65 black_box(&inputs),
66 black_box(&gens),
67 black_box(&mut prover_transcript),
68 );
69 });
70 });
71 group.finish();
72 }
73}
74
75fn snark_verify_benchmark(c: &mut Criterion) {
76 for &s in [10, 12, 16].iter() {
77 let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
78 let mut group = c.benchmark_group("SNARK_verify_benchmark");
79 group.plot_config(plot_config);
80
81 let params = poseidon_params();
82
83 let num_vars = (2_usize).pow(s as u32);
84 let num_cons = num_vars;
85 let num_inputs = 10;
86 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
87
88 // produce public parameters
89 let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
90
91 // produce a commitment to R1CS instance
92 let (comm, decomm) = SNARK::encode(&inst, &gens);
93
94 // produce a proof of satisfiability
95 let mut prover_transcript = PoseidonTranscript::new(¶ms);
96 let proof = SNARK::prove(
97 &inst,
98 &comm,
99 &decomm,
100 vars,
101 &inputs,
102 &gens,
103 &mut prover_transcript,
104 );
105
106 // verify the proof
107 let name = format!("SNARK_verify_{}", num_cons);
108 group.bench_function(&name, move |b| {
109 b.iter(|| {
110 let mut verifier_transcript = PoseidonTranscript::new(¶ms);
111 assert!(proof
112 .verify(
113 black_box(&comm),
114 black_box(&inputs),
115 black_box(&mut verifier_transcript),
116 black_box(&gens)
117 )
118 .is_ok());
119 });
120 });
121 group.finish();
122 }
123}
124
125fn set_duration() -> Criterion {
126 Criterion::default().sample_size(10)
127}
128
129criterion_group! {
130name = benches_snark;
131config = set_duration();
132targets = snark_verify_benchmark
133}
134
135criterion_main!(benches_snark);