From 0f6fb4ebbc1380cc4609c6397a7a18b8153037ef Mon Sep 17 00:00:00 2001 From: Ignacio Hagopian Date: Fri, 30 May 2025 14:18:09 -0300 Subject: [PATCH] zkvm-interface: add execution duration Signed-off-by: Ignacio Hagopian --- crates/ere-openvm/src/lib.rs | 17 ++++++++++------- crates/ere-pico/src/lib.rs | 10 ++++++++-- crates/ere-risczero/src/lib.rs | 6 +++++- crates/ere-sp1/src/lib.rs | 25 +++++++++++-------------- crates/ere-zisk/src/lib.rs | 9 +++++++-- crates/zkvm-interface/src/reports.rs | 4 +++- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/crates/ere-openvm/src/lib.rs b/crates/ere-openvm/src/lib.rs index 6a84845..e2d0bf7 100644 --- a/crates/ere-openvm/src/lib.rs +++ b/crates/ere-openvm/src/lib.rs @@ -1,3 +1,5 @@ +use std::time::Instant; + use openvm_build::GuestOptions; use openvm_circuit::arch::ContinuationVmProof; use openvm_sdk::{ @@ -12,8 +14,8 @@ use openvm_stark_sdk::config::{ }; use openvm_transpiler::elf::Elf; use zkvm_interface::{ - Compiler, Input, InputItem, ProgramExecutionReport, ProgramProvingReport, - ProverResourceType, zkVM, zkVMError, + Compiler, Input, InputItem, ProgramExecutionReport, ProgramProvingReport, ProverResourceType, + zkVM, zkVMError, }; mod error; @@ -57,10 +59,7 @@ impl EreOpenVM { } } impl zkVM for EreOpenVM { - fn execute( - &self, - inputs: &Input, - ) -> Result { + fn execute(&self, inputs: &Input) -> Result { let sdk = Sdk::new(); let vm_cfg = SdkVmConfig::builder() .system(Default::default()) @@ -82,12 +81,16 @@ impl zkVM for EreOpenVM { } } + let start = Instant::now(); let _outputs = sdk .execute(exe.clone(), vm_cfg.clone(), stdin) .map_err(|e| CompileError::Client(e.into())) .map_err(OpenVMError::from)?; - Ok(ProgramExecutionReport::default()) + Ok(ProgramExecutionReport { + execution_duration: start.elapsed(), + ..Default::default() + }) } fn prove( diff --git a/crates/ere-pico/src/lib.rs b/crates/ere-pico/src/lib.rs index 9e5508a..dc43d82 100644 --- a/crates/ere-pico/src/lib.rs +++ b/crates/ere-pico/src/lib.rs @@ -1,5 +1,5 @@ use pico_sdk::client::DefaultProverClient; -use std::process::Command; +use std::{process::Command, time::Instant}; use zkvm_interface::{ Compiler, Input, InputItem, ProgramExecutionReport, ProgramProvingReport, ProverResourceType, zkVM, zkVMError, @@ -75,9 +75,15 @@ impl zkVM for ErePico { InputItem::Bytes(items) => stdin.write_slice(items), } } + + let start = Instant::now(); let num_cycles = client.emulate(stdin); - Ok(ProgramExecutionReport::new(num_cycles)) + Ok(ProgramExecutionReport { + total_num_cycles: num_cycles, + execution_duration: start.elapsed(), + ..Default::default() + }) } fn prove( diff --git a/crates/ere-risczero/src/lib.rs b/crates/ere-risczero/src/lib.rs index 35c162a..b6e69e1 100644 --- a/crates/ere-risczero/src/lib.rs +++ b/crates/ere-risczero/src/lib.rs @@ -1,3 +1,5 @@ +use std::time::Instant; + use compile::compile_risczero_program; use risc0_zkvm::{ExecutorEnv, Receipt, default_executor, default_prover}; use zkvm_interface::{ @@ -69,12 +71,14 @@ impl zkVM for EreRisc0 { } let env = env.build().map_err(|err| zkVMError::Other(err.into()))?; + let start = Instant::now(); let session_info = executor .execute(env, &self.program.elf) .map_err(|err| zkVMError::Other(err.into()))?; Ok(ProgramExecutionReport { total_num_cycles: session_info.cycles() as u64, - region_cycles: Default::default(), + execution_duration: start.elapsed(), + ..Default::default() }) } diff --git a/crates/ere-sp1/src/lib.rs b/crates/ere-sp1/src/lib.rs index d337995..6752ca9 100644 --- a/crates/ere-sp1/src/lib.rs +++ b/crates/ere-sp1/src/lib.rs @@ -1,5 +1,7 @@ #![cfg_attr(not(test), warn(unused_crate_dependencies))] +use std::time::Instant; + use compile::compile_sp1_program; use sp1_sdk::{ CpuProver, CudaProver, Prover, ProverClient, SP1ProofWithPublicValues, SP1ProvingKey, SP1Stdin, @@ -7,8 +9,8 @@ use sp1_sdk::{ }; use tracing::info; use zkvm_interface::{ - Compiler, Input, InputItem, ProgramExecutionReport, ProgramProvingReport, - ProverResourceType, zkVM, zkVMError, + Compiler, Input, InputItem, ProgramExecutionReport, ProgramProvingReport, ProverResourceType, + zkVM, zkVMError, }; mod compile; @@ -114,10 +116,7 @@ impl EreSP1 { } impl zkVM for EreSP1 { - fn execute( - &self, - inputs: &Input, - ) -> Result { + fn execute(&self, inputs: &Input) -> Result { let mut stdin = SP1Stdin::new(); for input in inputs.iter() { match input { @@ -126,15 +125,13 @@ impl zkVM for EreSP1 { } } + let start = Instant::now(); let (_, exec_report) = self.client.execute(&self.program, &stdin)?; - let total_num_cycles = exec_report.total_instruction_count(); - let region_cycles: indexmap::IndexMap<_, _> = - exec_report.cycle_tracker.into_iter().collect(); - - let mut ere_report = ProgramExecutionReport::new(total_num_cycles); - ere_report.region_cycles = region_cycles; - - Ok(ere_report) + Ok(ProgramExecutionReport { + total_num_cycles: exec_report.total_instruction_count(), + region_cycles: exec_report.cycle_tracker.into_iter().collect(), + execution_duration: start.elapsed(), + }) } fn prove( diff --git a/crates/ere-zisk/src/lib.rs b/crates/ere-zisk/src/lib.rs index 759e27f..e6d8e60 100644 --- a/crates/ere-zisk/src/lib.rs +++ b/crates/ere-zisk/src/lib.rs @@ -8,7 +8,7 @@ use std::{ io::Write, path::{Path, PathBuf}, process::{Command, Stdio}, - time, + time::{self, Instant}, }; use tempfile::tempdir; use zkvm_interface::{ @@ -88,6 +88,7 @@ impl zkVM for EreZisk { .into()); } + let start = Instant::now(); let total_num_cycles = String::from_utf8_lossy(&output.stdout) .split_once("total steps = ") .and_then(|(_, stats)| { @@ -98,7 +99,11 @@ impl zkVM for EreZisk { }) .ok_or(ZiskError::Execute(ExecuteError::TotalStepsNotFound))?; - Ok(ProgramExecutionReport::new(total_num_cycles)) + Ok(ProgramExecutionReport { + total_num_cycles, + execution_duration: start.elapsed(), + ..Default::default() + }) } fn prove(&self, input: &Input) -> Result<(Vec, ProgramProvingReport), zkVMError> { diff --git a/crates/zkvm-interface/src/reports.rs b/crates/zkvm-interface/src/reports.rs index f8c0d5c..3903b0f 100644 --- a/crates/zkvm-interface/src/reports.rs +++ b/crates/zkvm-interface/src/reports.rs @@ -10,13 +10,15 @@ pub struct ProgramExecutionReport { pub total_num_cycles: u64, /// Region-specific cycles, mapping region names (e.g., "setup", "compute") to their cycle counts. pub region_cycles: IndexMap, + /// Execution duration. + pub execution_duration: Duration, } impl ProgramExecutionReport { pub fn new(total_num_cycles: u64) -> Self { ProgramExecutionReport { total_num_cycles, - region_cycles: Default::default(), + ..Default::default() } } pub fn insert_region(&mut self, region_name: String, num_cycles: u64) {