arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/polycommit.rs
benches/polycommit.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 criterion::*;
 11use libspartan::dense_mlpoly::{DensePolynomial, PolyCommitmentGens, PolyEvalProof};
 12use libspartan::math::Math;
 13use libspartan::random::RandomTape;
 14use libspartan::scalar::Scalar;
 15use libspartan::transcript::ProofTranscript;
 16use merlin::Transcript;
 17use rand::rngs::OsRng;
 18
 19fn commit_benchmark(c: &mut Criterion) {
 20  let mut csprng: OsRng = OsRng;
 21
 22  for &s in [4, 8, 12, 14, 16, 20].iter() {
 23    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 24    let mut group = c.benchmark_group("commit_benchmark");
 25    group.plot_config(plot_config);
 26
 27    let n = (s as usize).pow2();
 28    let m = n.square_root();
 29    let z = (0..n)
 30      .map(|_i| Scalar::random(&mut csprng))
 31      .collect::<Vec<Scalar>>();
 32    assert_eq!(m * m, z.len()); // check if Z's size if a perfect square
 33
 34    let poly = DensePolynomial::new(z);
 35    let gens = PolyCommitmentGens::new(s, b"test-m");
 36    let name = format!("polycommit_commit_{}", n);
 37    group.bench_function(&name, move |b| {
 38      b.iter(|| poly.commit(black_box(false), black_box(&gens), black_box(None)));
 39    });
 40    group.finish();
 41  }
 42}
 43
 44fn eval_benchmark(c: &mut Criterion) {
 45  let mut csprng: OsRng = OsRng;
 46
 47  for &s in [4, 8, 12, 14, 16, 20].iter() {
 48    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 49    let mut group = c.benchmark_group("eval_benchmark");
 50    group.plot_config(plot_config);
 51
 52    let n = (s as usize).pow2();
 53    let m = n.square_root();
 54    let mut z: Vec<Scalar> = Vec::new();
 55    for _ in 0..n {
 56      z.push(Scalar::random(&mut csprng));
 57    }
 58    assert_eq!(m * m, z.len()); // check if Z's size if a perfect square
 59
 60    let poly = DensePolynomial::new(z);
 61
 62    let mut r: Vec<Scalar> = Vec::new();
 63    for _ in 0..s {
 64      r.push(Scalar::random(&mut csprng));
 65    }
 66
 67    let name = format!("polycommit_eval_{}", n);
 68    group.bench_function(&name, move |b| {
 69      b.iter(|| poly.evaluate(black_box(&r)));
 70    });
 71    group.finish();
 72  }
 73}
 74
 75fn evalproof_benchmark(c: &mut Criterion) {
 76  let mut csprng: OsRng = OsRng;
 77
 78  for &s in [4, 8, 12, 14, 16, 20].iter() {
 79    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 80    let mut group = c.benchmark_group("evalproof_benchmark");
 81    group.plot_config(plot_config);
 82
 83    let n = (s as usize).pow2();
 84    let m = n.square_root();
 85    let mut z: Vec<Scalar> = Vec::new();
 86    for _ in 0..n {
 87      z.push(Scalar::random(&mut csprng));
 88    }
 89    assert_eq!(m * m, z.len()); // check if Z's size if a perfect square
 90
 91    let poly = DensePolynomial::new(z);
 92
 93    let gens = PolyCommitmentGens::new(s, b"test-m");
 94
 95    let mut r: Vec<Scalar> = Vec::new();
 96    for _ in 0..s {
 97      r.push(Scalar::random(&mut csprng));
 98    }
 99
100    let eval = poly.evaluate(&r);
101
102    let name = format!("polycommit_evalproof_{}", n);
103    group.bench_function(&name, move |b| {
104      b.iter(|| {
105        let mut random_tape = RandomTape::new(b"proof");
106        let mut prover_transcript = Transcript::new(b"example");
107        PolyEvalProof::prove(
108          black_box(&poly),
109          black_box(None),
110          black_box(&r),
111          black_box(&eval),
112          black_box(None),
113          black_box(&gens),
114          black_box(&mut prover_transcript),
115          black_box(&mut random_tape),
116        )
117      });
118    });
119    group.finish();
120  }
121}
122
123fn evalproofverify_benchmark(c: &mut Criterion) {
124  let mut csprng: OsRng = OsRng;
125
126  for &s in [4, 8, 12, 14, 16, 20].iter() {
127    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
128    let mut group = c.benchmark_group("evalproofverify_benchmark");
129    group.plot_config(plot_config);
130
131    let n = s.pow2();
132    let m = n.square_root();
133    let mut z: Vec<Scalar> = Vec::new();
134    for _ in 0..n {
135      z.push(Scalar::random(&mut csprng));
136    }
137    assert_eq!(m * m, z.len()); // check if Z's size if a perfect square
138
139    let poly = DensePolynomial::new(z);
140    let gens = PolyCommitmentGens::new(s, b"test-m");
141
142    let mut r: Vec<Scalar> = Vec::new();
143    for _ in 0..s {
144      r.push(Scalar::random(&mut csprng));
145    }
146
147    let (poly_commitment, blinds) = poly.commit(false, &gens, None);
148    let eval = poly.evaluate(&r);
149
150    let mut random_tape = RandomTape::new(b"proof");
151    let mut prover_transcript = Transcript::new(b"example");
152    let (proof, c_zr) = PolyEvalProof::prove(
153      black_box(&poly),
154      black_box(Some(&blinds)),
155      black_box(&r),
156      black_box(&eval),
157      black_box(None),
158      black_box(&gens),
159      black_box(&mut prover_transcript),
160      black_box(&mut random_tape),
161    );
162    let name = format!("polycommit_evalproofverify_{}", n);
163    group.bench_function(&name, move |b| {
164      b.iter(|| {
165        let mut verifier_transcript = Transcript::new(b"example");
166
167        proof.verify(
168          black_box(&gens),
169          black_box(&mut verifier_transcript),
170          black_box(&r),
171          black_box(&c_zr),
172          black_box(&poly_commitment),
173        )
174      });
175    });
176    group.finish();
177  }
178}
179
180fn set_duration() -> Criterion {
181  Criterion::default().sample_size(10)
182  // .measurement_time(Duration::new(0, 50000000))
183}
184
185criterion_group! {
186name = benches_polycommit;
187config = set_duration();
188targets = commit_benchmark, eval_benchmark, evalproof_benchmark, evalproofverify_benchmark
189}
190
191criterion_main!(benches_polycommit);