@@ -90,6 +90,64 @@ mod test {
9090 > ( & verifier_params, & proof[ ..] , true ) ;
9191 }
9292
93+ #[ test]
94+ fn test_identical_queries_gwc ( ) {
95+ use crate :: poly:: kzg:: commitment:: { KZGCommitmentScheme , ParamsKZG } ;
96+ use crate :: poly:: kzg:: multiopen:: { ProverGWC , VerifierGWC } ;
97+ use crate :: poly:: kzg:: strategy:: AccumulatorStrategy ;
98+ use halo2curves:: bn256:: Bn256 ;
99+
100+ const K : u32 = 4 ;
101+
102+ let engine = H2cEngine :: new ( ) ;
103+ let params = ParamsKZG :: < Bn256 > :: new ( K ) ;
104+
105+ let proof = create_proof :: <
106+ KZGCommitmentScheme < Bn256 > ,
107+ ProverGWC < _ > ,
108+ _ ,
109+ Blake2bWrite < _ , _ , Challenge255 < _ > > ,
110+ > ( & engine, & params) ;
111+
112+ let verifier_params = params. verifier_params ( ) ;
113+ verify_identical_queries :: <
114+ KZGCommitmentScheme < Bn256 > ,
115+ VerifierGWC < _ > ,
116+ _ ,
117+ Blake2bRead < _ , _ , Challenge255 < _ > > ,
118+ AccumulatorStrategy < _ > ,
119+ > ( & verifier_params, & proof[ ..] ) ;
120+ }
121+
122+ #[ test]
123+ fn test_identical_queries_shplonk ( ) {
124+ use crate :: poly:: kzg:: commitment:: { KZGCommitmentScheme , ParamsKZG } ;
125+ use crate :: poly:: kzg:: multiopen:: { ProverSHPLONK , VerifierSHPLONK } ;
126+ use crate :: poly:: kzg:: strategy:: AccumulatorStrategy ;
127+ use halo2curves:: bn256:: Bn256 ;
128+
129+ const K : u32 = 4 ;
130+
131+ let engine = H2cEngine :: new ( ) ;
132+ let params = ParamsKZG :: < Bn256 > :: new ( K ) ;
133+
134+ let proof = create_proof :: <
135+ KZGCommitmentScheme < Bn256 > ,
136+ ProverSHPLONK < _ > ,
137+ _ ,
138+ Blake2bWrite < _ , _ , Challenge255 < _ > > ,
139+ > ( & engine, & params) ;
140+
141+ let verifier_params = params. verifier_params ( ) ;
142+ verify_identical_queries :: <
143+ KZGCommitmentScheme < Bn256 > ,
144+ VerifierSHPLONK < _ > ,
145+ _ ,
146+ Blake2bRead < _ , _ , Challenge255 < _ > > ,
147+ AccumulatorStrategy < _ > ,
148+ > ( & verifier_params, & proof[ ..] ) ;
149+ }
150+
93151 fn verify <
94152 ' a ,
95153 ' params ,
@@ -223,4 +281,54 @@ mod test {
223281
224282 transcript. finalize ( )
225283 }
284+
285+ fn verify_identical_queries <
286+ ' a ,
287+ ' params ,
288+ Scheme : CommitmentScheme ,
289+ V : Verifier < ' params , Scheme > ,
290+ E : EncodedChallenge < Scheme :: Curve > ,
291+ T : TranscriptReadBuffer < & ' a [ u8 ] , Scheme :: Curve , E > ,
292+ Strategy : VerificationStrategy < ' params , Scheme , V > + std:: fmt:: Debug ,
293+ > (
294+ params : & ' params Scheme :: ParamsVerifier ,
295+ proof : & ' a [ u8 ] ,
296+ ) {
297+ use assert_matches:: assert_matches;
298+ use group:: ff:: Field ;
299+
300+ let verifier = V :: new ( ) ;
301+
302+ let mut transcript = T :: init ( proof) ;
303+
304+ let a = transcript. read_point ( ) . unwrap ( ) ;
305+ let b = transcript. read_point ( ) . unwrap ( ) ;
306+ let c = transcript. read_point ( ) . unwrap ( ) ;
307+
308+ let x = transcript. squeeze_challenge ( ) ;
309+ let y = transcript. squeeze_challenge ( ) ;
310+
311+ let avx = transcript. read_scalar ( ) . unwrap ( ) ;
312+ let bvx = transcript. read_scalar ( ) . unwrap ( ) ;
313+ let cvy = transcript. read_scalar ( ) . unwrap ( ) ;
314+
315+ let bvx_bad = <Scheme as CommitmentScheme >:: Scalar :: random ( OsRng ) ;
316+
317+ #[ rustfmt:: skip]
318+ let invalid_queries = std:: iter:: empty ( )
319+ . chain ( Some ( VerifierQuery :: new_commitment ( & a, x. get_scalar ( ) , avx) ) )
320+ . chain ( Some ( VerifierQuery :: new_commitment ( & b, x. get_scalar ( ) , bvx) ) )
321+ . chain ( Some ( VerifierQuery :: new_commitment ( & b, x. get_scalar ( ) , bvx_bad) ) ) // This is wrong.
322+ . chain ( Some ( VerifierQuery :: new_commitment ( & c, y. get_scalar ( ) , cvy) ) ) ;
323+
324+ let strategy = Strategy :: new ( params) ;
325+ assert_matches ! (
326+ strategy. process( |msm_accumulator| {
327+ verifier
328+ . verify_proof( & mut transcript, invalid_queries. clone( ) , msm_accumulator)
329+ . map_err( |_| Error :: Opening )
330+ } ) ,
331+ Err ( Error :: Opening )
332+ ) ;
333+ }
226334}
0 commit comments