From ceff23fc6ba2033dc9d48d88fdd81fc39c5a11fb Mon Sep 17 00:00:00 2001 From: thelitfire Date: Wed, 15 Apr 2026 22:25:14 +0800 Subject: [PATCH 1/2] 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 fe13c6c8f..b1ba36396 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 e4c7e915c..acb55536f 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 e983617ec..988acef45 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, From b5df00fd2f8d96db869603a83ce14f02d37b34e9 Mon Sep 17 00:00:00 2001 From: thelitfire Date: Thu, 7 May 2026 07:06:37 +0800 Subject: [PATCH 2/2] fix clippy --- examples/ppot_prune.rs | 4 ++-- src/spartan/ppsnark.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/ppot_prune.rs b/examples/ppot_prune.rs index 2aed50500..696ece6b2 100644 --- a/examples/ppot_prune.rs +++ b/examples/ppot_prune.rs @@ -176,8 +176,8 @@ fn download_ptau(power: u32, dest: &PathBuf) -> Result<(), PrunerError> { downloaded += bytes_read as u64; // Print progress every 10% - if total_size > 0 { - let percent = (downloaded * 100 / total_size) as u32; + if let Some(percent) = (downloaded * 100).checked_div(total_size) { + let percent = percent as u32; if percent >= last_percent + 10 { println!( " {}% downloaded ({:.2} MB)", diff --git a/src/spartan/ppsnark.rs b/src/spartan/ppsnark.rs index d38f9331c..95f52c15f 100644 --- a/src/spartan/ppsnark.rs +++ b/src/spartan/ppsnark.rs @@ -935,8 +935,8 @@ impl> RelaxedR1CSSNARK { let evals: Vec> = evals_mem .into_iter() - .chain(evals_inner.into_iter()) - .chain(evals_witness.into_iter()) + .chain(evals_inner) + .chain(evals_witness) .collect::>>(); assert_eq!(evals.len(), claims.len());