arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/nizk.rs
benches/nizk.rsRaw
 1#![allow(clippy::assertions_on_result_states)]
 2extern crate byteorder;
 3extern crate core;
 4extern crate criterion;
 5extern crate digest;
 6extern crate libspartan;
 7extern crate merlin;
 8extern crate sha3;
 9
10use libspartan::{
11  parameters::poseidon_params, poseidon_transcript::PoseidonTranscript, Instance, NIZKGens, NIZK,
12};
13use merlin::Transcript;
14
15use criterion::*;
16
17fn nizk_prove_benchmark(c: &mut Criterion) {
18  for &s in [10, 12, 16].iter() {
19    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
20    let mut group = c.benchmark_group("NIZK_prove_benchmark");
21    group.plot_config(plot_config);
22
23    let num_vars = (2_usize).pow(s as u32);
24    let num_cons = num_vars;
25    let num_inputs = 10;
26
27    let params = poseidon_params();
28
29    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
30
31    let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
32
33    let name = format!("NIZK_prove_{}", num_vars);
34    group.bench_function(&name, move |b| {
35      b.iter(|| {
36        let mut prover_transcript = PoseidonTranscript::new(&params);
37        NIZK::prove(
38          black_box(&inst),
39          black_box(vars.clone()),
40          black_box(&inputs),
41          black_box(&gens),
42          black_box(&mut prover_transcript),
43        );
44      });
45    });
46    group.finish();
47  }
48}
49
50fn nizk_verify_benchmark(c: &mut Criterion) {
51  for &s in [10, 12, 16].iter() {
52    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
53    let mut group = c.benchmark_group("NIZK_verify_benchmark");
54    group.plot_config(plot_config);
55
56    let num_vars = (2_usize).pow(s as u32);
57    let num_cons = num_vars;
58    let num_inputs = 10;
59    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
60
61    let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
62    let params = poseidon_params();
63    // produce a proof of satisfiability
64    let mut prover_transcript = PoseidonTranscript::new(&params);
65    let proof = NIZK::prove(&inst, vars, &inputs, &gens, &mut prover_transcript);
66
67    let name = format!("NIZK_verify_{}", num_cons);
68    group.bench_function(&name, move |b| {
69      b.iter(|| {
70        let mut verifier_transcript = PoseidonTranscript::new(&params);
71        assert!(proof
72          .verify(
73            black_box(&inst),
74            black_box(&inputs),
75            black_box(&mut verifier_transcript),
76            black_box(&gens)
77          )
78          .is_ok());
79      });
80    });
81    group.finish();
82  }
83}
84
85fn set_duration() -> Criterion {
86  Criterion::default().sample_size(10)
87}
88
89criterion_group! {
90name = benches_nizk;
91config = set_duration();
92targets = nizk_prove_benchmark, nizk_verify_benchmark
93}
94
95criterion_main!(benches_nizk);