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