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/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/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()); 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,