diff --git a/halo2_middleware/src/zal.rs b/halo2_middleware/src/zal.rs index f1b8913bf..28d9491ce 100644 --- a/halo2_middleware/src/zal.rs +++ b/halo2_middleware/src/zal.rs @@ -259,7 +259,47 @@ mod test { use group::{Curve, Group}; use rand_core::OsRng; - fn run_msm_zal(min_k: usize, max_k: usize) { + fn run_msm_zal_default(min_k: usize, max_k: usize) { + let points = (0..1 << max_k) + .map(|_| C::Curve::random(OsRng)) + .collect::>(); + let mut affine_points = vec![C::identity(); 1 << max_k]; + C::Curve::batch_normalize(&points[..], &mut affine_points[..]); + let points = affine_points; + + let scalars = (0..1 << max_k) + .map(|_| C::Scalar::random(OsRng)) + .collect::>(); + + for k in min_k..=max_k { + let points = &points[..1 << k]; + let scalars = &scalars[..1 << k]; + + let t0 = start_timer!(|| format!("freestanding msm k={}", k)); + let e0 = best_multiexp(scalars, points); + end_timer!(t0); + + let engine = PlonkEngineConfig::build_default::(); + let t1 = start_timer!(|| format!("H2cEngine msm k={}", k)); + let e1 = engine.msm_backend.msm(scalars, points); + end_timer!(t1); + + assert_eq!(e0, e1); + + // Caching API + // ----------- + let t2 = start_timer!(|| format!("H2cEngine msm cached base k={}", k)); + let base_descriptor = engine.msm_backend.get_base_descriptor(points); + let e2 = engine + .msm_backend + .msm_with_cached_base(scalars, &base_descriptor); + end_timer!(t2); + + assert_eq!(e0, e2) + } + } + + fn run_msm_zal_custom(min_k: usize, max_k: usize) { let points = (0..1 << max_k) .map(|_| C::Curve::random(OsRng)) .collect::>(); @@ -304,6 +344,7 @@ mod test { #[test] fn test_msm_zal() { - run_msm_zal::(3, 14); + run_msm_zal_default::(3, 14); + run_msm_zal_custom::(3, 14); } }