@@ -5,7 +5,9 @@ use crate::{
55 exts_to_felts,
66 } ,
77 tower_verifier:: binding:: IOPProverMessageVecVariable ,
8- transcript:: transcript_observe_label,
8+ transcript:: {
9+ transcript_label_as_array, transcript_observe_label, transcript_observe_label_felts,
10+ } ,
911 zkvm_verifier:: binding:: TowerProofInputVariable ,
1012} ;
1113use openvm_native_compiler:: prelude:: * ;
@@ -22,51 +24,78 @@ pub fn iop_verifier_state_verify<C: Config>(
2224 out_claim : & Ext < C :: F , C :: EF > ,
2325 prover_messages : & IOPProverMessageVecVariable < C > ,
2426 max_num_variables : Felt < C :: F > ,
25- max_degree : Felt < C :: F > ,
27+ max_degree : usize ,
2628 unipoly_extrapolator : & UniPolyExtrapolator < C > ,
2729) -> (
2830 Array < C , Ext < <C as Config >:: F , <C as Config >:: EF > > ,
2931 Ext < <C as Config >:: F , <C as Config >:: EF > ,
3032) {
31- // TODO: either store it in a global cache or pass them as parameters
32- let zero: Ext < C :: F , C :: EF > = builder. constant ( C :: EF :: ZERO ) ;
3333 let zero_f: Felt < C :: F > = builder. constant ( C :: F :: ZERO ) ;
3434
35+ let max_degree_felt: Felt < C :: F > = builder. constant ( C :: F :: from_canonical_usize ( max_degree) ) ;
3536 let max_num_variables_usize: Usize < C :: N > =
3637 Usize :: from ( builder. cast_felt_to_var ( max_num_variables) ) ;
3738 challenger. observe ( builder, max_num_variables) ;
3839 challenger. observe ( builder, zero_f) ;
39- challenger. observe ( builder, max_degree ) ;
40+ challenger. observe ( builder, max_degree_felt ) ;
4041 challenger. observe ( builder, zero_f) ;
4142
4243 builder. assert_var_eq ( max_num_variables_usize. get_var ( ) , prover_messages. len ( ) ) ;
4344
4445 let challenges: Array < C , Ext < C :: F , C :: EF > > = builder. dyn_array ( max_num_variables_usize. clone ( ) ) ;
45- let expected: Ext < C :: F , C :: EF > = builder. eval ( * out_claim + zero) ;
46+ let expected: Ext < C :: F , C :: EF > = builder. eval ( * out_claim) ;
47+ let internal_round_label = transcript_label_as_array ( builder, b"Internal round" ) ;
4648
4749 builder. cycle_tracker_start ( "IOPVerifierState::verify_round_and_update_state" ) ;
50+ let curr_offset: Var < C :: N > = builder. eval ( C :: N :: ZERO ) ;
4851 builder
4952 . range ( 0 , max_num_variables_usize. clone ( ) )
5053 . for_each ( |i_vec, builder| {
5154 let i = i_vec[ 0 ] ;
5255
53- // TODO: this takes 7 cycles, can we optimize it?
54- let prover_msg = prover_messages. get ( builder, i. variable ( ) ) ;
56+ let next_offset: Var < C :: N > =
57+ builder. eval ( curr_offset + prover_messages. prover_message_size ) ;
58+ let prover_msg = prover_messages
59+ . evaluations
60+ . slice ( builder, curr_offset, next_offset) ;
61+ builder. assign ( & curr_offset, next_offset) ;
5562
5663 unsafe {
5764 let prover_msg_felts = exts_to_felts ( builder, & prover_msg) ;
5865 challenger_multi_observe ( builder, challenger, & prover_msg_felts) ;
5966 }
6067
61- transcript_observe_label ( builder, challenger, b"Internal round" ) ;
68+ transcript_observe_label_felts ( builder, challenger, & internal_round_label ) ;
6269 let challenge = challenger. sample_ext ( builder) ;
6370
6471 let e1 = builder. get ( & prover_msg, 0 ) ;
6572 let e0 = builder. eval ( expected - e1) ;
66- let p_r =
67- unipoly_extrapolator. extrapolate_uni_poly ( builder, e0, & prover_msg, challenge) ;
68-
69- builder. assign ( & expected, p_r + zero) ;
73+ let p_r = match max_degree {
74+ 1 => unipoly_extrapolator. extrapolate_uni_poly_deg1 ( builder, e0, e1, challenge) ,
75+ 2 => {
76+ let p1 = e1;
77+ let p2 = builder. get ( & prover_msg, 1 ) ;
78+ unipoly_extrapolator. extrapolate_uni_poly_deg2 ( builder, e0, p1, p2, challenge)
79+ }
80+ 3 => {
81+ let p1 = e1;
82+ let p2 = builder. get ( & prover_msg, 1 ) ;
83+ let p3 = builder. get ( & prover_msg, 2 ) ;
84+ unipoly_extrapolator
85+ . extrapolate_uni_poly_deg3 ( builder, e0, p1, p2, p3, challenge)
86+ }
87+ 4 => {
88+ let p1 = e1;
89+ let p2 = builder. get ( & prover_msg, 1 ) ;
90+ let p3 = builder. get ( & prover_msg, 2 ) ;
91+ let p4 = builder. get ( & prover_msg, 3 ) ;
92+ unipoly_extrapolator
93+ . extrapolate_uni_poly_deg4 ( builder, e0, p1, p2, p3, p4, challenge)
94+ }
95+ _ => panic ! ( "unsupported max_degree {max_degree}" ) ,
96+ } ;
97+
98+ builder. assign ( & expected, p_r) ;
7099 builder. set_value ( & challenges, i, challenge) ;
71100 } ) ;
72101 builder. cycle_tracker_end ( "IOPVerifierState::verify_round_and_update_state" ) ;
@@ -258,16 +287,14 @@ pub fn verify_tower_proof<C: Config>(
258287 let max_num_variables: Felt < C :: F > = builder. constant ( C :: F :: ONE ) ;
259288 builder. assign ( & max_num_variables, max_num_variables + round) ;
260289
261- let max_degree = builder. constant ( C :: F :: from_canonical_usize ( 3 ) ) ;
262-
263290 builder. cycle_tracker_start ( "sumcheck verify" ) ;
264291 let ( sub_rt, sub_e) = iop_verifier_state_verify (
265292 builder,
266293 challenger,
267294 out_claim,
268295 & prover_messages,
269296 max_num_variables,
270- max_degree ,
297+ 3 ,
271298 unipoly_extrapolator,
272299 ) ;
273300 builder. cycle_tracker_end ( "sumcheck verify" ) ;
0 commit comments