11use crate :: { dcap:: dcap_ra, errors:: Error } ;
2+ use anyhow:: anyhow;
23use attestation_report:: { Risc0ZKVMProof , ZKDCAPQuote , ZKVMProof } ;
34use crypto:: Address ;
45use keymanager:: EnclaveKeyManager ;
56use lcp_types:: Time ;
67use log:: * ;
78use zkvm:: {
89 encode_seal,
9- prover:: { prove, Risc0ProverMode } ,
10- risc0_zkvm:: { compute_image_id, ExecutorEnv } ,
10+ prover:: { get_executor , prove, Risc0ProverMode } ,
11+ risc0_zkvm:: { compute_image_id, Executor , ExecutorEnv } ,
1112 verifier:: verify_groth16_proof,
1213} ;
1314
@@ -16,12 +17,13 @@ pub fn run_zkdcap_ra(
1617 target_enclave_key : Address ,
1718 prover_mode : Risc0ProverMode ,
1819 elf : & [ u8 ] ,
20+ disable_pre_execution : bool ,
1921) -> Result < ( ) , Error > {
20- let image_id = compute_image_id ( elf) . unwrap ( ) ;
22+ let image_id = compute_image_id ( elf)
23+ . map_err ( |e| Error :: anyhow ( anyhow ! ( "cannot compute image id: {}" , e) ) ) ?;
2124 info ! (
22- "Run zkDCAP verification with prover_mode={} image_id={}" ,
23- prover_mode,
24- hex:: encode( image_id. as_bytes( ) )
25+ "run zkDCAP verification with prover_mode={} image_id={} enclave_key={}" ,
26+ prover_mode, image_id, target_enclave_key
2527 ) ;
2628
2729 let current_time = Time :: now ( ) ;
@@ -34,31 +36,50 @@ pub fn run_zkdcap_ra(
3436 current_time
3537 ) ;
3638
37- let env = ExecutorEnv :: builder ( )
38- . write ( & (
39- res. raw_quote . clone ( ) ,
40- res. collateral . to_bytes ( ) ,
41- current_time. as_unix_timestamp_secs ( ) ,
42- ) )
43- . unwrap ( )
44- . build ( )
45- . unwrap ( ) ;
39+ if !disable_pre_execution {
40+ info ! ( "running pre-execution" ) ;
41+ let res = get_executor ( )
42+ . execute (
43+ build_env (
44+ & res. raw_quote ,
45+ & res. collateral . to_bytes ( ) ,
46+ current_time. as_unix_timestamp_secs ( ) ,
47+ ) ?,
48+ elf,
49+ )
50+ . map_err ( |e| Error :: anyhow ( anyhow ! ( "pre-execution failed: {}" , e) ) ) ?;
51+ info ! (
52+ "pre-execution done: exit_code={:?} cycles={} " ,
53+ res. exit_code,
54+ res. cycles( )
55+ ) ;
56+ }
4657
4758 info ! ( "proving with prover mode: {:?}" , prover_mode) ;
48- let prover_info = prove ( & prover_mode, env, elf) . unwrap ( ) ;
59+ let prover_info = prove (
60+ & prover_mode,
61+ build_env (
62+ & res. raw_quote ,
63+ & res. collateral . to_bytes ( ) ,
64+ current_time. as_unix_timestamp_secs ( ) ,
65+ ) ?,
66+ elf,
67+ ) ?;
4968 info ! ( "proving done: stats: {:?}" , prover_info. stats) ;
5069
51- prover_info. receipt . verify ( image_id) . unwrap ( ) ;
70+ prover_info
71+ . receipt
72+ . verify ( image_id)
73+ . map_err ( |e| Error :: anyhow ( anyhow ! ( "receipt verification failed: {}" , e. to_string( ) ) ) ) ?;
5274 info ! ( "receipt verified" ) ;
5375
54- let seal = encode_seal ( & prover_info. receipt ) . unwrap ( ) ;
76+ let seal = encode_seal ( & prover_info. receipt ) ? ;
5577 if let zkvm:: risc0_zkvm:: InnerReceipt :: Groth16 ( _) = prover_info. receipt . inner {
5678 verify_groth16_proof (
5779 seal. clone ( ) ,
5880 image_id,
5981 prover_info. receipt . journal . bytes . clone ( ) ,
60- )
61- . unwrap ( ) ;
82+ ) ?;
6283 } else {
6384 assert ! (
6485 prover_mode. is_dev_mode( ) ,
@@ -90,3 +111,18 @@ pub fn run_zkdcap_ra(
90111
91112 Ok ( ( ) )
92113}
114+
115+ fn build_env < ' a > (
116+ quote : & [ u8 ] ,
117+ collateral : & [ u8 ] ,
118+ current_time : u64 ,
119+ ) -> Result < ExecutorEnv < ' a > , Error > {
120+ ExecutorEnv :: builder ( )
121+ . write ( & ( quote, collateral, current_time) )
122+ . map_err ( |e| Error :: anyhow ( anyhow ! ( "cannot build env: {}" , e) ) )
123+ . and_then ( |builder| {
124+ builder
125+ . build ( )
126+ . map_err ( |e| Error :: anyhow ( anyhow ! ( "cannot build env: {}" , e) ) )
127+ } )
128+ }
0 commit comments