Skip to content

Commit dc72957

Browse files
committed
implement pre-execution before proving
Signed-off-by: Jun Kimura <jun.kimura@datachain.jp>
1 parent c344c79 commit dc72957

File tree

6 files changed

+80
-21
lines changed

6 files changed

+80
-21
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/commands/attestation.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ pub struct ZKDCAPRemoteAttestation {
265265
pub bonsai_api_url: Option<String>,
266266
#[clap(long = "bonsai_api_key", help = "Bonsai API key")]
267267
pub bonsai_api_key: Option<String>,
268+
#[clap(
269+
long = "disable_pre_execution",
270+
help = "Disable pre-execution before proving"
271+
)]
272+
pub disable_pre_execution: bool,
268273
}
269274

270275
impl ZKDCAPRemoteAttestation {
@@ -323,6 +328,7 @@ fn run_zkdcap_remote_attestation<E: EnclaveCommandAPI<S>, S: CommitStore>(
323328
Address::from_hex_string(&cmd.enclave_key)?,
324329
mode,
325330
cmd.get_zkvm_program()?.as_ref(),
331+
cmd.disable_pre_execution,
326332
)?;
327333
Ok(())
328334
}

modules/remote-attestation/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ reqwest = { version = "0.12.9", default-features = false, features = [
2424
"hickory-dns",
2525
] }
2626
urlencoding = { version = "2" }
27+
anyhow = { version = "1" }
2728

2829
dcap-quote-verifier = { git = "https://github.com/datachainlab/zkdcap", rev = "ff53632f49d2d8b00c9bcc456aeeeb139bacca9f" }
2930

modules/remote-attestation/src/errors.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ define_error! {
196196
DcapQuoteVerifier
197197
[TraceError<dcap_quote_verifier::Error>]
198198
|_| { "DCAP quote verifier error" },
199+
200+
Anyhow
201+
[TraceError<anyhow::Error>]
202+
|_| { "Anyhow error" },
199203
}
200204
}
201205

@@ -216,3 +220,9 @@ impl From<reqwest::Error> for Error {
216220
Error::reqwest(e)
217221
}
218222
}
223+
224+
impl From<zkvm::Error> for Error {
225+
fn from(e: zkvm::Error) -> Self {
226+
Error::zkvm(e)
227+
}
228+
}

modules/remote-attestation/src/zkdcap.rs

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use crate::{dcap::dcap_ra, errors::Error};
2+
use anyhow::anyhow;
23
use attestation_report::{Risc0ZKVMProof, ZKDCAPQuote, ZKVMProof};
34
use crypto::Address;
45
use keymanager::EnclaveKeyManager;
56
use lcp_types::Time;
67
use log::*;
78
use 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+
}

modules/zkvm/src/prover.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::Error;
22
use risc0_zkvm::{
3-
BonsaiProver, ExecutorEnv, LocalProver, ProveInfo, Prover, ProverOpts, VerifierContext,
3+
BonsaiProver, Executor, ExecutorEnv, LocalProver, ProveInfo, Prover, ProverOpts,
4+
VerifierContext,
45
};
56
use std::fmt::Display;
67

@@ -112,3 +113,7 @@ impl BonsaiProverOptions {
112113
.ok_or_else(Error::missing_bonsai_api_key)
113114
}
114115
}
116+
117+
pub fn get_executor() -> impl Executor {
118+
LocalProver::new("local")
119+
}

0 commit comments

Comments
 (0)