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