testudo/benches/nizk.rs
benches/nizk.rsRaw
1extern crate byteorder;
2extern crate core;
3extern crate criterion;
4extern crate digest;
5extern crate libspartan;
6extern crate merlin;
7extern crate sha3;
8
9use std::time::{Duration, SystemTime};
10
11use libspartan::{
12 parameters::POSEIDON_PARAMETERS_FR_377, poseidon_transcript::PoseidonTranscript, Instance,
13 NIZKGens, NIZK,
14};
15
16use criterion::*;
17
18fn nizk_prove_benchmark(c: &mut Criterion) {
19 for &s in [24, 28, 30].iter() {
20 let mut group = c.benchmark_group("R1CS_prove_benchmark");
21
22 let num_vars = (2_usize).pow(s as u32);
23 let num_cons = num_vars;
24 let num_inputs = 10;
25 let start = SystemTime::now();
26 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
27 let end = SystemTime::now();
28 let duration = end.duration_since(start).unwrap();
29 println!(
30 "Generating r1cs instance with {} constraints took {} ms",
31 num_cons,
32 duration.as_millis()
33 );
34 let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
35
36 let name = format!("R1CS_prove_{}", num_vars);
37 group
38 .measurement_time(Duration::from_secs(60))
39 .bench_function(&name, move |b| {
40 b.iter(|| {
41 let mut prover_transcript = PoseidonTranscript::new(&POSEIDON_PARAMETERS_FR_377);
42 NIZK::prove(
43 black_box(&inst),
44 black_box(vars.clone()),
45 black_box(&inputs),
46 black_box(&gens),
47 black_box(&mut prover_transcript),
48 );
49 });
50 });
51 group.finish();
52 }
53}
54
55fn nizk_verify_benchmark(c: &mut Criterion) {
56 for &s in [4, 6, 8, 10, 12, 16, 20, 24, 28, 30].iter() {
57 let mut group = c.benchmark_group("R1CS_verify_benchmark");
58
59 let num_vars = (2_usize).pow(s as u32);
60 let num_cons = num_vars;
61 // these are the public io
62 let num_inputs = 10;
63 let start = SystemTime::now();
64 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
65 let end = SystemTime::now();
66 let duration = end.duration_since(start).unwrap();
67 println!(
68 "Generating r1cs instance with {} constraints took {} ms",
69 num_cons,
70 duration.as_millis()
71 );
72 let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
73 // produce a proof of satisfiability
74 let mut prover_transcript = PoseidonTranscript::new(&POSEIDON_PARAMETERS_FR_377);
75 let proof = NIZK::prove(&inst, vars, &inputs, &gens, &mut prover_transcript);
76
77 let name = format!("R1CS_verify_{}", num_cons);
78 group
79 .measurement_time(Duration::from_secs(60))
80 .bench_function(&name, move |b| {
81 b.iter(|| {
82 let mut verifier_transcript = PoseidonTranscript::new(&POSEIDON_PARAMETERS_FR_377);
83 assert!(proof
84 .verify(
85 black_box(&inst),
86 black_box(&inputs),
87 black_box(&mut verifier_transcript),
88 black_box(&gens),
89 )
90 .is_ok());
91 });
92 });
93 group.finish();
94 }
95}
96
97fn nizk_verify_groth16_benchmark(c: &mut Criterion) {
98 for &s in [4, 6, 8, 10, 12, 16, 20, 24, 28, 30].iter() {
99 let mut group = c.benchmark_group("R1CS_verify_groth16_benchmark");
100
101 let num_vars = (2_usize).pow(s as u32);
102 let num_cons = num_vars;
103 // these are the public io
104 let num_inputs = 10;
105 let start = SystemTime::now();
106 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
107 let end = SystemTime::now();
108 let duration = end.duration_since(start).unwrap();
109 println!(
110 "Generating r1cs instance with {} constraints took {} ms",
111 num_cons,
112 duration.as_millis()
113 );
114 // produce a proof of satisfiability
115 let mut prover_transcript = PoseidonTranscript::new(&POSEIDON_PARAMETERS_FR_377);
116 let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
117 let proof = NIZK::prove(&inst, vars, &inputs, &gens, &mut prover_transcript);
118
119 let name = format!("R1CS_verify_groth16_{}", num_cons);
120 group
121 .measurement_time(Duration::from_secs(60))
122 .bench_function(&name, move |b| {
123 b.iter(|| {
124 let mut verifier_transcript = PoseidonTranscript::new(&POSEIDON_PARAMETERS_FR_377);
125 assert!(proof
126 .verify_groth16(
127 black_box(&inst),
128 black_box(&inputs),
129 black_box(&mut verifier_transcript),
130 black_box(&gens)
131 )
132 .is_ok());
133 });
134 });
135 group.finish();
136 }
137}
138
139fn set_duration() -> Criterion {
140 Criterion::default().sample_size(2)
141}
142
143criterion_group! {
144name = benches_nizk;
145config = set_duration();
146targets = nizk_prove_benchmark, nizk_verify_benchmark, nizk_verify_groth16_benchmark
147}
148
149criterion_main!(benches_nizk);