arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/snark.rs
benches/snark.rsRaw
  1extern crate libspartan;
  2extern crate merlin;
  3
  4use libspartan::{
  5  parameters::poseidon_params, poseidon_transcript::PoseidonTranscript, Instance, SNARKGens, SNARK,
  6};
  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 params = poseidon_params();
 46
 47    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 48
 49    // produce public parameters
 50    let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
 51
 52    // produce a commitment to R1CS instance
 53    let (comm, decomm) = SNARK::encode(&inst, &gens);
 54
 55    // produce a proof
 56    let name = format!("SNARK_prove_{}", num_cons);
 57    group.bench_function(&name, move |b| {
 58      b.iter(|| {
 59        let mut prover_transcript = PoseidonTranscript::new(&params);
 60        SNARK::prove(
 61          black_box(&inst),
 62          black_box(&comm),
 63          black_box(&decomm),
 64          black_box(vars.clone()),
 65          black_box(&inputs),
 66          black_box(&gens),
 67          black_box(&mut prover_transcript),
 68        );
 69      });
 70    });
 71    group.finish();
 72  }
 73}
 74
 75fn snark_verify_benchmark(c: &mut Criterion) {
 76  for &s in [10, 12, 16].iter() {
 77    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 78    let mut group = c.benchmark_group("SNARK_verify_benchmark");
 79    group.plot_config(plot_config);
 80
 81    let params = poseidon_params();
 82
 83    let num_vars = (2_usize).pow(s as u32);
 84    let num_cons = num_vars;
 85    let num_inputs = 10;
 86    let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 87
 88    // produce public parameters
 89    let gens = SNARKGens::new(num_cons, num_vars, num_inputs, num_cons);
 90
 91    // produce a commitment to R1CS instance
 92    let (comm, decomm) = SNARK::encode(&inst, &gens);
 93
 94    // produce a proof of satisfiability
 95    let mut prover_transcript = PoseidonTranscript::new(&params);
 96    let proof = SNARK::prove(
 97      &inst,
 98      &comm,
 99      &decomm,
100      vars,
101      &inputs,
102      &gens,
103      &mut prover_transcript,
104    );
105
106    // verify the proof
107    let name = format!("SNARK_verify_{}", num_cons);
108    group.bench_function(&name, move |b| {
109      b.iter(|| {
110        let mut verifier_transcript = PoseidonTranscript::new(&params);
111        assert!(proof
112          .verify(
113            black_box(&comm),
114            black_box(&inputs),
115            black_box(&mut verifier_transcript),
116            black_box(&gens)
117          )
118          .is_ok());
119      });
120    });
121    group.finish();
122  }
123}
124
125fn set_duration() -> Criterion {
126  Criterion::default().sample_size(10)
127}
128
129criterion_group! {
130name = benches_snark;
131config = set_duration();
132targets =  snark_verify_benchmark
133}
134
135criterion_main!(benches_snark);