diff --git a/crates/blockifier/build.rs b/crates/blockifier/build.rs index 552782168d4..7efa3c640a8 100644 --- a/crates/blockifier/build.rs +++ b/crates/blockifier/build.rs @@ -24,6 +24,7 @@ fn compile_cairo_native_aot_runtime() { "--release", "-p", "cairo-native-runtime", + "--features=with-trace-dump", "--message-format=json", "--target-dir", runtime_target_dir.to_str().unwrap(), diff --git a/crates/blockifier/src/execution/native/executor.rs b/crates/blockifier/src/execution/native/executor.rs index a642d065d03..d4c5e2dc477 100644 --- a/crates/blockifier/src/execution/native/executor.rs +++ b/crates/blockifier/src/execution/native/executor.rs @@ -2,10 +2,11 @@ use std::collections::HashMap; use std::fs::{self, File}; use std::path::PathBuf; use std::sync::atomic::AtomicU64; -use std::sync::Mutex; +use std::sync::{Arc, Mutex}; use cairo_lang_sierra::program::Program; use cairo_lang_sierra::program_registry::ProgramRegistry; +use cairo_lang_starknet_classes::contract_class::ContractEntryPoints; use cairo_native::execution_result::ContractExecutionResult; use cairo_native::executor::AotContractExecutor; use cairo_native::runtime::trace_dump::TraceDump; @@ -21,8 +22,7 @@ use super::syscall_handler::NativeSyscallHandler; #[derive(Debug)] pub enum ContractExecutor { Aot(AotContractExecutor), - // must use mutex, as emu executor has state, therefore it must me mutable. - Emu(Mutex), + Emu((Arc, ContractEntryPoints)), // must use a differnt variant as we need `Program` for trace feature AotTrace((AotContractExecutor, Program)), } @@ -32,9 +32,9 @@ impl From for ContractExecutor { Self::Aot(value) } } -impl From for ContractExecutor { - fn from(value: VirtualMachine) -> Self { - Self::Emu(Mutex::new(value)) +impl From<(Arc, ContractEntryPoints)> for ContractExecutor { + fn from(value: (Arc, ContractEntryPoints)) -> Self { + Self::Emu(value) } } impl From<(AotContractExecutor, Program)> for ContractExecutor { @@ -56,17 +56,18 @@ impl ContractExecutor { ContractExecutor::Aot(aot_contract_executor) => { aot_contract_executor.run(selector, args, gas, builtin_costs, syscall_handler) } - ContractExecutor::Emu(virtual_machine) => { - let mut virtual_machine = virtual_machine.lock().unwrap(); + ContractExecutor::Emu((program, entrypoints)) => { + let mut virtual_machine = + VirtualMachine::new_starknet(program.to_owned(), entrypoints); let args = args.to_owned(); virtual_machine.call_contract(selector, gas, args); - let trace = virtual_machine.run_with_trace(&mut syscall_handler); - static COUNTER: AtomicU64 = AtomicU64::new(0); let counter = COUNTER.fetch_add(1, std::sync::atomic::Ordering::Relaxed); + let trace = virtual_machine.run_with_trace(&mut syscall_handler); + let trace_path = PathBuf::from(format!("traces/emu/{counter}.json")); let trace_parent_path = trace_path.parent().unwrap(); fs::create_dir_all(trace_parent_path).unwrap();