From 742c15bb515560f5753cd1db8236bc5c46d1d09e Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Wed, 14 Oct 2020 01:08:03 +0800 Subject: [PATCH] Minor changes and documentation --- src/arithmetic.rs | 6 ++++-- src/poly/multiopen/prover.rs | 7 ++++++- src/poly/multiopen/verifier.rs | 9 +++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/arithmetic.rs b/src/arithmetic.rs index 010cf47..3c03aa4 100644 --- a/src/arithmetic.rs +++ b/src/arithmetic.rs @@ -440,8 +440,8 @@ pub fn lagrange_interpolate(points: &[F], evals: &[F]) -> Vec { } else { let mut interpolation_polys = vec![]; for (j, x_j) in points.iter().enumerate() { - let mut tmp: Vec = Vec::with_capacity(points.len() + 1); - let mut product = Vec::with_capacity(points.len() + 1); + let mut tmp: Vec = Vec::with_capacity(points.len()); + let mut product = Vec::with_capacity(points.len() - 1); tmp.push(F::one()); for (k, x_k) in points.iter().enumerate() { if k != j { @@ -459,6 +459,8 @@ pub fn lagrange_interpolate(points: &[F], evals: &[F]) -> Vec { std::mem::swap(&mut tmp, &mut product); } } + assert_eq!(tmp.len(), points.len()); + assert_eq!(product.len(), points.len() - 1); interpolation_polys.push(tmp); } let mut final_poly = vec![F::zero(); points.len()]; diff --git a/src/poly/multiopen/prover.rs b/src/poly/multiopen/prover.rs index 5e90805..fbc6c0d 100644 --- a/src/poly/multiopen/prover.rs +++ b/src/poly/multiopen/prover.rs @@ -40,6 +40,9 @@ impl Proof { // x_4 challenge. let mut q_polys: Vec>> = vec![None; point_sets.len()]; let mut q_blinds = vec![Blind(C::Scalar::zero()); point_sets.len()]; + + // A vec of vecs of evals. The outer vec corresponds to the point set, + // while the inner vec corresponds to the points in a particular set. let mut q_eval_sets: Vec> = vec![Vec::new(); point_sets.len()]; for (set_idx, point_set) in point_sets.iter().enumerate() { q_eval_sets[set_idx] = vec![C::Scalar::zero(); point_set.len()]; @@ -66,6 +69,8 @@ impl Proof { }); q_blinds[set_idx] *= x_4; q_blinds[set_idx] += blind; + // Each polynomial is evaluated at a set of points. For each set, + // we collapse each polynomial's evals pointwise. for (eval_idx, &eval) in evals.iter().enumerate() { q_eval_sets[set_idx][eval_idx] *= &x_4; q_eval_sets[set_idx][eval_idx] += &eval; @@ -142,7 +147,7 @@ impl Proof { (f_poly.clone(), f_blind), |(f_poly, f_blind), (poly, blind)| { ( - f_poly * x_7 + &poly.clone().unwrap(), + f_poly * x_7 + poly.as_ref().unwrap(), Blind((f_blind.0 * &x_7) + &blind.0), ) }, diff --git a/src/poly/multiopen/verifier.rs b/src/poly/multiopen/verifier.rs index aa5aa5e..be47dbf 100644 --- a/src/poly/multiopen/verifier.rs +++ b/src/poly/multiopen/verifier.rs @@ -17,9 +17,9 @@ struct CommitmentData { evals: Vec, } -impl<'a, C: CurveAffine> Proof { +impl Proof { /// Verify a multi-opening proof - pub fn verify, HScalar: Hasher>( + pub fn verify<'a, I, HBase: Hasher, HScalar: Hasher>( &self, params: &'a Params, transcript: &mut HBase, @@ -43,6 +43,9 @@ impl<'a, C: CurveAffine> Proof { // Compress the commitments and expected evaluations at x_3 together. // using the challenge x_4 let mut q_commitments: Vec<_> = vec![params.empty_msm(); point_sets.len()]; + + // A vec of vecs of evals. The outer vec corresponds to the point set, + // while the inner vec corresponds to the points in a particular set. let mut q_eval_sets: Vec> = vec![Vec::new(); point_sets.len()]; for (set_idx, point_set) in point_sets.iter().enumerate() { q_eval_sets[set_idx] = vec![C::Scalar::zero(); point_set.len()]; @@ -57,6 +60,8 @@ impl<'a, C: CurveAffine> Proof { } }; + // Each commitment corresponds to evaluations at a set of points. + // For each set, we collapse each commitment's evals pointwise. for (commitment, commitment_data) in commitment_map { accumulate( commitment_data.set_index, // set_idx,