1
- use std:: { fs:: read, marker:: PhantomData , path:: Path , sync:: Arc } ;
1
+ use std:: { borrow :: Borrow , fs:: read, marker:: PhantomData , path:: Path , sync:: Arc } ;
2
2
3
3
#[ cfg( feature = "evm-verify" ) ]
4
4
use alloy_sol_types:: sol;
@@ -11,16 +11,19 @@ use openvm_build::{
11
11
} ;
12
12
use openvm_circuit:: {
13
13
arch:: {
14
- hasher:: poseidon2:: vm_poseidon2_hasher, instructions:: exe:: VmExe , verify_segments,
15
- ContinuationVmProof , ExecutionError , InitFileGenerator , VerifiedExecutionPayload , VmConfig ,
16
- VmExecutor , VmVerificationError ,
14
+ hasher:: { poseidon2:: vm_poseidon2_hasher, Hasher } ,
15
+ instructions:: exe:: VmExe ,
16
+ verify_segments, ContinuationVmProof , ExecutionError , InitFileGenerator ,
17
+ VerifiedExecutionPayload , VmConfig , VmExecutor , PROGRAM_CACHED_TRACE_INDEX ,
18
+ PUBLIC_VALUES_AIR_ID ,
17
19
} ,
18
20
system:: {
19
21
memory:: { tree:: public_values:: extract_public_values, CHUNK } ,
20
- program:: trace:: VmCommittedExe ,
22
+ program:: trace:: { compute_exe_commit , VmCommittedExe } ,
21
23
} ,
22
24
} ;
23
25
use openvm_continuations:: verifier:: {
26
+ common:: types:: VmVerifierPvs ,
24
27
internal:: types:: VmStarkProof ,
25
28
root:: { types:: RootVmVerifierInput , RootVmVerifierConfig } ,
26
29
} ;
@@ -33,7 +36,7 @@ use openvm_stark_backend::proof::Proof;
33
36
use openvm_stark_sdk:: {
34
37
config:: { baby_bear_poseidon2:: BabyBearPoseidon2Engine , FriParameters } ,
35
38
engine:: StarkFriEngine ,
36
- openvm_stark_backend:: { verifier :: VerificationError , Chip } ,
39
+ openvm_stark_backend:: Chip ,
37
40
} ;
38
41
use openvm_transpiler:: {
39
42
elf:: Elf ,
@@ -228,7 +231,7 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
228
231
& self ,
229
232
app_vk : & AppVerifyingKey ,
230
233
proof : & ContinuationVmProof < SC > ,
231
- ) -> Result < VerifiedContinuationVmPayload , VmVerificationError > {
234
+ ) -> Result < VerifiedContinuationVmPayload > {
232
235
let engine = E :: new ( app_vk. fri_params ) ;
233
236
let VerifiedExecutionPayload {
234
237
exe_commit,
@@ -250,9 +253,10 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
250
253
& self ,
251
254
app_vk : & AppVerifyingKey ,
252
255
proof : & Proof < SC > ,
253
- ) -> Result < ( ) , VerificationError > {
256
+ ) -> Result < ( ) > {
254
257
let e = E :: new ( app_vk. fri_params ) ;
255
- e. verify ( & app_vk. app_vm_vk , proof)
258
+ e. verify ( & app_vk. app_vm_vk , proof) ?;
259
+ Ok ( ( ) )
256
260
}
257
261
258
262
pub fn agg_keygen (
@@ -322,6 +326,51 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
322
326
Ok ( proof)
323
327
}
324
328
329
+ pub fn verify_e2e_stark_proof (
330
+ & self ,
331
+ agg_stark_pk : AggStarkProvingKey ,
332
+ proof : & VmStarkProof < SC > ,
333
+ ) -> Result < [ F ; CHUNK ] > {
334
+ let program_commit =
335
+ proof. proof . commitments . main_trace [ PROGRAM_CACHED_TRACE_INDEX ] . as_ref ( ) ;
336
+ let internal_commit: & [ _ ; CHUNK ] = & agg_stark_pk
337
+ . internal_committed_exe
338
+ . get_program_commit ( )
339
+ . into ( ) ;
340
+
341
+ let vm_pk = if program_commit == internal_commit {
342
+ & agg_stark_pk. internal_vm_pk
343
+ } else {
344
+ & agg_stark_pk. leaf_vm_pk
345
+ } ;
346
+ let e = E :: new ( vm_pk. fri_params ) ;
347
+ e. verify ( & vm_pk. vm_pk . get_vk ( ) , & proof. proof ) ?;
348
+
349
+ let public_values_air_proof_data = proof
350
+ . proof
351
+ . per_air
352
+ . iter ( )
353
+ . find ( |p| p. air_id == PUBLIC_VALUES_AIR_ID )
354
+ . unwrap ( ) ;
355
+ let pvs: & VmVerifierPvs < _ > =
356
+ public_values_air_proof_data. public_values [ ..VmVerifierPvs :: < u8 > :: width ( ) ] . borrow ( ) ;
357
+
358
+ let hasher = vm_poseidon2_hasher ( ) ;
359
+ let public_values_root = hasher. merkle_root ( & proof. user_public_values ) ;
360
+ if public_values_root != pvs. public_values_commit {
361
+ return Err ( eyre:: eyre!(
362
+ "Invalid public values root: expected {:?}, got {:?}" ,
363
+ pvs. public_values_commit,
364
+ public_values_root
365
+ ) ) ;
366
+ }
367
+
368
+ let start_pc = pvs. connector . initial_pc ;
369
+ let initial_memory_root = & pvs. memory . initial_root ;
370
+ let exe_commit = compute_exe_commit ( & hasher, program_commit, initial_memory_root, start_pc) ;
371
+ Ok ( exe_commit)
372
+ }
373
+
325
374
#[ cfg( feature = "evm-prove" ) ]
326
375
pub fn generate_evm_proof < VC : VmConfig < F > > (
327
376
& self ,
0 commit comments