arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/snark.rs
benches/snark.rsRaw
  1#![allow(clippy::assertions_on_result_states)]
  2extern crate libspartan;
  3extern crate merlin;
  4
  5use libspartan::{Instance, SNARKGens, SNARK};
  6use merlin::Transcript;
  7
  8use criterion::*;
  9
 10fn snark_encode_benchmark(c: &mut Criterion) {
 11  for &s in [10, 12, 16].iter() {
 12    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 13    let mut group = c.benchmark_group("SNARK_encode_benchmark");
 14    group.plot_config(plot_config);
 15
 16    let num_vars = (2_usize).pow(s as u32);
 17    let num_cons = num_vars;
 18    let num_inputs = 10;
 19    let (inst, _vars, _inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 20
 21    // produce public parameters
 22    let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
 23
 24    // produce a commitment to R1CS instance
 25    let name = format!("SNARK_encode_{}", num_cons);
 26    group.bench_function(&name, move |b| {
 27      b.iter(|| {
 28        SNARK::encode(black_box(&inst), black_box(&gens));
 29      });
 30    });
 31    group.finish();
 32  }
 33}
 34
 35fn snark_prove_benchmark(c: &mut Criterion) {
 36  for &s in [10, 12, 16].iter() {
 37    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 38    let mut group = c.benchmark_group("SNARK_prove_benchmark");
 39    group.plot_config(plot_config);
 40
 41    let num_vars = (2_usize).pow(s as u32);
 42    let num_cons = num_vars;
 43    let num_inputs = 10;
 44
 45    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 46
 47    // produce public parameters
 48    let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
 49
 50    // produce a commitment to R1CS instance
 51    let (comm, decomm) = SNARK::encode(&inst, &gens);
 52
 53    // produce a proof
 54    let name = format!("SNARK_prove_{}", num_cons);
 55    group.bench_function(&name, move |b| {
 56      b.iter(|| {
 57        let mut prover_transcript = Transcript::new(b"example");
 58        SNARK::prove(
 59          black_box(&inst),
 60          black_box(&comm),
 61          black_box(&decomm),
 62          black_box(vars.clone()),
 63          black_box(&inputs),
 64          black_box(&gens),
 65          black_box(&mut prover_transcript),
 66        );
 67      });
 68    });
 69    group.finish();
 70  }
 71}
 72
 73fn snark_verify_benchmark(c: &mut Criterion) {
 74  for &s in [10, 12, 16].iter() {
 75    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 76    let mut group = c.benchmark_group("SNARK_verify_benchmark");
 77    group.plot_config(plot_config);
 78
 79    let num_vars = (2_usize).pow(s as u32);
 80    let num_cons = num_vars;
 81    let num_inputs = 10;
 82    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 83
 84    // produce public parameters
 85    let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
 86
 87    // produce a commitment to R1CS instance
 88    let (comm, decomm) = SNARK::encode(&inst, &gens);
 89
 90    // produce a proof of satisfiability
 91    let mut prover_transcript = Transcript::new(b"example");
 92    let proof = SNARK::prove(
 93      &inst,
 94      &comm,
 95      &decomm,
 96      vars,
 97      &inputs,
 98      &gens,
 99      &mut prover_transcript,
100    );
101
102    // verify the proof
103    let name = format!("SNARK_verify_{}", num_cons);
104    group.bench_function(&name, move |b| {
105      b.iter(|| {
106        let mut verifier_transcript = Transcript::new(b"example");
107        assert!(proof
108          .verify(
109            black_box(&comm),
110            black_box(&inputs),
111            black_box(&mut verifier_transcript),
112            black_box(&gens)
113          )
114          .is_ok());
115      });
116    });
117    group.finish();
118  }
119}
120
121fn set_duration() -> Criterion {
122  Criterion::default().sample_size(10)
123}
124
125criterion_group! {
126name = benches_snark;
127config = set_duration();
128targets = snark_encode_benchmark, snark_prove_benchmark, snark_verify_benchmark
129}
130
131criterion_main!(benches_snark);