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,
 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);