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