From ceff23fc6ba2033dc9d48d88fdd81fc39c5a11fb Mon Sep 17 00:00:00 2001 From: thelitfire Date: Wed, 15 Apr 2026 22:25:14 +0800 Subject: [PATCH] commit_sparse implementation --- src/provider/hyperkzg.rs | 19 +++++++++++++++++++ src/provider/pedersen.rs | 19 +++++++++++++++++++ src/traits/commitment.rs | 9 +++++++++ 3 files changed, 47 insertions(+) diff --git a/src/provider/hyperkzg.rs b/src/provider/hyperkzg.rs index fe13c6c8..b1ba3639 100644 --- a/src/provider/hyperkzg.rs +++ b/src/provider/hyperkzg.rs @@ -744,6 +744,25 @@ where Commitment { comm } } + + fn commit_sparse( + ck: &Self::CommitmentKey, + indices: &[usize], + scalars: &[E::Scalar], + r: &E::Scalar, + ) -> Self::Commitment { + assert_eq!(indices.len(), scalars.len()); + + let bases: Vec<_> = indices.par_iter().map(|&i| ck.ck[i]).collect(); + + let mut comm = E::GE::vartime_multiscalar_mul(scalars, &bases); + + if r != &E::Scalar::ZERO { + comm += ::group(&ck.h) * r; + } + + Commitment { comm } + } } /// Provides an implementation of generators for proving evaluations diff --git a/src/provider/pedersen.rs b/src/provider/pedersen.rs index e4c7e915..acb55536 100644 --- a/src/provider/pedersen.rs +++ b/src/provider/pedersen.rs @@ -428,6 +428,25 @@ where Commitment { comm } } + + fn commit_sparse( + ck: &Self::CommitmentKey, + indices: &[usize], + scalars: &[E::Scalar], + r: &E::Scalar, + ) -> Self::Commitment { + assert_eq!(indices.len(), scalars.len()); + + let bases: Vec<_> = indices.par_iter().map(|&i| ck.ck[i]).collect(); + + let mut comm = E::GE::vartime_multiscalar_mul(scalars, &bases); + + if r != &E::Scalar::ZERO { + comm += ::group(&ck.h) * r; + } + + Commitment { comm } + } } /// A trait listing properties of a commitment key that can be managed in a divide-and-conquer fashion diff --git a/src/traits/commitment.rs b/src/traits/commitment.rs index e983617e..988acef4 100644 --- a/src/traits/commitment.rs +++ b/src/traits/commitment.rs @@ -110,6 +110,15 @@ pub trait CommitmentEngineTrait: Clone + Send + Sync { r: &E::Scalar, ) -> Self::Commitment; + /// Commits to the provided vector of sparse scalars given by (indices, scalars), + /// using the provided generators and random blind + fn commit_sparse( + ck: &Self::CommitmentKey, + indices: &[usize], + scalars: &[E::Scalar], + r: &E::Scalar, + ) -> Self::Commitment; + /// Commits to the provided vector of "small" scalars (at most 64 bits) using the provided generators and random blind fn commit_small + Copy + Sync + ToPrimitive>( ck: &Self::CommitmentKey,