From 6a7361ca937c8ac56c98cc43cc11c4b31d5ab44b Mon Sep 17 00:00:00 2001
From: Piotr Roslaniec
Date: Mon, 26 Jun 2023 14:31:51 +0200
Subject: [PATCH] benchmarks evaluation domains
---
ferveo/benches/bench_main.rs | 1 +
ferveo/benches/benchmarks/eval_domain.rs | 57 ++++++++++++++++++++++++
ferveo/benches/benchmarks/mod.rs | 1 +
ferveo/src/pvss.rs | 2 +-
4 files changed, 60 insertions(+), 1 deletion(-)
create mode 100644 ferveo/benches/benchmarks/eval_domain.rs
diff --git a/ferveo/benches/bench_main.rs b/ferveo/benches/bench_main.rs
index fbd7c746..81bdb5d9 100644
--- a/ferveo/benches/bench_main.rs
+++ b/ferveo/benches/bench_main.rs
@@ -7,4 +7,5 @@ criterion_main! {
// bench_batch_inverse,
// benchmarks::pairing::ec,
benchmarks::validity_checks::validity_checks,
+ benchmarks::eval_domain::eval_domain,
}
diff --git a/ferveo/benches/benchmarks/eval_domain.rs b/ferveo/benches/benchmarks/eval_domain.rs
new file mode 100644
index 00000000..cdb6d3c1
--- /dev/null
+++ b/ferveo/benches/benchmarks/eval_domain.rs
@@ -0,0 +1,57 @@
+#![allow(clippy::redundant_closure)]
+#![allow(clippy::unit_arg)]
+
+pub use ark_bls12_381::Bls12_381 as EllipticCurve;
+use ark_ff::Field;
+use ark_poly::EvaluationDomain;
+use criterion::{black_box, criterion_group, BenchmarkId, Criterion};
+use digest::crypto_common::rand_core::SeedableRng;
+use ferveo_pre_release::*;
+use rand::prelude::StdRng;
+
+const NUM_SHARES_CASES: [usize; 6] = [2, 4, 8, 16, 32, 64];
+
+pub fn bench_eval_domain(c: &mut Criterion) {
+ let mut group = c.benchmark_group("EVAL DOMAIN");
+ group.sample_size(10);
+
+ let rng = &mut StdRng::seed_from_u64(0);
+ let s = ark_bls12_381::Fr::from_random_bytes(&[0u8; 32]).unwrap();
+
+ for shares_num in NUM_SHARES_CASES {
+ let eval_radix2_eval_domain = {
+ let domain =
+ ark_poly::Radix2EvaluationDomain::new(shares_num).unwrap();
+ let phi = SecretPolynomial::::new(
+ &s, shares_num, rng,
+ );
+
+ move || {
+ black_box(phi.0.evaluate_over_domain_by_ref(domain));
+ }
+ };
+
+ let eval_mixed_eval_domain = {
+ let domain =
+ ark_poly::MixedRadixEvaluationDomain::new(shares_num).unwrap();
+ let phi = SecretPolynomial::::new(
+ &s, shares_num, rng,
+ );
+
+ move || {
+ black_box(phi.0.evaluate_over_domain_by_ref(domain));
+ }
+ };
+
+ group.bench_function(
+ BenchmarkId::new("eval_radix2_eval_domain", shares_num),
+ |b| b.iter(|| eval_radix2_eval_domain()),
+ );
+ group.bench_function(
+ BenchmarkId::new("eval_mixed_eval_domain", shares_num),
+ |b| b.iter(|| eval_mixed_eval_domain()),
+ );
+ }
+}
+
+criterion_group!(eval_domain, bench_eval_domain);
diff --git a/ferveo/benches/benchmarks/mod.rs b/ferveo/benches/benchmarks/mod.rs
index 0a6bfabe..7e19ab37 100644
--- a/ferveo/benches/benchmarks/mod.rs
+++ b/ferveo/benches/benchmarks/mod.rs
@@ -1,3 +1,4 @@
//pub mod block_proposer;
// pub mod pairing;
+pub mod eval_domain;
pub mod validity_checks;
diff --git a/ferveo/src/pvss.rs b/ferveo/src/pvss.rs
index d79f7c21..af05c4da 100644
--- a/ferveo/src/pvss.rs
+++ b/ferveo/src/pvss.rs
@@ -71,7 +71,7 @@ impl Default for PubliclyVerifiableParams {
/// Secret polynomial used in the PVSS protocol
/// We wrap this in a struct so that we can zeroize it after use
-struct SecretPolynomial(DensePolynomial);
+pub struct SecretPolynomial(pub DensePolynomial);
impl SecretPolynomial {
pub fn new(