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