@@ -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 } ,
@@ -393,7 +398,7 @@ fn test_static_verifier_custom_pv_handler() {
393
398
#[ test]
394
399
fn test_e2e_proof_generation_and_verification_with_pvs ( ) {
395
400
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
396
- pkg_dir. push ( "guest" ) ;
401
+ pkg_dir. push ( "guest/fib " ) ;
397
402
398
403
let vm_config = SdkVmConfig :: builder ( )
399
404
. system ( SdkSystemConfig {
@@ -463,7 +468,7 @@ fn test_sdk_guest_build_and_transpile() {
463
468
// .with_options(vec!["--release"]);
464
469
;
465
470
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
466
- pkg_dir. push ( "guest" ) ;
471
+ pkg_dir. push ( "guest/fib " ) ;
467
472
let one = sdk
468
473
. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) )
469
474
. unwrap ( ) ;
@@ -484,7 +489,7 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> {
484
489
// generate a proof
485
490
let sdk = Sdk :: new ( ) ;
486
491
let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
487
- pkg_dir. push ( "guest" ) ;
492
+ pkg_dir. push ( "guest/fib " ) ;
488
493
let elf = sdk. build ( Default :: default ( ) , pkg_dir, & Default :: default ( ) ) ?;
489
494
490
495
let vm_config = SdkVmConfig :: builder ( )
@@ -574,11 +579,109 @@ fn test_segmentation_retry() {
574
579
. sum ( ) ;
575
580
assert ! ( new_total_height < total_height) ;
576
581
}
577
-
578
582
#[ test]
579
- fn test_root_verifier_asm_generate ( ) {
580
- let agg_stark_config = agg_stark_config_for_test ( ) ;
581
- let agg_pk = AggStarkProvingKey :: keygen ( agg_stark_config) ;
583
+ fn test_verify_openvm_stark_e2e ( ) -> Result < ( ) > {
584
+ const ASM_FILENAME : & str = "root_verifier.asm" ;
582
585
let sdk = Sdk :: new ( ) ;
583
- sdk. generate_root_verifier_asm ( & agg_pk) ;
586
+ let guest_opts = GuestOptions :: default ( ) ;
587
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
588
+ pkg_dir. push ( "guest/fib" ) ;
589
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
590
+
591
+ let vm_config = SdkVmConfig :: builder ( )
592
+ . system ( SdkSystemConfig {
593
+ config : SystemConfig :: default ( ) . with_continuations ( ) ,
594
+ } )
595
+ . rv32i ( Default :: default ( ) )
596
+ . rv32m ( Default :: default ( ) )
597
+ . io ( Default :: default ( ) )
598
+ . native ( Default :: default ( ) )
599
+ . build ( ) ;
600
+ assert ! ( vm_config. system. config. continuation_enabled) ;
601
+
602
+ let app_exe = sdk. transpile ( elf, vm_config. transpiler ( ) ) ?;
603
+ let fri_params = FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ;
604
+ let app_config = AppConfig :: new_with_leaf_fri_params ( fri_params, vm_config. clone ( ) , fri_params) ;
605
+
606
+ let app_pk = sdk. app_keygen ( app_config. clone ( ) ) ?;
607
+ let committed_app_exe = sdk. commit_app_exe ( fri_params, app_exe. clone ( ) ) ?;
608
+
609
+ let commits =
610
+ AppExecutionCommit :: compute ( & vm_config, & committed_app_exe, & app_pk. leaf_committed_exe ) ;
611
+
612
+ let agg_pk = AggStarkProvingKey :: keygen ( AggStarkConfig {
613
+ max_num_user_public_values : DEFAULT_MAX_NUM_PUBLIC_VALUES ,
614
+ leaf_fri_params : FriParameters :: new_for_testing ( LEAF_LOG_BLOWUP ) ,
615
+ internal_fri_params : FriParameters :: new_for_testing ( INTERNAL_LOG_BLOWUP ) ,
616
+ root_fri_params : FriParameters :: new_for_testing ( ROOT_LOG_BLOWUP ) ,
617
+ profiling : false ,
618
+ compiler_options : CompilerOptions {
619
+ enable_cycle_tracker : true ,
620
+ ..Default :: default ( )
621
+ } ,
622
+ root_max_constraint_degree : ( 1 << ROOT_LOG_BLOWUP ) + 1 ,
623
+ } ) ;
624
+ let asm = sdk. generate_root_verifier_asm ( & agg_pk) ;
625
+ let asm_path = format ! (
626
+ "{}/guest/verify_openvm_stark/{}" ,
627
+ env!( "CARGO_MANIFEST_DIR" ) ,
628
+ ASM_FILENAME
629
+ ) ;
630
+ std:: fs:: write ( asm_path, asm) ?;
631
+
632
+ let e2e_stark_proof = sdk. generate_e2e_stark_proof (
633
+ Arc :: new ( app_pk) ,
634
+ committed_app_exe,
635
+ agg_pk,
636
+ StdIn :: default ( ) ,
637
+ ) ?;
638
+
639
+ let verify_exe = {
640
+ let mut pkg_dir = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) . to_path_buf ( ) ;
641
+ pkg_dir. push ( "guest/verify_openvm_stark" ) ;
642
+ let elf = sdk. build ( guest_opts. clone ( ) , & pkg_dir, & Default :: default ( ) ) ?;
643
+ sdk. transpile ( elf, vm_config. transpiler ( ) ) ?
644
+ } ;
645
+
646
+ let pvs = [ 13u32 , 21 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
647
+
648
+ let exe_commit_u32: Vec < _ > = commits
649
+ . exe_commit
650
+ . iter ( )
651
+ . map ( |x| x. as_canonical_u32 ( ) )
652
+ . collect ( ) ;
653
+ let vm_commit_u32: Vec < _ > = commits
654
+ . leaf_vm_verifier_commit
655
+ . iter ( )
656
+ . map ( |x| x. as_canonical_u32 ( ) )
657
+ . collect ( ) ;
658
+ let pvs_u32: Vec < _ > = pvs
659
+ . iter ( )
660
+ . flat_map ( |x| x. to_le_bytes ( ) )
661
+ . map ( |x| x as u32 )
662
+ . collect ( ) ;
663
+
664
+ let key = ASM_FILENAME
665
+ . as_bytes ( )
666
+ . iter ( )
667
+ . cloned ( )
668
+ . chain ( exe_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
669
+ . chain ( vm_commit_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
670
+ . chain ( pvs_u32. iter ( ) . flat_map ( |x| x. to_le_bytes ( ) ) )
671
+ . collect ( ) ;
672
+ let mut stdin = StdIn :: default ( ) ;
673
+ let to_encode: Vec < Vec < F > > = e2e_stark_proof. proof . write ( ) ;
674
+ let value = hint_load_by_key_encode ( & to_encode) ;
675
+ stdin. add_key_value ( key, value) ;
676
+
677
+ let exe_commit_u32_8: [ u32 ; 8 ] = exe_commit_u32. try_into ( ) . unwrap ( ) ;
678
+ let vm_commit_u32_8: [ u32 ; 8 ] = vm_commit_u32. try_into ( ) . unwrap ( ) ;
679
+
680
+ stdin. write ( & exe_commit_u32_8) ;
681
+ stdin. write ( & vm_commit_u32_8) ;
682
+ stdin. write ( & pvs_u32) ;
683
+
684
+ sdk. execute ( verify_exe, vm_config, stdin) ?;
685
+
686
+ Ok ( ( ) )
584
687
}
0 commit comments