@@ -8,7 +8,7 @@ use ff_ext::{Instrumented, PoseidonField};
88use super :: { ZKVMChipProof , ZKVMProof } ;
99use crate :: {
1010 error:: ZKVMError ,
11- instructions:: riscv:: constants:: { INIT_PC_IDX , SHARD_ID_IDX } ,
11+ instructions:: riscv:: constants:: { END_PC_IDX , INIT_CYCLE_IDX , INIT_PC_IDX , SHARD_ID_IDX } ,
1212 scheme:: constants:: NUM_FANIN ,
1313 structs:: { ComposedConstrainSystem , PointAndEval , TowerProofs , VerifyingKey , ZKVMVerifyingKey } ,
1414} ;
@@ -84,13 +84,13 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
8484 let _logup_sum = E :: ZERO ;
8585 assert ! ( !vm_proofs. is_empty( ) ) ;
8686 let num_proofs = vm_proofs. len ( ) ;
87- vm_proofs
87+ let _end_pc = vm_proofs
8888 . into_iter ( )
8989 . zip_eq ( transcripts)
9090 // optionally halt on last chunk
9191 . zip_eq ( iter:: repeat_n ( false , num_proofs - 1 ) . chain ( iter:: once ( expect_halt) ) )
9292 . enumerate ( )
93- . try_for_each ( | ( shard_id, ( ( vm_proof, transcript) , expect_halt) ) | {
93+ . try_fold ( None , |prev_pc , ( shard_id, ( ( vm_proof, transcript) , expect_halt) ) | {
9494 // require ecall/halt proof to exist, depend on whether we expect a halt.
9595 let has_halt = vm_proof. has_halt ( & self . vk ) ;
9696 if has_halt != expect_halt {
@@ -101,12 +101,19 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
101101 . into ( ) ,
102102 ) ) ;
103103 }
104- // TODO check init ts = 4
105- // TODO check init_pc match prev end_pc
104+ // check init cycle = 4
105+ assert_eq ! ( vm_proof. pi_evals[ INIT_CYCLE_IDX ] , E :: from_canonical_usize( 4 ) ) ;
106+ // check init_pc match prev end_pc
107+ if let Some ( prev_pc) = prev_pc {
108+ assert_eq ! ( vm_proof. pi_evals[ INIT_PC_IDX ] , prev_pc) ;
109+ } else {
110+ // first chunk, check program entry
111+ assert_eq ! ( vm_proof. pi_evals[ INIT_PC_IDX ] , E :: from_canonical_u32( self . vk. entry_pc) ) ;
112+ }
113+ let end_pc = vm_proof. pi_evals [ END_PC_IDX ] ;
106114 // TODO add to global ec
107115 let _shard_ram_bus = self . verify_proof_validity ( shard_id, vm_proof, transcript) ?;
108-
109- Ok ( ( ) )
116+ Ok ( Some ( end_pc) )
110117 } ) ?;
111118 // TODO check global ec_sum == 0
112119 Ok ( true )
0 commit comments