@@ -4,7 +4,8 @@ use eyre::Result;
4
4
use openvm_build:: GuestOptions ;
5
5
use openvm_circuit:: {
6
6
arch:: {
7
- hasher:: poseidon2:: vm_poseidon2_hasher, ContinuationVmProof , ExecutionError ,
7
+ hasher:: poseidon2:: vm_poseidon2_hasher,
8
+ instructions:: program:: DEFAULT_MAX_NUM_PUBLIC_VALUES , ContinuationVmProof , ExecutionError ,
8
9
GenerationError , SingleSegmentVmExecutor , SystemConfig , VmConfig , VmExecutor ,
9
10
} ,
10
11
system:: { memory:: tree:: public_values:: UserPublicValuesProof , program:: trace:: VmCommittedExe } ,
@@ -27,9 +28,11 @@ use openvm_native_recursion::{
27
28
wrapper:: Halo2WrapperProvingKey ,
28
29
RawEvmProof ,
29
30
} ,
31
+ hints:: Hintable ,
30
32
types:: InnerConfig ,
31
33
vars:: StarkProofVariable ,
32
34
} ;
35
+ use openvm_rv32im_guest:: hint_load_by_key_encode;
33
36
use openvm_rv32im_transpiler:: {
34
37
Rv32ITranspilerExtension , Rv32IoTranspilerExtension , Rv32MTranspilerExtension ,
35
38
} ;
@@ -41,7 +44,9 @@ use openvm_sdk::{
41
44
types:: { EvmHalo2Verifier , EvmProof } ,
42
45
DefaultStaticVerifierPvHandler , Sdk , StdIn ,
43
46
} ;
44
- use openvm_stark_backend:: { keygen:: types:: LinearConstraint , p3_matrix:: Matrix } ;
47
+ use openvm_stark_backend:: {
48
+ keygen:: types:: LinearConstraint , p3_field:: PrimeField32 , p3_matrix:: Matrix ,
49
+ } ;
45
50
use openvm_stark_sdk:: {
46
51
config:: {
47
52
baby_bear_poseidon2:: { BabyBearPoseidon2Config , BabyBearPoseidon2Engine } ,
@@ -399,7 +404,7 @@ fn test_static_verifier_custom_pv_handler() {
399
404
#[ test]
400
405
fn test_e2e_proof_generation_and_verification_with_pvs ( ) {
401
406
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
402
- pkg_dir. push ( "guest" ) ;
407
+ pkg_dir. push ( "guest/fib " ) ;
403
408
404
409
let vm_config = SdkVmConfig :: builder ( )
405
410
. system ( SdkSystemConfig {
@@ -469,7 +474,7 @@ fn test_sdk_guest_build_and_transpile() {
469
474
// .with_options(vec!["--release"]);
470
475
;
471
476
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
472
- pkg_dir. push ( "guest" ) ;
477
+ pkg_dir. push ( "guest/fib " ) ;
473
478
let one = sdk
474
479
. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) )
475
480
. unwrap ( ) ;
@@ -490,7 +495,7 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> {
490
495
// generate a proof
491
496
let sdk = Sdk :: new ( ) ;
492
497
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
493
- pkg_dir. push ( "guest" ) ;
498
+ pkg_dir. push ( "guest/fib " ) ;
494
499
let elf = sdk. build ( Default :: default ( ) , pkg_dir, & Default :: default ( ) ) ?;
495
500
496
501
let vm_config = SdkVmConfig :: builder ( )
@@ -580,11 +585,109 @@ fn test_segmentation_retry() {
580
585
. sum ( ) ;
581
586
assert ! ( new_total_height < total_height) ;
582
587
}
583
-
584
588
#[ 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) ;
589
+ fn test_verify_openvm_stark_e2e ( ) -> Result < ( ) > {
590
+ const ASM_FILENAME : & str = "root_verifier.asm" ;
588
591
let sdk = Sdk :: new ( ) ;
589
- sdk. generate_root_verifier_asm ( & agg_pk) ;
592
+ let guest_opts = GuestOptions :: default ( ) ;
593
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
594
+ pkg_dir. push ( "guest/fib" ) ;
595
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
596
+
597
+ let vm_config = SdkVmConfig :: builder ( )
598
+ . system ( SdkSystemConfig {
599
+ config : SystemConfig :: default ( ) . with_continuations ( ) ,
600
+ } )
601
+ . rv32i ( Default :: default ( ) )
602
+ . rv32m ( Default :: default ( ) )
603
+ . io ( Default :: default ( ) )
604
+ . native ( Default :: default ( ) )
605
+ . build ( ) ;
606
+ assert ! ( vm_config. system. config. continuation_enabled) ;
607
+
608
+ let app_exe = sdk. transpile ( elf, vm_config. transpiler ( ) ) ?;
609
+ let fri_params = FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ;
610
+ let app_config = AppConfig :: new_with_leaf_fri_params ( fri_params, vm_config. clone ( ) , fri_params) ;
611
+
612
+ let app_pk = sdk. app_keygen ( app_config. clone ( ) ) ?;
613
+ let committed_app_exe = sdk. commit_app_exe ( fri_params, app_exe. clone ( ) ) ?;
614
+
615
+ let commits =
616
+ AppExecutionCommit :: compute ( & vm_config, & committed_app_exe, & app_pk. leaf_committed_exe ) ;
617
+
618
+ let agg_pk = AggStarkProvingKey :: keygen ( AggStarkConfig {
619
+ max_num_user_public_values : DEFAULT_MAX_NUM_PUBLIC_VALUES ,
620
+ leaf_fri_params : FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ,
621
+ internal_fri_params : FriParameters :: new_for_testing ( INTERNAL_LOG_BLOWUP ) ,
622
+ root_fri_params : FriParameters :: new_for_testing ( ROOT_LOG_BLOWUP ) ,
623
+ profiling : false ,
624
+ compiler_options : CompilerOptions {
625
+ enable_cycle_tracker : true ,
626
+ ..Default :: default ( )
627
+ } ,
628
+ root_max_constraint_degree : ( 1 << ROOT_LOG_BLOWUP ) + 1 ,
629
+ } ) ;
630
+ let asm = sdk. generate_root_verifier_asm ( & agg_pk) ;
631
+ let asm_path = format ! (
632
+ "{}/guest/verify_openvm_stark/{}" ,
633
+ env!( "CARGO_MANIFEST_DIR" ) ,
634
+ ASM_FILENAME
635
+ ) ;
636
+ std:: fs:: write ( asm_path, asm) ?;
637
+
638
+ let e2e_stark_proof = sdk. generate_e2e_stark_proof (
639
+ Arc :: new ( app_pk) ,
640
+ committed_app_exe,
641
+ agg_pk,
642
+ StdIn :: default ( ) ,
643
+ ) ?;
644
+
645
+ let verify_exe = {
646
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
647
+ pkg_dir. push ( "guest/verify_openvm_stark" ) ;
648
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
649
+ sdk. transpile ( elf, vm_config. transpiler ( ) ) ?
650
+ } ;
651
+
652
+ let pvs = [ 13u32 , 21 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
653
+
654
+ let exe_commit_u32: Vec < _ > = commits
655
+ . exe_commit
656
+ . iter ( )
657
+ . map ( |x| x. as_canonical_u32 ( ) )
658
+ . collect ( ) ;
659
+ let vm_commit_u32: Vec < _ > = commits
660
+ . leaf_vm_verifier_commit
661
+ . iter ( )
662
+ . map ( |x| x. as_canonical_u32 ( ) )
663
+ . collect ( ) ;
664
+ let pvs_u32: Vec < _ > = pvs
665
+ . iter ( )
666
+ . flat_map ( |x| x. to_le_bytes ( ) )
667
+ . map ( |x| x as u32 )
668
+ . collect ( ) ;
669
+
670
+ let key = ASM_FILENAME
671
+ . as_bytes ( )
672
+ . iter ( )
673
+ . cloned ( )
674
+ . chain ( exe_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
675
+ . chain ( vm_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
676
+ . chain ( pvs_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
677
+ . collect ( ) ;
678
+ let mut stdin = StdIn :: default ( ) ;
679
+ let to_encode: Vec < Vec < F > > = e2e_stark_proof. proof . write ( ) ;
680
+ let value = hint_load_by_key_encode ( & to_encode) ;
681
+ stdin. add_key_value ( key, value) ;
682
+
683
+ let exe_commit_u32_8: [ u32 ; 8 ] = exe_commit_u32. try_into ( ) . unwrap ( ) ;
684
+ let vm_commit_u32_8: [ u32 ; 8 ] = vm_commit_u32. try_into ( ) . unwrap ( ) ;
685
+
686
+ stdin. write ( & exe_commit_u32_8) ;
687
+ stdin. write ( & vm_commit_u32_8) ;
688
+ stdin. write ( & pvs_u32) ;
689
+
690
+ sdk. execute ( verify_exe, vm_config, stdin) ?;
691
+
692
+ Ok ( ( ) )
590
693
}
0 commit comments