Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(vm): Prepare new VM for use in API server and fix divergences #2994

Merged
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ zk_evm_1_4_1 = { package = "zk_evm", version = "0.141" }
zk_evm_1_5_0 = { package = "zk_evm", version = "=0.150.5" }

# New VM; pinned to a specific commit because of instability
zksync_vm2 = { git = "https://github.com/matter-labs/vm2.git", rev = "74577d9be13b1bff9d1a712389731f669b179e47" }
zksync_vm2 = { git = "https://github.com/matter-labs/vm2.git", rev = "a233d44bbe61dc6a758a754c3b78fe4f83e56699" }

# Consensus dependencies.
zksync_concurrency = "=0.3.0"
Expand Down
36 changes: 19 additions & 17 deletions core/lib/multivm/src/versions/vm_1_3_2/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,25 @@ pub struct Vm<S: WriteStorage, H: HistoryMode> {
pub(crate) system_env: SystemEnv,
}

impl<S: WriteStorage, H: HistoryMode> Vm<S, H> {
pub(crate) fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
VmMemoryMetrics {
event_sink_inner: self.vm.state.event_sink.get_size(),
event_sink_history: self.vm.state.event_sink.get_history_size(),
memory_inner: self.vm.state.memory.get_size(),
memory_history: self.vm.state.memory.get_history_size(),
decommittment_processor_inner: self.vm.state.decommittment_processor.get_size(),
decommittment_processor_history: self
.vm
.state
.decommittment_processor
.get_history_size(),
storage_inner: self.vm.state.storage.get_size(),
storage_history: self.vm.state.storage.get_history_size(),
}
}
}

impl<S: WriteStorage, H: HistoryMode> VmInterface for Vm<S, H> {
type TracerDispatcher = TracerDispatcher;

Expand Down Expand Up @@ -160,23 +179,6 @@ impl<S: WriteStorage, H: HistoryMode> VmInterface for Vm<S, H> {
}
}

fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
VmMemoryMetrics {
event_sink_inner: self.vm.state.event_sink.get_size(),
event_sink_history: self.vm.state.event_sink.get_history_size(),
memory_inner: self.vm.state.memory.get_size(),
memory_history: self.vm.state.memory.get_history_size(),
decommittment_processor_inner: self.vm.state.decommittment_processor.get_size(),
decommittment_processor_history: self
.vm
.state
.decommittment_processor
.get_history_size(),
storage_inner: self.vm.state.storage.get_size(),
storage_history: self.vm.state.storage.get_history_size(),
}
}

