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);