diff --git a/core/lib/multivm/src/glue/tracers/mod.rs b/core/lib/multivm/src/glue/tracers/mod.rs index 7aa792ef1f7..6bae150dec5 100644 --- a/core/lib/multivm/src/glue/tracers/mod.rs +++ b/core/lib/multivm/src/glue/tracers/mod.rs @@ -30,7 +30,7 @@ //! - Add this trait as a trait bound for `T` in `MultiVMTracer` implementation. //! - Implement the trait for `T` with a bound to `VmTracer` for a specific version. -use zksync_state::WriteStorage; +use zksync_state::{ImmutableStorageView, WriteStorage}; use crate::{tracers::old_tracers::OldTracers, HistoryMode}; @@ -44,6 +44,7 @@ pub trait MultiVMTracer: + IntoVm1_4_1IntegrationTracer + IntoVm1_4_2IntegrationTracer + IntoOldVmTracer + + IntoEraVmTracer { fn into_tracer_pointer(self) -> MultiVmTracerPointer where @@ -57,6 +58,10 @@ pub trait IntoLatestTracer { fn latest(&self) -> crate::vm_latest::TracerPointer; } +pub trait IntoEraVmTracer { + fn era_vm(&self) -> Box>; +} + pub trait IntoVmVirtualBlocksTracer { fn vm_virtual_blocks( &self, @@ -106,6 +111,17 @@ where } } +impl IntoEraVmTracer for T +where + S: WriteStorage, + H: HistoryMode, + T: crate::era_vm::tracers::traits::VmTracer + Clone + 'static, +{ + fn era_vm(&self) -> Box> { + Box::new(self.clone()) + } +} + impl IntoVmVirtualBlocksTracer for T where S: WriteStorage, @@ -180,6 +196,7 @@ where + IntoVmBoojumIntegrationTracer + IntoVm1_4_1IntegrationTracer + IntoVm1_4_2IntegrationTracer - + IntoOldVmTracer, + + IntoOldVmTracer + + IntoEraVmTracer, { } diff --git a/core/lib/multivm/src/tracers/multivm_dispatcher.rs b/core/lib/multivm/src/tracers/multivm_dispatcher.rs index 5b0d36b5e79..53cdab4d473 100644 --- a/core/lib/multivm/src/tracers/multivm_dispatcher.rs +++ b/core/lib/multivm/src/tracers/multivm_dispatcher.rs @@ -1,6 +1,6 @@ -use zksync_state::WriteStorage; +use zksync_state::{ImmutableStorageView, StorageView, WriteStorage}; -use crate::{tracers::old_tracers, HistoryMode, MultiVmTracerPointer}; +use crate::{tracers::old_tracers, HistoryMode, MultiVMTracer, MultiVmTracerPointer}; /// Tracer dispatcher is a tracer that can dispatch calls to multiple tracers. pub struct TracerDispatcher { @@ -37,6 +37,14 @@ impl From> } } +impl From> + for crate::era_vm::tracers::dispatcher::TracerDispatcher +{ + fn from(value: TracerDispatcher) -> Self { + Self::new(value.tracers.into_iter().map(|x| x.era_vm()).collect()) + } +} + impl From> for crate::vm_boojum_integration::TracerDispatcher { diff --git a/core/lib/multivm/src/tracers/storage_invocation/era_vm/mod.rs b/core/lib/multivm/src/tracers/storage_invocation/era_vm/mod.rs new file mode 100644 index 00000000000..e15c53bc406 --- /dev/null +++ b/core/lib/multivm/src/tracers/storage_invocation/era_vm/mod.rs @@ -0,0 +1,22 @@ +use era_vm::{ + opcode::{RetOpcode, Variant}, + value::FatPointer, + Execution, Opcode, +}; +use zksync_state::ReadStorage; +use zksync_types::{ + vm_trace::{Call, CallType}, + zk_evm_types::FarCallOpcode, + CONTRACT_DEPLOYER_ADDRESS, U256, +}; + +use super::StorageInvocations; +use crate::{ + era_vm::tracers::traits::{Tracer, VmTracer}, + interface::VmRevertReason, +}; + +//TODO: Implement the Tracer trait for StorageInvocations +impl Tracer for StorageInvocations {} + +impl VmTracer for StorageInvocations {} diff --git a/core/lib/multivm/src/tracers/storage_invocation/mod.rs b/core/lib/multivm/src/tracers/storage_invocation/mod.rs index 8c9677ba8d7..49ca28e2f96 100644 --- a/core/lib/multivm/src/tracers/storage_invocation/mod.rs +++ b/core/lib/multivm/src/tracers/storage_invocation/mod.rs @@ -1,5 +1,6 @@ use crate::{glue::tracers::IntoOldVmTracer, tracers::old_tracers::OldTracers}; +pub mod era_vm; pub mod vm_1_4_1; pub mod vm_1_4_2; pub mod vm_boojum_integration; diff --git a/core/lib/multivm/src/tracers/validator/era_vm/mod.rs b/core/lib/multivm/src/tracers/validator/era_vm/mod.rs new file mode 100644 index 00000000000..806fb641ee4 --- /dev/null +++ b/core/lib/multivm/src/tracers/validator/era_vm/mod.rs @@ -0,0 +1,22 @@ +use era_vm::{ + opcode::{RetOpcode, Variant}, + value::FatPointer, + Execution, Opcode, +}; +use zksync_state::ReadStorage; +use zksync_types::{ + vm_trace::{Call, CallType}, + zk_evm_types::FarCallOpcode, + CONTRACT_DEPLOYER_ADDRESS, U256, +}; + +use super::ValidationTracer; +use crate::{ + era_vm::tracers::traits::{Tracer, VmTracer}, + interface::VmRevertReason, +}; + +//TODO: Implement the Tracer trait for ValidationTracer +impl Tracer for ValidationTracer {} + +impl VmTracer for ValidationTracer {} diff --git a/core/lib/multivm/src/tracers/validator/mod.rs b/core/lib/multivm/src/tracers/validator/mod.rs index 635915f9527..daf93c3fb8f 100644 --- a/core/lib/multivm/src/tracers/validator/mod.rs +++ b/core/lib/multivm/src/tracers/validator/mod.rs @@ -18,6 +18,7 @@ use crate::{ tracers::validator::types::{NewTrustedValidationItems, ValidationTracerMode}, }; +mod era_vm; mod types; mod vm_1_4_1; mod vm_1_4_2; diff --git a/core/lib/multivm/src/versions/era_vm/tracers/manager.rs b/core/lib/multivm/src/versions/era_vm/tracers/manager.rs index 5ffc6ea58bd..c08cc5d4b18 100644 --- a/core/lib/multivm/src/versions/era_vm/tracers/manager.rs +++ b/core/lib/multivm/src/versions/era_vm/tracers/manager.rs @@ -117,7 +117,7 @@ impl Tracer for VmTracerManager { } } -impl VmTracer for VmTracerManager { +impl VmTracer for VmTracerManager { fn before_bootloader_execution(&mut self, state: &mut Vm) { // Call the dispatcher to handle all the tracers added to it self.dispatcher.before_bootloader_execution(state); diff --git a/core/lib/multivm/src/versions/era_vm/tracers/pubdata_tracer.rs b/core/lib/multivm/src/versions/era_vm/tracers/pubdata_tracer.rs index ac1098256a5..f907dcfb16d 100644 --- a/core/lib/multivm/src/versions/era_vm/tracers/pubdata_tracer.rs +++ b/core/lib/multivm/src/versions/era_vm/tracers/pubdata_tracer.rs @@ -55,7 +55,7 @@ impl PubdataTracer { fn get_storage_diff(&mut self, vm: &mut Vm) -> Vec { vm.inner .state - .get_storage_changes() + .get_storage_changes(&mut vm.world) .iter() .filter_map(|(storage_key, initial_value, value)| { let address = storage_key.address; @@ -95,7 +95,7 @@ impl PubdataTracer { impl Tracer for PubdataTracer {} -impl VmTracer for PubdataTracer { +impl VmTracer for PubdataTracer { fn before_bootloader_execution(&mut self, vm: &mut super::traits::Vm) { self.pubdata_before_run = vm.inner.state.pubdata(); } diff --git a/core/lib/multivm/src/versions/era_vm/tracers/refunds_tracer.rs b/core/lib/multivm/src/versions/era_vm/tracers/refunds_tracer.rs index ee87e1ce7b9..c436b7342d4 100644 --- a/core/lib/multivm/src/versions/era_vm/tracers/refunds_tracer.rs +++ b/core/lib/multivm/src/versions/era_vm/tracers/refunds_tracer.rs @@ -40,7 +40,7 @@ impl Into for RefundsTracer { impl Tracer for RefundsTracer {} -impl VmTracer for RefundsTracer { +impl VmTracer for RefundsTracer { fn before_bootloader_execution(&mut self, vm: &mut super::traits::Vm) { self.pubdata_before = vm.inner.state.pubdata() as u32; } diff --git a/core/lib/multivm/src/versions/era_vm/vm.rs b/core/lib/multivm/src/versions/era_vm/vm.rs index f949eac952f..56283b71e7a 100644 --- a/core/lib/multivm/src/versions/era_vm/vm.rs +++ b/core/lib/multivm/src/versions/era_vm/vm.rs @@ -389,7 +389,7 @@ impl Vm { } } -impl Vm { +impl Vm { pub fn inspect_inner( &mut self, tracer: TracerDispatcher, @@ -502,7 +502,7 @@ impl Vm { } } -impl VmInterface for Vm { +impl VmInterface for Vm { type TracerDispatcher = TracerDispatcher; fn push_transaction(&mut self, tx: Transaction) { diff --git a/core/lib/multivm/src/vm_instance.rs b/core/lib/multivm/src/vm_instance.rs index b20f82f0d1e..8fb96be0126 100644 --- a/core/lib/multivm/src/vm_instance.rs +++ b/core/lib/multivm/src/vm_instance.rs @@ -1,3 +1,5 @@ +use std::{cell::RefCell, rc::Rc}; + use zksync_state::{ImmutableStorageView, ReadStorage, StoragePtr, StorageView}; use zksync_types::vm::{FastVmMode, VmVersion}; use zksync_utils::bytecode::CompressedBytecodeInfo; @@ -263,8 +265,8 @@ impl VmInstance { VmVersion::Vm1_5_0IncreasedBootloaderMemory => match mode { FastVmMode::Old => Self::new(l1_batch_env, system_env, storage_view), FastVmMode::New => { - // let storage = ImmutableStorageView::new(storage_view); - // Self::VmFast(crate::vm_fast::Vm::new(l1_batch_env, system_env, storage)) + //let storage = ImmutableStorageView::new(storage_view); + //Self::VmFast(crate::vm_fast::Vm::new(l1_batch_env, system_env, storage)) Self::LambdaVm(crate::era_vm::vm::Vm::new( l1_batch_env,