arnaucube
arnaucube/testudoPublic Self-hosted repository
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);