arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/spartan.rs
benches/spartan.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::math::Math;
 11use libspartan::r1csinstance::{R1CSCommitmentGens, R1CSInstance};
 12use libspartan::r1csproof::R1CSGens;
 13use libspartan::spartan::{SpartanGens, SpartanProof};
 14use merlin::Transcript;
 15
 16use criterion::*;
 17
 18fn encode_benchmark(c: &mut Criterion) {
 19  for &s in [10, 12, 16].iter() {
 20    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 21    let mut group = c.benchmark_group("spartan_encode_benchmark");
 22    group.plot_config(plot_config);
 23
 24    let num_vars = s.pow2();
 25    let num_cons = num_vars;
 26    let num_inputs = 10;
 27    let (inst, _vars, _input) =
 28      R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 29    let n = inst.get_num_vars();
 30    let m = n.square_root();
 31    assert_eq!(n, m * m);
 32    let r1cs_size = inst.size();
 33    let gens_r1cs = R1CSCommitmentGens::new(&r1cs_size, b"gens_r1cs");
 34
 35    let name = format!("spartan_encode_{}", n);
 36    group.bench_function(&name, move |b| {
 37      b.iter(|| {
 38        SpartanProof::encode(black_box(&inst), black_box(&gens_r1cs));
 39      });
 40    });
 41    group.finish();
 42  }
 43}
 44
 45fn prove_benchmark(c: &mut Criterion) {
 46  for &s in [10, 12, 16].iter() {
 47    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 48    let mut group = c.benchmark_group("spartan_prove_benchmark");
 49    group.plot_config(plot_config);
 50
 51    let num_vars = s.pow2();
 52    let num_cons = num_vars;
 53    let num_inputs = 10;
 54
 55    let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 56    let n = inst.get_num_vars();
 57
 58    let r1cs_size = inst.size();
 59    let gens_r1cs_eval = R1CSCommitmentGens::new(&r1cs_size, b"gens_r1cs_eval");
 60    let gens_r1cs_sat = R1CSGens::new(num_cons, num_vars, b"gens_r1cs_sat");
 61
 62    // produce a proof of satisfiability
 63    let (_comm, decomm) = SpartanProof::encode(&inst, &gens_r1cs_eval);
 64    let gens = SpartanGens::new(gens_r1cs_sat, gens_r1cs_eval);
 65
 66    let name = format!("spartan_prove_{}", n);
 67    group.bench_function(&name, move |b| {
 68      b.iter(|| {
 69        let mut prover_transcript = Transcript::new(b"example");
 70        SpartanProof::prove(
 71          black_box(&inst),
 72          black_box(&decomm),
 73          black_box(vars.clone()),
 74          black_box(&input),
 75          black_box(&gens),
 76          black_box(&mut prover_transcript),
 77        );
 78      });
 79    });
 80    group.finish();
 81  }
 82}
 83
 84fn verify_benchmark(c: &mut Criterion) {
 85  for &s in [10, 12, 16].iter() {
 86    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 87    let mut group = c.benchmark_group("spartan_verify_benchmark");
 88    group.plot_config(plot_config);
 89
 90    let num_vars = s.pow2();
 91    let num_cons = num_vars;
 92    let num_inputs = 10;
 93    let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 94    let n = inst.get_num_vars();
 95
 96    let r1cs_size = inst.size();
 97    let gens_r1cs_eval = R1CSCommitmentGens::new(&r1cs_size, b"gens_r1cs_eval");
 98
 99    // create a commitment to R1CSInstance
100    let (comm, decomm) = SpartanProof::encode(&inst, &gens_r1cs_eval);
101
102    let gens_r1cs_sat = R1CSGens::new(num_cons, num_vars, b"gens_r1cs_sat");
103    let gens = SpartanGens::new(gens_r1cs_sat, gens_r1cs_eval);
104
105    // produce a proof of satisfiability
106    let mut prover_transcript = Transcript::new(b"example");
107    let proof = SpartanProof::prove(&inst, &decomm, vars, &input, &gens, &mut prover_transcript);
108
109    let name = format!("spartan_verify_{}", n);
110    group.bench_function(&name, move |b| {
111      b.iter(|| {
112        let mut verifier_transcript = Transcript::new(b"example");
113        assert!(proof
114          .verify(
115            black_box(&comm),
116            black_box(&input),
117            black_box(&mut verifier_transcript),
118            black_box(&gens)
119          )
120          .is_ok());
121      });
122    });
123    group.finish();
124  }
125}
126
127fn set_duration() -> Criterion {
128  Criterion::default().sample_size(10)
129  // .measurement_time(Duration::new(0, 50000000))
130}
131
132criterion_group! {
133name = benches_spartan;
134config = set_duration();
135targets = encode_benchmark, prove_benchmark, verify_benchmark
136}
137
138criterion_main!(benches_spartan);