1
- use std:: { borrow:: Borrow , path:: PathBuf , sync:: Arc } ;
1
+ use std:: { array , borrow:: Borrow , path:: PathBuf , sync:: Arc } ;
2
2
3
+ use alloy_sol_types:: private:: U256 ;
4
+ use cargo_openvm:: util:: read_config_toml_or_default;
3
5
use eyre:: Result ;
6
+ use itertools:: Itertools ;
4
7
use openvm_build:: GuestOptions ;
5
8
use openvm_circuit:: {
6
9
arch:: {
7
- hasher:: poseidon2:: vm_poseidon2_hasher, ContinuationVmProof , ExecutionError ,
10
+ hasher:: poseidon2:: vm_poseidon2_hasher,
11
+ instructions:: program:: DEFAULT_MAX_NUM_PUBLIC_VALUES , ContinuationVmProof , ExecutionError ,
8
12
GenerationError , SingleSegmentVmExecutor , SystemConfig , VmConfig , VmExecutor ,
9
13
} ,
10
14
system:: { memory:: tree:: public_values:: UserPublicValuesProof , program:: trace:: VmCommittedExe } ,
@@ -13,6 +17,7 @@ use openvm_continuations::{
13
17
static_verifier:: StaticVerifierPvHandler ,
14
18
verifier:: {
15
19
common:: types:: { SpecialAirIds , VmVerifierPvs } ,
20
+ internal:: types:: E2eStarkProof ,
16
21
leaf:: types:: { LeafVmVerifierInput , UserPublicValuesRootProof } ,
17
22
root:: types:: RootVmVerifierPvs ,
18
23
utils:: compress_babybear_var_to_bn254,
@@ -27,21 +32,28 @@ use openvm_native_recursion::{
27
32
wrapper:: Halo2WrapperProvingKey ,
28
33
RawEvmProof ,
29
34
} ,
35
+ hints:: Hintable ,
30
36
types:: InnerConfig ,
31
37
vars:: StarkProofVariable ,
32
38
} ;
39
+ use openvm_rv32im_guest:: hint_load_by_key_encode;
33
40
use openvm_rv32im_transpiler:: {
34
41
Rv32ITranspilerExtension , Rv32IoTranspilerExtension , Rv32MTranspilerExtension ,
35
42
} ;
36
43
use openvm_sdk:: {
37
44
codec:: { Decode , Encode } ,
38
45
commit:: AppExecutionCommit ,
39
46
config:: { AggConfig , AggStarkConfig , AppConfig , Halo2Config , SdkSystemConfig , SdkVmConfig } ,
47
+ fs:: { decode_from_file, read_exe_from_file} ,
40
48
keygen:: { AggStarkProvingKey , AppProvingKey } ,
41
49
types:: { EvmHalo2Verifier , EvmProof } ,
42
50
DefaultStaticVerifierPvHandler , Sdk , StdIn ,
43
51
} ;
44
- use openvm_stark_backend:: { keygen:: types:: LinearConstraint , p3_matrix:: Matrix } ;
52
+ use openvm_stark_backend:: {
53
+ keygen:: types:: LinearConstraint ,
54
+ p3_field:: { PrimeField32 , PrimeField64 } ,
55
+ p3_matrix:: Matrix ,
56
+ } ;
45
57
use openvm_stark_sdk:: {
46
58
config:: {
47
59
baby_bear_poseidon2:: { BabyBearPoseidon2Config , BabyBearPoseidon2Engine } ,
@@ -399,7 +411,7 @@ fn test_static_verifier_custom_pv_handler() {
399
411
#[ test]
400
412
fn test_e2e_proof_generation_and_verification_with_pvs ( ) {
401
413
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
402
- pkg_dir. push ( "guest" ) ;
414
+ pkg_dir. push ( "guest/fib " ) ;
403
415
404
416
let vm_config = SdkVmConfig :: builder ( )
405
417
. system ( SdkSystemConfig {
@@ -469,7 +481,7 @@ fn test_sdk_guest_build_and_transpile() {
469
481
// .with_options(vec!["--release"]);
470
482
;
471
483
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
472
- pkg_dir. push ( "guest" ) ;
484
+ pkg_dir. push ( "guest/fib " ) ;
473
485
let one = sdk
474
486
. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) )
475
487
. unwrap ( ) ;
@@ -490,7 +502,7 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> {
490
502
// generate a proof
491
503
let sdk = Sdk :: new ( ) ;
492
504
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
493
- pkg_dir. push ( "guest" ) ;
505
+ pkg_dir. push ( "guest/fib " ) ;
494
506
let elf = sdk. build ( Default :: default ( ) , pkg_dir, & Default :: default ( ) ) ?;
495
507
496
508
let vm_config = SdkVmConfig :: builder ( )
@@ -580,11 +592,109 @@ fn test_segmentation_retry() {
580
592
. sum ( ) ;
581
593
assert ! ( new_total_height < total_height) ;
582
594
}
583
-
584
595
#[ test]
585
- fn test_root_verifier_asm_generate ( ) {
586
- let agg_stark_config = agg_stark_config_for_test ( ) ;
587
- let agg_pk = AggStarkProvingKey :: keygen ( agg_stark_config) ;
596
+ fn test_verify_openvm_stark_e2e ( ) -> Result < ( ) > {
597
+ const ASM_FILENAME : & str = "root_verifier.asm" ;
588
598
let sdk = Sdk :: new ( ) ;
589
- sdk. generate_root_verifier_asm ( & agg_pk) ;
599
+ let guest_opts = GuestOptions :: default ( ) ;
600
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
601
+ pkg_dir. push ( "guest/fib" ) ;
602
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
603
+
604
+ let vm_config = SdkVmConfig :: builder ( )
605
+ . system ( SdkSystemConfig {
606
+ config : SystemConfig :: default ( ) . with_continuations ( ) ,
607
+ } )
608
+ . rv32i ( Default :: default ( ) )
609
+ . rv32m ( Default :: default ( ) )
610
+ . io ( Default :: default ( ) )
611
+ . native ( Default :: default ( ) )
612
+ . build ( ) ;
613
+ assert ! ( vm_config. system. config. continuation_enabled) ;
614
+
615
+ let app_exe = sdk. transpile ( elf, vm_config. transpiler ( ) ) ?;
616
+ let fri_params = FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ;
617
+ let app_config = AppConfig :: new_with_leaf_fri_params ( fri_params, vm_config. clone ( ) , fri_params) ;
618
+
619
+ let app_pk = sdk. app_keygen ( app_config. clone ( ) ) ?;
620
+ let committed_app_exe = sdk. commit_app_exe ( fri_params, app_exe. clone ( ) ) ?;
621
+
622
+ let commits =
623
+ AppExecutionCommit :: compute ( & vm_config, & committed_app_exe, & app_pk. leaf_committed_exe ) ;
624
+
625
+ let agg_pk = AggStarkProvingKey :: keygen ( AggStarkConfig {
626
+ max_num_user_public_values : DEFAULT_MAX_NUM_PUBLIC_VALUES ,
627
+ leaf_fri_params : FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ,
628
+ internal_fri_params : FriParameters :: new_for_testing ( INTERNAL_LOG_BLOWUP ) ,
629
+ root_fri_params : FriParameters :: new_for_testing ( ROOT_LOG_BLOWUP ) ,
630
+ profiling : false ,
631
+ compiler_options : CompilerOptions {
632
+ enable_cycle_tracker : true ,
633
+ ..Default :: default ( )
634
+ } ,
635
+ root_max_constraint_degree : ( 1 << ROOT_LOG_BLOWUP ) + 1 ,
636
+ } ) ;
637
+ let asm = sdk. generate_root_verifier_asm ( & agg_pk) ;
638
+ let asm_path = format ! (
639
+ "{}/guest/verify_openvm_stark/{}" ,
640
+ env!( "CARGO_MANIFEST_DIR" ) ,
641
+ ASM_FILENAME
642
+ ) ;
643
+ std:: fs:: write ( asm_path, asm) ?;
644
+
645
+ let e2e_stark_proof = sdk. generate_e2e_stark_proof (
646
+ Arc :: new ( app_pk) ,
647
+ committed_app_exe,
648
+ agg_pk,
649
+ StdIn :: default ( ) ,
650
+ ) ?;
651
+
652
+ let verify_exe = {
653
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
654
+ pkg_dir. push ( "guest/verify_openvm_stark" ) ;
655
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
656
+ sdk. transpile ( elf, vm_config. transpiler ( ) ) ?
657
+ } ;
658
+
659
+ let pvs = vec ! [ 13u32 , 21 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
660
+
661
+ let exe_commit_u32: Vec < _ > = commits
662
+ . exe_commit
663
+ . iter ( )
664
+ . map ( |x| x. as_canonical_u32 ( ) )
665
+ . collect ( ) ;
666
+ let vm_commit_u32: Vec < _ > = commits
667
+ . leaf_vm_verifier_commit
668
+ . iter ( )
669
+ . map ( |x| x. as_canonical_u32 ( ) )
670
+ . collect ( ) ;
671
+ let pvs_u32: Vec < _ > = pvs
672
+ . iter ( )
673
+ . flat_map ( |x| x. to_le_bytes ( ) )
674
+ . map ( |x| x as u32 )
675
+ . collect ( ) ;
676
+
677
+ let key = ASM_FILENAME
678
+ . as_bytes ( )
679
+ . iter ( )
680
+ . cloned ( )
681
+ . chain ( exe_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
682
+ . chain ( vm_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
683
+ . chain ( pvs_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
684
+ . collect ( ) ;
685
+ let mut stdin = StdIn :: default ( ) ;
686
+ let to_encode: Vec < Vec < F > > = e2e_stark_proof. proof . write ( ) ;
687
+ let value = hint_load_by_key_encode ( & to_encode) ;
688
+ stdin. add_key_value ( key, value) ;
689
+
690
+ let exe_commit_u32_8: [ u32 ; 8 ] = exe_commit_u32. try_into ( ) . unwrap ( ) ;
691
+ let vm_commit_u32_8: [ u32 ; 8 ] = vm_commit_u32. try_into ( ) . unwrap ( ) ;
692
+
693
+ stdin. write ( & exe_commit_u32_8) ;
694
+ stdin. write ( & vm_commit_u32_8) ;
695
+ stdin. write ( & pvs_u32) ;
696
+
697
+ sdk. execute ( verify_exe, vm_config, stdin) ?;
698
+
699
+ Ok ( ( ) )
590
700
}
0 commit comments