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