risc0_zkvm/host/client/prove/
local.rsuse anyhow::Result;
use super::{Executor, Prover, ProverOpts};
use crate::{
get_prover_server, host::server::session::NullSegmentRef, ExecutorEnv, ExecutorImpl, ProveInfo,
Receipt, SegmentInfo, SessionInfo, VerifierContext,
};
pub struct LocalProver {
name: String,
}
impl LocalProver {
pub fn new(name: &str) -> Self {
Self {
name: name.to_string(),
}
}
}
impl Prover for LocalProver {
fn prove_with_ctx(
&self,
env: ExecutorEnv<'_>,
ctx: &VerifierContext,
elf: &[u8],
opts: &ProverOpts,
) -> Result<ProveInfo> {
get_prover_server(opts)?.prove_with_ctx(env, ctx, elf)
}
fn get_name(&self) -> String {
self.name.clone()
}
fn compress(&self, opts: &ProverOpts, receipt: &Receipt) -> Result<Receipt> {
get_prover_server(opts)?.compress(opts, receipt)
}
}
impl Executor for LocalProver {
fn execute(&self, env: ExecutorEnv<'_>, elf: &[u8]) -> Result<SessionInfo> {
let mut exec = ExecutorImpl::from_elf(env, elf)?;
let mut segments = Vec::new();
let session = exec.run_with_callback(|segment| {
segments.push(SegmentInfo {
po2: segment.inner.po2 as u32,
cycles: segment.inner.insn_cycles as u32,
});
Ok(Box::new(NullSegmentRef))
})?;
let receipt_claim = session.claim()?;
Ok(SessionInfo {
segments,
journal: session.journal.unwrap_or_default(),
exit_code: session.exit_code,
receipt_claim: Some(receipt_claim),
})
}
}