arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/r1csproof.rs
benches/r1csproof.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::dense_mlpoly::EqPolynomial;
 11use libspartan::math::Math;
 12use libspartan::r1csinstance::R1CSInstance;
 13use libspartan::r1csproof::{R1CSGens, R1CSProof};
 14use libspartan::random::RandomTape;
 15use libspartan::scalar::Scalar;
 16use libspartan::transcript::ProofTranscript;
 17use merlin::Transcript;
 18use rand::rngs::OsRng;
 19
 20use criterion::*;
 21
 22fn prove_benchmark(c: &mut Criterion) {
 23  for &s in [10, 12, 16].iter() {
 24    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 25    let mut group = c.benchmark_group("r1cs_prove_benchmark");
 26    group.plot_config(plot_config);
 27
 28    let num_vars = s.pow2();
 29    let num_cons = num_vars;
 30    let num_inputs = 10;
 31    let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 32    let n = inst.get_num_vars();
 33
 34    let gens = R1CSGens::new(num_cons, num_vars, b"test-m");
 35
 36    let name = format!("r1cs_prove_{}", n);
 37    group.bench_function(&name, move |b| {
 38      b.iter(|| {
 39        let mut random_tape = RandomTape::new(b"proof");
 40        let mut prover_transcript = Transcript::new(b"example");
 41        R1CSProof::prove(
 42          black_box(&inst),
 43          black_box(vars.clone()),
 44          black_box(&input),
 45          black_box(&gens),
 46          black_box(&mut prover_transcript),
 47          black_box(&mut random_tape),
 48        )
 49      });
 50    });
 51    group.finish();
 52  }
 53}
 54
 55fn verify_benchmark(c: &mut Criterion) {
 56  for &s in [10, 12, 16, 20].iter() {
 57    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 58    let mut group = c.benchmark_group("r1cs_verify_benchmark");
 59    group.plot_config(plot_config);
 60
 61    let num_vars = s.pow2();
 62    let num_cons = num_vars;
 63    let num_inputs = 10;
 64    let (inst, vars, input) = R1CSInstance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
 65    let n = inst.get_num_vars();
 66    let gens = R1CSGens::new(num_cons, num_vars, b"test-m");
 67
 68    let mut random_tape = RandomTape::new(b"proof");
 69    let mut prover_transcript = Transcript::new(b"example");
 70    let (proof, rx, ry) = R1CSProof::prove(
 71      &inst,
 72      vars,
 73      &input,
 74      &gens,
 75      &mut prover_transcript,
 76      &mut random_tape,
 77    );
 78
 79    let eval_table_rx = EqPolynomial::new(rx.clone()).evals();
 80    let eval_table_ry = EqPolynomial::new(ry.clone()).evals();
 81    let inst_evals = inst.evaluate_with_tables(&eval_table_rx, &eval_table_ry);
 82
 83    let name = format!("r1cs_verify_{}", n);
 84    group.bench_function(&name, move |b| {
 85      b.iter(|| {
 86        let mut verifier_transcript = Transcript::new(b"example");
 87        assert!(proof
 88          .verify(
 89            black_box(num_vars),
 90            black_box(num_cons),
 91            black_box(&input),
 92            black_box(&inst_evals),
 93            black_box(&mut verifier_transcript),
 94            black_box(&gens)
 95          )
 96          .is_ok());
 97      });
 98    });
 99    group.finish();
100  }
101}
102
103fn set_duration() -> Criterion {
104  Criterion::default().sample_size(10)
105  // .measurement_time(Duration::new(0, 50000000))
106}
107
108criterion_group! {
109name = benches_r1cs;
110config = set_duration();
111targets = prove_benchmark, verify_benchmark
112}
113
114criterion_main!(benches_r1cs);