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