@@ -22,13 +22,14 @@ use std::{iter, marker::PhantomData, rc::Rc};
2222
2323/// Aggregation circuit for testing purpose.
2424#[ derive( Clone ) ]
25+ #[ allow( clippy:: type_complexity) ]
2526pub struct TestAggregationCircuit < ' a , M : MultiMillerLoop , As >
2627where
2728 M :: G1Affine : CurveAffine ,
2829{
2930 svk : KzgSvk < M > ,
3031 snarks : Vec < SnarkWitness < ' a , M :: G1Affine > > ,
31- user_challenge : Option < ( UserChallenge , Vec < M :: Fr > ) > ,
32+ user_challenge : Option < ( UserChallenge , Vec < M :: G1Affine > , Vec < M :: Fr > ) > ,
3233 instances : Vec < M :: Fr > ,
3334 _marker : PhantomData < As > ,
3435}
@@ -53,10 +54,11 @@ where
5354{
5455 /// Create an Aggregation circuit with aggregated accumulator computed.
5556 /// Returns `None` if any given snark is invalid.
57+ #[ allow( clippy:: type_complexity) ]
5658 pub fn new (
5759 params : & ParamsKZG < M > ,
5860 snarks : impl IntoIterator < Item = Snark < ' a , M :: G1Affine > > ,
59- user_challenge : Option < ( UserChallenge , Vec < M :: Fr > ) > ,
61+ user_challenge : Option < ( UserChallenge , Vec < M :: G1Affine > , Vec < M :: Fr > ) > ,
6062 ) -> Result < Self , snark_verifier:: Error > {
6163 let snarks = snarks. into_iter ( ) . collect_vec ( ) ;
6264
@@ -156,16 +158,43 @@ where
156158 config. aggregate :: < M , As > ( ctx, & self . svk , & self . snarks ) ?;
157159
158160 // aggregate user challenge for rwtable permutation challenge
159- let user_challenge = self . user_challenge . as_ref ( ) . map ( |( challenge, _) | challenge) ;
160- let challenges = config. aggregate_user_challenges :: < M , As > (
161+ let user_challenge = self
162+ . user_challenge
163+ . as_ref ( )
164+ . map ( |( challenge, _, _) | challenge) ;
165+ let ( challenges, commitments) = config. aggregate_user_challenges :: < M , As > (
161166 loader. clone ( ) ,
162167 user_challenge,
163168 proofs,
164169 ) ?;
165170 if !challenges. is_empty ( ) {
166- let Some ( ( _, expected_challenges) ) = self . user_challenge . as_ref ( ) else {
171+ let Some ( ( _, expected_commitments, expected_challenges) ) =
172+ self . user_challenge . as_ref ( )
173+ else {
167174 return Err ( InvalidInstances ) ;
168175 } ;
176+ // check commitment equality
177+ let expected_commitments_loaded = expected_commitments
178+ . iter ( )
179+ . map ( |expected_commitment| {
180+ loader. ecc_chip ( ) . assign_point (
181+ & mut loader. ctx_mut ( ) ,
182+ Value :: known ( * expected_commitment) ,
183+ )
184+ } )
185+ . collect :: < Result < Vec < _ > , Error > > ( ) ?;
186+ expected_commitments_loaded
187+ . iter ( )
188+ . zip ( commitments. iter ( ) )
189+ . try_for_each ( |( expected_commitment, commitment) | {
190+ loader. ecc_chip ( ) . assert_equal (
191+ & mut loader. ctx_mut ( ) ,
192+ expected_commitment,
193+ & commitment. assigned ( ) ,
194+ )
195+ } ) ?;
196+
197+ // check challenge equality
169198 let expected_challenges_loaded = expected_challenges
170199 . iter ( )
171200 . map ( |value| loader. assign_scalar ( Value :: known ( * value) ) )
0 commit comments