diff --git a/examples/benches/commit.rs b/examples/benches/commit.rs index 63857e3ebcfa0bed0c6b6ab64dd70589cc20464f..551222de923abdcca0c0341edf6d374dd4e55960 100644 --- a/examples/benches/commit.rs +++ b/examples/benches/commit.rs @@ -1,9 +1,10 @@ // see `benches/README.md` use std::time::Instant; -use ark_ec::CurveGroup; +use ark_ec::{pairing::Pairing, CurveGroup}; use ark_ff::PrimeField; use ark_poly::{univariate::DensePolynomial, DenseUVPolynomial}; +use ark_poly_commit::kzg10::{self, KZG10}; use ark_std::ops::Div; use komodo::zk; @@ -42,18 +43,85 @@ where eprintln!(); } +fn ark_run<E, P>(degrees: &Vec<usize>, curve: &str) +where + E: Pairing, + P: DenseUVPolynomial<E::ScalarField>, + for<'a, 'b> &'a P: Div<&'b P, Output = P>, +{ + eprintln!("curve: {}", curve); + let rng = &mut rand::thread_rng(); + + let max_degree = *degrees.iter().max().unwrap_or(&0); + + eprint!("building trusted setup for degree {}... ", max_degree); + let setup = { + let setup = KZG10::<E, P>::setup(max_degree, false, rng).unwrap(); + let powers_of_g = setup.powers_of_g[..=max_degree].to_vec(); + let powers_of_gamma_g = (0..=max_degree) + .map(|i| setup.powers_of_gamma_g[&i]) + .collect(); + kzg10::Powers::<E> { + powers_of_g: ark_std::borrow::Cow::Owned(powers_of_g), + powers_of_gamma_g: ark_std::borrow::Cow::Owned(powers_of_gamma_g), + } + }; + eprintln!("done"); + + for (i, degree) in degrees.iter().enumerate() { + eprint!(" d: {} [{}/{}]\r", degree, i + 1, degrees.len()); + let polynomial = P::rand(*degree, rng); + + let start_time = Instant::now(); + let _ = KZG10::commit(&setup, &polynomial, None, None); + let end_time = Instant::now(); + + println!( + "{}: {} -> {}", + curve, + degree, + end_time.duration_since(start_time).as_nanos() + ); + } + eprintln!(); +} + /// ## example +/// ### non-pairing curves /// ```rust /// measure!(ark_pallas, degrees, G1=Projective, name="PALLAS"); /// ``` /// will produce /// ```rust -/// run::<ark_pallas::Fr, ark_pallas::Projective, DensePolynomial<ark_pallas::Fr>, ThreadRng>(°rees, "PALLAS"); +/// run::<ark_pallas::Fr, ark_pallas::Projective, DensePolynomial<ark_pallas::Fr>>(°rees, "PALLAS"); +/// ``` +/// +/// ### pairing-friendly curves +/// ```rust +/// measure!( +/// ark_bls12_381, +/// degrees, +/// G1 = G1Projective, +/// E = Bls12_381, +/// name = "BLS12-381" +/// ); +/// ``` +/// will produce +/// ```rust +/// run::<ark_bls12_381::Fr, ark_bls12_381::G1Projective, DensePolynomial<ark_bls12_381::Fr> >(°rees, "BLS12-381"); +/// ark_run::<ark_bls12_381::Bls12_381, DensePolynomial<<ark_bls12_381::Bls12_381 as Pairing>::ScalarField>>(°rees, "BLS12-381"); /// ``` macro_rules! measure { ($c:ident, $d:ident, G1=$g:ident, name=$n:expr) => { run::<$c::Fr, $c::$g, DensePolynomial<$c::Fr>>(&$d, $n); }; + ($c:ident, $d:ident, G1=$g:ident, E=$e:ident, name=$n:expr) => { + measure!($c, $d, G1 = $g, name = $n); + ark_run::<$c::$e, DensePolynomial<<$c::$e as Pairing>::ScalarField>>( + &$d, + concat!($n, "-ark"), + ); + }; } fn main() { @@ -71,9 +139,16 @@ fn main() { ark_bls12_381, degrees, G1 = G1Projective, + E = Bls12_381, name = "BLS12-381" ); - measure!(ark_bn254, degrees, G1 = G1Projective, name = "BN-254"); + measure!( + ark_bn254, + degrees, + G1 = G1Projective, + E = Bn254, + name = "BN-254" + ); measure!(ark_secp256k1, degrees, G1 = Projective, name = "SECP256-K1"); measure!(ark_secp256r1, degrees, G1 = Projective, name = "SECP256-R1"); measure!(ark_vesta, degrees, G1 = Projective, name = "VESTA"); diff --git a/scripts/plot/bench_commit.py b/scripts/plot/bench_commit.py index d5eeff3712786531a218a6c55c1bb77d19c3a8b9..1c674addb94a571196f1254cfc7ec5005dad27a5 100644 --- a/scripts/plot/bench_commit.py +++ b/scripts/plot/bench_commit.py @@ -13,7 +13,8 @@ if __name__ == "__main__": xs = [x["degree"] for x in group["items"]] ys = [x["t"] / NB_NS_IN_MS for x in group["items"]] - plt.plot(xs, ys, label=group["group"], marker='o') + style = "dashed" if group["group"].endswith("-ark") else "solid" + plt.plot(xs, ys, label=group["group"], marker='o', linestyle=style) plt.xlabel("degree") plt.ylabel("time (in ns)")