fn finish_batch(&mut self) -> FinishedL1Batch {
self.vm
.execute_till_block_end(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ pub(super) fn assemble_tx_meta(execution_mode: TxExecutionMode, execute_tx: bool
// Set 0 byte (execution mode)
output[0] = match execution_mode {
TxExecutionMode::VerifyExecute => 0x00,
TxExecutionMode::EstimateFee { .. } => 0x00,
TxExecutionMode::EthCall { .. } => 0x02,
TxExecutionMode::EstimateFee => 0x00,
TxExecutionMode::EthCall => 0x02,
};

// Set 31 byte (marker for tx execution)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ impl<S: WriteStorage, H: HistoryMode> Vm<S, H> {
}

/// Returns the info about all oracles' sizes.
pub(crate) fn record_vm_memory_metrics_inner(&self) -> VmMemoryMetrics {
pub(crate) fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
VmMemoryMetrics {
event_sink_inner: self.state.event_sink.get_size(),
event_sink_history: self.state.event_sink.get_history_size(),
Expand Down
5 changes: 0 additions & 5 deletions core/lib/multivm/src/versions/vm_1_4_1/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ use crate::{
BytecodeCompressionError, BytecodeCompressionResult, CurrentExecutionState,
FinishedL1Batch, L1BatchEnv, L2BlockEnv, SystemEnv, VmExecutionMode,
VmExecutionResultAndLogs, VmFactory, VmInterface, VmInterfaceHistoryEnabled,
VmMemoryMetrics,
},
utils::events::extract_l2tol1logs_from_l1_messenger,
vm_1_4_1::{
Expand Down Expand Up @@ -124,10 +123,6 @@ impl<S: WriteStorage, H: HistoryMode> VmInterface for Vm<S, H> {
}
}

fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
self.record_vm_memory_metrics_inner()
}

fn finish_batch(&mut self) -> FinishedL1Batch {
let result = self.inspect(&mut TracerDispatcher::default(), VmExecutionMode::Batch);
let execution_state = self.get_current_execution_state();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ pub(super) fn assemble_tx_meta(execution_mode: TxExecutionMode, execute_tx: bool
// Set 0 byte (execution mode)
output[0] = match execution_mode {
TxExecutionMode::VerifyExecute => 0x00,
TxExecutionMode::EstimateFee { .. } => 0x00,
TxExecutionMode::EthCall { .. } => 0x02,
TxExecutionMode::EstimateFee => 0x00,
TxExecutionMode::EthCall => 0x02,
};

// Set 31 byte (marker for tx execution)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ impl<S: WriteStorage, H: HistoryMode> Vm<S, H> {
}

/// Returns the info about all oracles' sizes.
pub(crate) fn record_vm_memory_metrics_inner(&self) -> VmMemoryMetrics {
pub(crate) fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
VmMemoryMetrics {
event_sink_inner: self.state.event_sink.get_size(),
event_sink_history: self.state.event_sink.get_history_size(),
Expand Down
5 changes: 0 additions & 5 deletions core/lib/multivm/src/versions/vm_1_4_2/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ use crate::{
BytecodeCompressionError, BytecodeCompressionResult, CurrentExecutionState,
FinishedL1Batch, L1BatchEnv, L2BlockEnv, SystemEnv, VmExecutionMode,
VmExecutionResultAndLogs, VmFactory, VmInterface, VmInterfaceHistoryEnabled,
VmMemoryMetrics,
},
utils::events::extract_l2tol1logs_from_l1_messenger,
vm_1_4_2::{
Expand Down Expand Up @@ -126,10 +125,6 @@ impl<S: WriteStorage, H: HistoryMode> VmInterface for Vm<S, H> {
}
}

fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
self.record_vm_memory_metrics_inner()
}

fn finish_batch(&mut self) -> FinishedL1Batch {
let result = self.inspect(&mut TracerDispatcher::default(), VmExecutionMode::Batch);
let execution_state = self.get_current_execution_state();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ pub(super) fn assemble_tx_meta(execution_mode: TxExecutionMode, execute_tx: bool
// Set 0 byte (execution mode)
output[0] = match execution_mode {
TxExecutionMode::VerifyExecute => 0x00,
TxExecutionMode::EstimateFee { .. } => 0x00,
TxExecutionMode::EthCall { .. } => 0x02,
TxExecutionMode::EstimateFee => 0x00,
TxExecutionMode::EthCall => 0x02,
};

// Set 31 byte (marker for tx execution)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ impl<S: WriteStorage, H: HistoryMode> Vm<S, H> {
}

/// Returns the info about all oracles' sizes.
pub(crate) fn record_vm_memory_metrics_inner(&self) -> VmMemoryMetrics {
pub(crate) fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
VmMemoryMetrics {
event_sink_inner: self.state.event_sink.get_size(),
event_sink_history: self.state.event_sink.get_history_size(),
Expand Down
5 changes: 0 additions & 5 deletions core/lib/multivm/src/versions/vm_boojum_integration/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ use crate::{
BytecodeCompressionError, BytecodeCompressionResult, CurrentExecutionState,
FinishedL1Batch, L1BatchEnv, L2BlockEnv, SystemEnv, VmExecutionMode,
VmExecutionResultAndLogs, VmFactory, VmInterface, VmInterfaceHistoryEnabled,
VmMemoryMetrics,
},
utils::events::extract_l2tol1logs_from_l1_messenger,
vm_boojum_integration::{
Expand Down Expand Up @@ -125,10 +124,6 @@ impl<S: WriteStorage, H: HistoryMode> VmInterface for Vm<S, H> {
}
}

fn record_vm_memory_metrics(&self) -> VmMemoryMetrics {
self.record_vm_memory_metrics_inner()
}

fn finish_batch(&mut self) -> FinishedL1Batch {
let result = self.inspect(&mut TracerDispatcher::default(), VmExecutionMode::Batch);
let execution_state = self.get_current_execution_state();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,8 @@ pub(super) fn assemble_tx_meta(execution_mode: TxExecutionMode, execute_tx: bool
// Set 0 byte (execution mode)
output[0] = match execution_mode {
TxExecutionMode::VerifyExecute => 0x00,
TxExecutionMode::EstimateFee { .. } => 0x00,
TxExecutionMode::EthCall { .. } => 0x02,
TxExecutionMode::EstimateFee => 0x00,
TxExecutionMode::EthCall => 0x02,
};

// Set 31 byte (marker for tx execution)
Expand Down
36 changes: 34 additions & 2 deletions core/lib/multivm/src/versions/vm_fast/tests/rollbacks.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use assert_matches::assert_matches;
use ethabi::Token;
use zksync_contracts::{get_loadnext_contract, test_contracts::LoadnextContractExecutionParams};
use zksync_types::{Execute, U256};
use zksync_types::{Address, Execute, U256};
use zksync_vm_interface::VmInterfaceExt;

use crate::{
interface::TxExecutionMode,
interface::{ExecutionResult, TxExecutionMode},
versions::testonly::ContractToDeploy,
vm_fast::tests::{
tester::{DeployContractsTx, TransactionTestInfo, TxModifier, TxType, VmTesterBuilder},
utils::read_test_contract,
Expand Down Expand Up @@ -142,3 +145,32 @@ fn test_vm_loadnext_rollbacks() {

assert_eq!(result_without_rollbacks, result_with_rollbacks);
}

#[test]
fn rollback_in_call_mode() {
let counter_bytecode = read_test_contract();
let counter_address = Address::repeat_byte(1);

let mut vm = VmTesterBuilder::new()
.with_empty_in_memory_storage()
.with_execution_mode(TxExecutionMode::EthCall)
.with_custom_contracts(vec![ContractToDeploy::new(
counter_bytecode,
counter_address,
)])
.with_random_rich_accounts(1)
.build();
let account = &mut vm.rich_accounts[0];
let tx = account.get_test_contract_transaction(counter_address, true, None, false, TxType::L2);

let (compression_result, vm_result) = vm
.vm
.execute_transaction_with_bytecode_compression(tx, true);
compression_result.unwrap();
assert_matches!(
vm_result.result,
ExecutionResult::Revert { output }
if output.to_string().contains("This method always reverts")
);
assert_eq!(vm_result.logs.storage_logs, []);
}
Loading
Loading