@@ -1759,8 +1759,10 @@ pub fn run_e2e_with_checkpoint<
17591759 & init_full_mem,
17601760 ) ;
17611761
1762- if target_shard_id. is_some ( ) {
1763- // skip verify as the proof are in-completed
1762+ let can_verify_target_shard = target_shard_id. is_none ( ) || zkvm_proofs. len ( ) == 1 ;
1763+ if !can_verify_target_shard {
1764+ // Partial multi-shard subsets still skip verification because the
1765+ // continuation chain between omitted shards is unavailable.
17641766 return E2ECheckpointResult {
17651767 proofs : Some ( zkvm_proofs) ,
17661768 vk : Some ( vk) ,
@@ -1775,13 +1777,25 @@ pub fn run_e2e_with_checkpoint<
17751777 proofs : Some ( zkvm_proofs. clone ( ) ) ,
17761778 vk : Some ( vk) ,
17771779 next_step : Some ( Box :: new ( move || {
1778- run_e2e_verify ( & verifier, zkvm_proofs, exit_code, max_steps)
1780+ run_e2e_verify (
1781+ & verifier,
1782+ zkvm_proofs,
1783+ exit_code,
1784+ max_steps,
1785+ target_shard_id,
1786+ )
17791787 } ) ) ,
17801788 } ;
17811789 }
17821790
17831791 let start = std:: time:: Instant :: now ( ) ;
1784- run_e2e_verify ( & verifier, zkvm_proofs. clone ( ) , exit_code, max_steps) ;
1792+ run_e2e_verify (
1793+ & verifier,
1794+ zkvm_proofs. clone ( ) ,
1795+ exit_code,
1796+ max_steps,
1797+ target_shard_id,
1798+ ) ;
17851799 tracing:: debug!( "verified in {:?}" , start. elapsed( ) ) ;
17861800
17871801 E2ECheckpointResult {
@@ -2023,15 +2037,29 @@ pub fn run_e2e_verify<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>>(
20232037 zkvm_proofs : Vec < ZKVMProof < E , PCS > > ,
20242038 exit_code : Option < u32 > ,
20252039 max_steps : usize ,
2040+ target_shard_id : Option < usize > ,
20262041) {
20272042 let transcripts = ( 0 ..zkvm_proofs. len ( ) )
20282043 . map ( |_| Transcript :: new ( b"riscv" ) )
20292044 . collect_vec ( ) ;
2030- assert ! (
2045+ let expect_halt = zkvm_proofs
2046+ . last ( )
2047+ . map ( |proof| proof. has_halt ( & verifier. vk ) )
2048+ . unwrap_or ( exit_code. is_some ( ) ) ;
2049+ let verified = if target_shard_id. is_some ( ) && zkvm_proofs. len ( ) == 1 {
20312050 verifier
2032- . verify_proofs_halt( zkvm_proofs, transcripts, exit_code. is_some( ) )
2033- . expect( "verify proof return with error" ) ,
2034- ) ;
2051+ . verify_shard_proof_halt (
2052+ zkvm_proofs. into_iter ( ) . next ( ) . unwrap ( ) ,
2053+ transcripts. into_iter ( ) . next ( ) . unwrap ( ) ,
2054+ expect_halt,
2055+ )
2056+ . expect ( "verify proof return with error" )
2057+ } else {
2058+ verifier
2059+ . verify_proofs_halt ( zkvm_proofs, transcripts, expect_halt)
2060+ . expect ( "verify proof return with error" )
2061+ } ;
2062+ assert ! ( verified) ;
20352063 match exit_code {
20362064 Some ( 0 ) => tracing:: info!( "exit code 0. Success." ) ,
20372065 Some ( code) => tracing:: error!( "exit code {}. Failure." , code) ,
@@ -2099,11 +2127,19 @@ pub fn verify<E: ExtensionField, PCS: PolynomialCommitmentScheme<E> + serde::Ser
20992127 {
21002128 Instrumented :: < <<E as ExtensionField >:: BaseField as PoseidonField >:: P > :: clear_metrics ( ) ;
21012129 }
2102- let transcripts = ( 0 ..zkvm_proofs. len ( ) )
2103- . map ( |_| Transcript :: new ( b"riscv" ) )
2104- . collect_vec ( ) ;
21052130 let has_halt = zkvm_proofs. last ( ) . unwrap ( ) . has_halt ( & verifier. vk ) ;
2106- verifier. verify_proofs_halt ( zkvm_proofs, transcripts, has_halt) ?;
2131+ if zkvm_proofs. len ( ) == 1 {
2132+ verifier. verify_shard_proof_halt (
2133+ zkvm_proofs. into_iter ( ) . next ( ) . unwrap ( ) ,
2134+ Transcript :: new ( b"riscv" ) ,
2135+ has_halt,
2136+ ) ?;
2137+ } else {
2138+ let transcripts = ( 0 ..zkvm_proofs. len ( ) )
2139+ . map ( |_| Transcript :: new ( b"riscv" ) )
2140+ . collect_vec ( ) ;
2141+ verifier. verify_proofs_halt ( zkvm_proofs, transcripts, has_halt) ?;
2142+ }
21072143 // print verification statistics such as hash count
21082144 #[ cfg( debug_assertions) ]
21092145 {
0 commit comments