arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/benches/sumcheck.rs
benches/sumcheck.rsRaw
  1#![allow(non_snake_case)]
  2
  3extern crate byteorder;
  4extern crate core;
  5extern crate criterion;
  6extern crate digest;
  7extern crate libspartan;
  8extern crate merlin;
  9extern crate rand;
 10extern crate sha3;
 11
 12use libspartan::commitments::Commitments;
 13use libspartan::commitments::MultiCommitGens;
 14use libspartan::dense_mlpoly::DensePolynomial;
 15use libspartan::math::Math;
 16use libspartan::nizk::DotProductProof;
 17use libspartan::scalar::Scalar;
 18use libspartan::sumcheck::ZKSumcheckInstanceProof;
 19use libspartan::transcript::ProofTranscript;
 20use merlin::Transcript;
 21use rand::rngs::OsRng;
 22
 23use criterion::*;
 24
 25fn prove_benchmark(c: &mut Criterion) {
 26  for &s in [10, 12, 16, 20].iter() {
 27    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 28    let mut group = c.benchmark_group("zksumcheck_prove_benchmark");
 29    group.plot_config(plot_config);
 30
 31    // produce tables
 32    let gens_n = MultiCommitGens::new(3, b"test-m");
 33    let gens_1 = MultiCommitGens::new(1, b"test-1");
 34    let num_rounds = s;
 35    let n = s.pow2();
 36
 37    let mut csprng: OsRng = OsRng;
 38
 39    let vec_A = (0..n)
 40      .map(|_i| Scalar::random(&mut csprng))
 41      .collect::<Vec<Scalar>>();
 42    let vec_B = (0..n)
 43      .map(|_i| Scalar::random(&mut csprng))
 44      .collect::<Vec<Scalar>>();
 45    let claim = DotProductProof::compute_dotproduct(&vec_A, &vec_B);
 46    let mut poly_A = DensePolynomial::new(vec_A);
 47    let mut poly_B = DensePolynomial::new(vec_B);
 48
 49    let blind_claim = Scalar::random(&mut csprng);
 50    let comb_func =
 51      |poly_A_comp: &Scalar, poly_B_comp: &Scalar| -> Scalar { poly_A_comp * poly_B_comp };
 52
 53    let name = format!("zksumcheck_prove_{}", n);
 54    group.bench_function(&name, move |b| {
 55      b.iter(|| {
 56        let mut random_tape = {
 57          let mut csprng: OsRng = OsRng;
 58          let mut tape = Transcript::new(b"proof");
 59          tape.append_scalar(b"init_randomness", &Scalar::random(&mut csprng));
 60          tape
 61        };
 62        let mut prover_transcript = Transcript::new(b"example");
 63        ZKSumcheckInstanceProof::prove_quad(
 64          black_box(&claim),
 65          black_box(&blind_claim),
 66          black_box(num_rounds),
 67          black_box(&mut poly_A),
 68          black_box(&mut poly_B),
 69          black_box(comb_func),
 70          black_box(&gens_1),
 71          black_box(&gens_n),
 72          black_box(&mut prover_transcript),
 73          black_box(&mut random_tape),
 74        )
 75      });
 76    });
 77    group.finish();
 78  }
 79}
 80
 81fn verify_benchmark(c: &mut Criterion) {
 82  for &s in [10, 12, 16, 20].iter() {
 83    let plot_config = PlotConfiguration::default().summary_scale(AxisScale::Logarithmic);
 84    let mut group = c.benchmark_group("zksumcheck_verify_benchmark");
 85    group.plot_config(plot_config);
 86
 87    // produce tables
 88    let gens_n = MultiCommitGens::new(3, b"test-m");
 89    let gens_1 = MultiCommitGens::new(1, b"test-1");
 90    let num_rounds = s;
 91    let n = s.pow2();
 92
 93    let mut csprng: OsRng = OsRng;
 94
 95    let vec_A = (0..n)
 96      .map(|_i| Scalar::random(&mut csprng))
 97      .collect::<Vec<Scalar>>();
 98    let vec_B = (0..n)
 99      .map(|_i| Scalar::random(&mut csprng))
100      .collect::<Vec<Scalar>>();
101    let claim = DotProductProof::compute_dotproduct(&vec_A, &vec_B);
102    let mut poly_A = DensePolynomial::new(vec_A);
103    let mut poly_B = DensePolynomial::new(vec_B);
104    let blind_claim = Scalar::random(&mut csprng);
105    let comb_func =
106      |poly_A_comp: &Scalar, poly_B_comp: &Scalar| -> Scalar { poly_A_comp * poly_B_comp };
107
108    let mut random_tape = {
109      let mut csprng: OsRng = OsRng;
110      let mut tape = Transcript::new(b"proof");
111      tape.append_scalar(b"init_randomness", &Scalar::random(&mut csprng));
112      tape
113    };
114
115    let mut prover_transcript = Transcript::new(b"example");
116    let (proof, _r, _v, _blind_post_claim) = ZKSumcheckInstanceProof::prove_quad(
117      &claim,
118      &blind_claim,
119      num_rounds,
120      &mut poly_A,
121      &mut poly_B,
122      comb_func,
123      &gens_1,
124      &gens_n,
125      &mut prover_transcript,
126      &mut random_tape,
127    );
128
129    let name = format!("zksumcheck_verify_{}", n);
130    let degree_bound = 2;
131    let comm_claim = claim.commit(&blind_claim, &gens_1).compress();
132    group.bench_function(&name, move |b| {
133      b.iter(|| {
134        let mut verifier_transcript = Transcript::new(b"example");
135        assert!(proof
136          .verify(
137            black_box(&comm_claim),
138            black_box(num_rounds),
139            black_box(degree_bound),
140            black_box(&gens_1),
141            black_box(&gens_n),
142            black_box(&mut verifier_transcript)
143          )
144          .is_ok())
145      });
146    });
147    group.finish();
148  }
149}
150
151fn set_duration() -> Criterion {
152  Criterion::default().sample_size(10)
153  // .measurement_time(Duration::new(0, 50000000))
154}
155
156criterion_group! {
157name = benches_r1cs;
158config = set_duration();
159targets = verify_benchmark, prove_benchmark
160}
161
162criterion_main!(benches_r1cs);