@@ -4,7 +4,8 @@ use super::binding::{
44} ;
55use crate :: {
66 arithmetics:: {
7- PolyEvaluator , UniPolyExtrapolator , challenger_multi_observe, eq_eval, eval_ceno_expr_with_instance, eval_wellform_address_vec, mask_arr, reverse
7+ PolyEvaluator , UniPolyExtrapolator , assert_ext_arr_eq, challenger_multi_observe, eq_eval,
8+ eval_ceno_expr_with_instance, eval_wellform_address_vec, mask_arr, reverse,
89 } ,
910 basefold_verifier:: {
1011 basefold:: { BasefoldCommitmentVariable , RoundOpeningVariable , RoundVariable } ,
@@ -373,9 +374,11 @@ pub fn verify_zkvm_proof<C: Config<F = F>>(
373374 builder. assign ( & prod_w, prod_w * w_out_evals_prod) ;
374375
375376 builder. inc ( & num_chips_verified) ;
376- builder. if_ne ( chip_shard_ec_sum. is_infinity . clone ( ) , Usize :: from ( 1 ) ) . then ( |builder| {
377- add_septic_points_in_place ( builder, & shard_ec_sum, & chip_shard_ec_sum) ;
378- } ) ;
377+ builder
378+ . if_ne ( chip_shard_ec_sum. is_infinity . clone ( ) , Usize :: from ( 1 ) )
379+ . then ( |builder| {
380+ add_septic_points_in_place ( builder, & shard_ec_sum, & chip_shard_ec_sum) ;
381+ } ) ;
379382 } ) ;
380383 }
381384 builder. assert_eq :: < Usize < _ > > ( num_chips_verified, chip_indices. len ( ) ) ;
@@ -595,13 +598,6 @@ pub fn verify_chip_proof<C: Config>(
595598 } ) ;
596599 }
597600
598- // _debug: constraint
599- // debug_assert!(
600- // chain!(&record_evals, &logup_p_evals, &logup_q_evals)
601- // .map(|e| &e.point)
602- // .all_equal()
603- // );
604-
605601 let num_rw_records: Usize < C :: N > = builder. eval ( r_counts_per_instance + w_counts_per_instance) ;
606602 builder. assert_usize_eq ( record_evals. len ( ) , num_rw_records. clone ( ) ) ;
607603 builder. assert_usize_eq ( logup_p_evals. len ( ) , lk_counts_per_instance. clone ( ) ) ;
@@ -790,11 +786,17 @@ pub fn verify_gkr_circuit<C: Config>(
790786 ) ;
791787
792788 if layer. rotation_sumcheck_expression . is_some ( ) {
793- builder. assert_usize_eq ( Usize :: from ( layer. out_sel_and_eval_exprs . len ( ) + 3 ) , eval_and_dedup_points. len ( ) ) ;
789+ builder. assert_usize_eq (
790+ Usize :: from ( layer. out_sel_and_eval_exprs . len ( ) + 3 ) ,
791+ eval_and_dedup_points. len ( ) ,
792+ ) ;
794793 } else {
795- builder. assert_usize_eq ( Usize :: from ( layer. out_sel_and_eval_exprs . len ( ) ) , eval_and_dedup_points. len ( ) ) ;
794+ builder. assert_usize_eq (
795+ Usize :: from ( layer. out_sel_and_eval_exprs . len ( ) ) ,
796+ eval_and_dedup_points. len ( ) ,
797+ ) ;
796798 }
797-
799+
798800 // ZeroCheckLayer verification (might include other layer types in the future)
799801 let LayerProofVariable {
800802 main :
@@ -1532,8 +1534,12 @@ pub fn evaluate_gkr_expression<C: Config>(
15321534
15331535 assert_eq ! ( parts. len( ) , 1 << indices. len( ) ) ;
15341536
1535- // _debug
1536- // assert!(parts.iter().all(|part| part.point == parts[0].point));
1537+ if !parts. is_empty ( ) {
1538+ let first_pt = parts[ 0 ] . point . fs . clone ( ) ;
1539+ for pt_eval in parts. iter ( ) . skip ( 1 ) {
1540+ assert_ext_arr_eq ( builder, & first_pt, & pt_eval. point . fs ) ;
1541+ }
1542+ }
15371543
15381544 // FIXME: this is WRONG. we should use builder.dyn_array();
15391545 let mut new_point: Vec < Ext < C :: F , C :: EF > > = vec ! [ ] ;
@@ -2168,54 +2174,59 @@ pub fn add_septic_points_in_place<C: Config>(
21682174 left : & SepticPointVariable < C > ,
21692175 right : & SepticPointVariable < C > ,
21702176) {
2171- builder. if_eq ( left . is_infinity . clone ( ) , Usize :: from ( 1 ) ) . then_or_else ( |builder| {
2172- builder . assign ( & left. x , right . x . clone ( ) ) ;
2173- builder . assign ( & left . y , right . y . clone ( ) ) ;
2174- builder. assign ( & left . is_infinity , right . is_infinity . clone ( ) ) ;
2175- } , | builder| {
2176- builder
2177- . if_ne ( right. is_infinity . clone ( ) , Usize :: from ( 1 ) )
2178- . then ( |builder| {
2179- let x_diff = septic_ext_sub ( builder, & right . x , & left . x ) ;
2180- let y_diff = septic_ext_sub ( builder, & right . y , & left . y ) ;
2181- let is_x_same = x_diff . is_zero ( builder ) ;
2182-
2183- builder. if_eq ( is_x_same , Usize :: from ( 1 ) ) . then_or_else (
2184- | builder| {
2185- let is_y_same = y_diff . is_zero ( builder) ;
2177+ builder
2178+ . if_eq ( left. is_infinity . clone ( ) , Usize :: from ( 1 ) )
2179+ . then_or_else (
2180+ | builder| {
2181+ builder. assign ( & left . x , right . x . clone ( ) ) ;
2182+ builder. assign ( & left . y , right . y . clone ( ) ) ;
2183+ builder . assign ( & left . is_infinity , right. is_infinity . clone ( ) ) ;
2184+ } ,
2185+ | builder| {
2186+ builder
2187+ . if_ne ( right . is_infinity . clone ( ) , Usize :: from ( 1 ) )
2188+ . then ( |builder| {
2189+ let x_diff = septic_ext_sub ( builder, & right . x , & left . x ) ;
2190+ let y_diff = septic_ext_sub ( builder, & right . y , & left . y ) ;
2191+ let is_x_same = x_diff . is_zero ( builder) ;
21862192
2187- builder. if_eq ( is_y_same , Usize :: from ( 1 ) ) . then_or_else (
2193+ builder. if_eq ( is_x_same , Usize :: from ( 1 ) ) . then_or_else (
21882194 |builder| {
2189- double_septic_points_in_place ( builder, left) ;
2195+ let is_y_same = y_diff. is_zero ( builder) ;
2196+
2197+ builder. if_eq ( is_y_same, Usize :: from ( 1 ) ) . then_or_else (
2198+ |builder| {
2199+ double_septic_points_in_place ( builder, left) ;
2200+ } ,
2201+ |builder| {
2202+ let y_sum = septic_ext_add ( builder, & right. y , & left. y ) ;
2203+ let is_y_sum_zero = y_sum. is_zero ( builder) ;
2204+ builder. assert_usize_eq ( is_y_sum_zero, Usize :: from ( 1 ) ) ;
2205+ let zero_ext_arr: Array < C , Ext < C :: F , C :: EF > > =
2206+ builder. dyn_array ( SEPTIC_EXTENSION_DEGREE ) ;
2207+ builder. assign ( & left. x , zero_ext_arr. clone ( ) ) ;
2208+ builder. assign ( & left. y , zero_ext_arr. clone ( ) ) ;
2209+ builder. assign ( & left. is_infinity , Usize :: from ( 1 ) ) ;
2210+ } ,
2211+ ) ;
21902212 } ,
21912213 |builder| {
2192- let y_sum = septic_ext_add ( builder, & right. y , & left. y ) ;
2193- let is_y_sum_zero = y_sum. is_zero ( builder) ;
2194- builder. assert_usize_eq ( is_y_sum_zero, Usize :: from ( 1 ) ) ;
2195- let zero_ext_arr: Array < C , Ext < C :: F , C :: EF > > =
2196- builder. dyn_array ( SEPTIC_EXTENSION_DEGREE ) ;
2197- builder. assign ( & left. x , zero_ext_arr. clone ( ) ) ;
2198- builder. assign ( & left. y , zero_ext_arr. clone ( ) ) ;
2199- builder. assign ( & left. is_infinity , Usize :: from ( 1 ) ) ;
2200- } ,
2201- ) ;
2202- } ,
2203- |builder| {
2204- let x_diff_inv = invert ( builder, & x_diff) ;
2205- let slope = septic_ext_mul ( builder, & y_diff, & x_diff_inv) ;
2214+ let x_diff_inv = invert ( builder, & x_diff) ;
2215+ let slope = septic_ext_mul ( builder, & y_diff, & x_diff_inv) ;
22062216
2207- let x_sum = septic_ext_add ( builder, & right. x , & left. x ) ;
2208- let slope_squared = septic_ext_squared ( builder, & slope) ;
2209- let x = septic_ext_sub ( builder, & slope_squared, & x_sum) ;
2217+ let x_sum = septic_ext_add ( builder, & right. x , & left. x ) ;
2218+ let slope_squared = septic_ext_squared ( builder, & slope) ;
2219+ let x = septic_ext_sub ( builder, & slope_squared, & x_sum) ;
22102220
2211- let slope_mul_x_diff = septic_ext_mul ( builder, & slope, & x_diff) ;
2212- let y = septic_ext_sub ( builder, & slope_mul_x_diff, & left. y ) ;
2221+ let slope_mul_x_diff = septic_ext_mul ( builder, & slope, & x_diff) ;
2222+ let y = septic_ext_sub ( builder, & slope_mul_x_diff, & left. y ) ;
22132223
2214- builder. assign ( & left. x , x) ;
2215- builder. assign ( & left. y , y) ;
2216- builder. assign ( & left. is_infinity , Usize :: from ( 0 ) ) ;
2217- } ,
2218- ) ;
2219- } ) ;
2220- } ) ;
2224+ builder. assign ( & left. x , x) ;
2225+ builder. assign ( & left. y , y) ;
2226+ builder. assign ( & left. is_infinity , Usize :: from ( 0 ) ) ;
2227+ } ,
2228+ ) ;
2229+ } ) ;
2230+ } ,
2231+ ) ;
22212232}
0 commit comments