Skip to content

Commit cbee99d

Browse files
popzxczksync-admin-bot2Artemka374
authored
feat: Support stable compiler for VM (and some other crates) (#3248)
tbd --------- Co-authored-by: zksync-admin-bot2 <[email protected]> Co-authored-by: Lech <[email protected]>
1 parent af149a0 commit cbee99d

File tree

60 files changed

+359
-684
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+359
-684
lines changed

Cargo.lock

Lines changed: 48 additions & 190 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -228,19 +228,16 @@ tokio-stream = "0.1.16"
228228
# We *always* pin the latest version of protocol to disallow accidental changes in the execution logic.
229229
# However, for the historical version of protocol crates, we have lax requirements. Otherwise,
230230
# Bumping a crypto dependency like `boojum` would require us to republish all the historical packages.
231-
circuit_sequencer_api_1_3_3 = { package = "circuit_sequencer_api", version = "0.133" }
232-
circuit_sequencer_api_1_4_0 = { package = "circuit_sequencer_api", version = "0.140" }
233-
circuit_sequencer_api_1_4_1 = { package = "circuit_sequencer_api", version = "0.141" }
234-
circuit_sequencer_api_1_4_2 = { package = "circuit_sequencer_api", version = "0.142" }
235-
circuit_sequencer_api_1_5_0 = { package = "circuit_sequencer_api", version = "=0.150.7" }
236-
crypto_codegen = { package = "zksync_solidity_vk_codegen", version = "=0.30.1" }
237-
kzg = { package = "zksync_kzg", version = "=0.150.7" }
231+
circuit_encodings = { package = "circuit_encodings", version = "=0.150.18" }
232+
circuit_sequencer_api = { package = "circuit_sequencer_api", version = "=0.150.18" }
233+
crypto_codegen = { package = "zksync_solidity_vk_codegen", version = "=0.30.11" }
234+
kzg = { package = "zksync_kzg", version = "=0.150.18" }
238235
zk_evm = { version = "=0.133.0" }
239236
zk_evm_1_3_1 = { package = "zk_evm", version = "0.131.0-rc.2" }
240237
zk_evm_1_3_3 = { package = "zk_evm", version = "0.133" }
241238
zk_evm_1_4_0 = { package = "zk_evm", version = "0.140" }
242239
zk_evm_1_4_1 = { package = "zk_evm", version = "0.141" }
243-
zk_evm_1_5_0 = { package = "zk_evm", version = "=0.150.7" }
240+
zk_evm_1_5_0 = { package = "zk_evm", version = "=0.150.18" }
244241

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

core/lib/multivm/Cargo.toml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@ zk_evm_1_3_3.workspace = true
1818
zk_evm_1_3_1.workspace = true
1919
zksync_vm2.workspace = true
2020

21-
circuit_sequencer_api_1_3_3.workspace = true
22-
circuit_sequencer_api_1_4_0.workspace = true
23-
circuit_sequencer_api_1_4_1.workspace = true
24-
circuit_sequencer_api_1_4_2.workspace = true
25-
circuit_sequencer_api_1_5_0.workspace = true
21+
circuit_sequencer_api.workspace = true
2622

2723
zksync_types.workspace = true
2824
zksync_contracts.workspace = true

core/lib/multivm/src/glue/types/vm/vm_block_result.rs

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use std::collections::HashMap;
22

3-
use circuit_sequencer_api_1_3_3::sort_storage_access::sort_storage_access_queries as sort_storage_access_queries_1_3_3;
4-
use itertools::Itertools;
5-
use zk_evm_1_3_1::aux_structures::LogQuery as LogQuery_1_3_1;
3+
use circuit_sequencer_api::sort_storage_access::sort_storage_access_queries;
64
use zksync_types::l2_to_l1_log::UserL2ToL1Log;
75

86
use crate::{
@@ -11,6 +9,7 @@ use crate::{
119
CurrentExecutionState, ExecutionResult, Refunds, VmExecutionLogs, VmExecutionResultAndLogs,
1210
VmExecutionStatistics,
1311
},
12+
utils::glue_log_query,
1413
};
1514

1615
// Note: In version after vm `VmVirtualBlocks` the bootloader memory knowledge is encapsulated into the VM.
@@ -21,18 +20,12 @@ use crate::{
2120
impl GlueFrom<crate::vm_m5::vm_instance::VmBlockResult> for crate::interface::FinishedL1Batch {
2221
fn glue_from(value: crate::vm_m5::vm_instance::VmBlockResult) -> Self {
2322
let storage_log_queries = value.full_result.storage_log_queries.clone();
24-
let deduplicated_storage_logs: Vec<LogQuery_1_3_1> = sort_storage_access_queries_1_3_3(
25-
&storage_log_queries
23+
let deduplicated_storage_logs = sort_storage_access_queries(
24+
storage_log_queries
2625
.iter()
27-
.map(|log| {
28-
GlueInto::<zk_evm_1_3_3::aux_structures::LogQuery>::glue_into(log.log_query)
29-
})
30-
.collect_vec(),
26+
.map(|log| glue_log_query(log.log_query)),
3127
)
32-
.1
33-
.into_iter()
34-
.map(GlueInto::<LogQuery_1_3_1>::glue_into)
35-
.collect();
28+
.1;
3629

3730
crate::interface::FinishedL1Batch {
3831
block_tip_execution_result: VmExecutionResultAndLogs {
@@ -78,18 +71,12 @@ impl GlueFrom<crate::vm_m5::vm_instance::VmBlockResult> for crate::interface::Fi
7871
impl GlueFrom<crate::vm_m6::vm_instance::VmBlockResult> for crate::interface::FinishedL1Batch {
7972
fn glue_from(value: crate::vm_m6::vm_instance::VmBlockResult) -> Self {
8073
let storage_log_queries = value.full_result.storage_log_queries.clone();
81-
let deduplicated_storage_logs: Vec<LogQuery_1_3_1> = sort_storage_access_queries_1_3_3(
82-
&storage_log_queries
74+
let deduplicated_storage_logs = sort_storage_access_queries(
75+
storage_log_queries
8376
.iter()
84-
.map(|log| {
85-
GlueInto::<zk_evm_1_3_3::aux_structures::LogQuery>::glue_into(log.log_query)
86-
})
87-
.collect_vec(),
77+
.map(|log| glue_log_query(log.log_query)),
8878
)
89-
.1
90-
.into_iter()
91-
.map(GlueInto::<LogQuery_1_3_1>::glue_into)
92-
.collect();
79+
.1;
9380

9481
crate::interface::FinishedL1Batch {
9582
block_tip_execution_result: VmExecutionResultAndLogs {
@@ -135,11 +122,12 @@ impl GlueFrom<crate::vm_m6::vm_instance::VmBlockResult> for crate::interface::Fi
135122
impl GlueFrom<crate::vm_1_3_2::vm_instance::VmBlockResult> for crate::interface::FinishedL1Batch {
136123
fn glue_from(value: crate::vm_1_3_2::vm_instance::VmBlockResult) -> Self {
137124
let storage_log_queries = value.full_result.storage_log_queries.clone();
138-
let deduplicated_storage_logs =
139-
circuit_sequencer_api_1_3_3::sort_storage_access::sort_storage_access_queries(
140-
storage_log_queries.iter().map(|log| &log.log_query),
141-
)
142-
.1;
125+
let deduplicated_storage_logs = sort_storage_access_queries(
126+
storage_log_queries
127+
.iter()
128+
.map(|log| glue_log_query(log.log_query)),
129+
)
130+
.1;
143131

144132
crate::interface::FinishedL1Batch {
145133
block_tip_execution_result: VmExecutionResultAndLogs {

core/lib/multivm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#![warn(unused_extern_crates)]
33
#![warn(unused_imports)]
44

5-
pub use circuit_sequencer_api_1_5_0 as circuit_sequencer_api_latest;
5+
pub use circuit_sequencer_api as circuit_sequencer_api_latest;
66
pub use zk_evm_1_5_0 as zk_evm_latest;
77
pub use zksync_types::vm::VmVersion;
88
pub use zksync_vm_interface as interface;

core/lib/multivm/src/utils/mod.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,27 @@ use zksync_types::{
55
};
66

77
pub use self::deduplicator::{ModifiedSlot, StorageWritesDeduplicator};
8-
use crate::interface::L1BatchEnv;
8+
use crate::{
9+
glue::{GlueFrom, GlueInto},
10+
interface::L1BatchEnv,
11+
};
912

1013
pub(crate) mod bytecode;
1114
mod deduplicator;
1215
pub(crate) mod events;
1316

17+
/// Allows to convert `LogQuery` between two different versions, even if they don't provide
18+
/// direct conversion between each other.
19+
/// It transforms the input query to the `LogQuery` from `zksync_types` (for which most of the
20+
/// `zk_evm` versions provide conversion) and then converts it to the target version.
21+
pub fn glue_log_query<L, R>(l: L) -> R
22+
where
23+
L: GlueInto<zksync_types::zk_evm_types::LogQuery>,
24+
R: GlueFrom<zksync_types::zk_evm_types::LogQuery>,
25+
{
26+
R::glue_from(l.glue_into())
27+
}
28+
1429
/// Calculates the base fee and gas per pubdata for the given L1 gas price.
1530
pub fn derive_base_fee_and_gas_per_pubdata(
1631
batch_fee_input: BatchFeeInput,

core/lib/multivm/src/versions/testonly/precompiles.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use circuit_sequencer_api_1_5_0::geometry_config::get_geometry_config;
1+
use circuit_sequencer_api::geometry_config::ProtocolGeometry;
22
use zksync_test_contracts::TestContract;
33
use zksync_types::{Address, Execute};
44

@@ -41,7 +41,9 @@ pub(crate) fn test_keccak<VM: TestedVm>() {
4141
assert!(!exec_result.result.is_failed(), "{exec_result:#?}");
4242

4343
let keccak_count = exec_result.statistics.circuit_statistic.keccak256
44-
* get_geometry_config().cycles_per_keccak256_circuit as f32;
44+
* ProtocolGeometry::V1_5_0
45+
.config()
46+
.cycles_per_keccak256_circuit as f32;
4547
assert!(keccak_count >= 1000.0, "{keccak_count}");
4648
}
4749

@@ -77,7 +79,7 @@ pub(crate) fn test_sha256<VM: TestedVm>() {
7779
assert!(!exec_result.result.is_failed(), "{exec_result:#?}");
7880

7981
let sha_count = exec_result.statistics.circuit_statistic.sha256
80-
* get_geometry_config().cycles_per_sha256_circuit as f32;
82+
* ProtocolGeometry::V1_5_0.config().cycles_per_sha256_circuit as f32;
8183
assert!(sha_count >= 1000.0, "{sha_count}");
8284
}
8385

@@ -106,6 +108,8 @@ pub(crate) fn test_ecrecover<VM: TestedVm>() {
106108
assert!(!exec_result.result.is_failed(), "{exec_result:#?}");
107109

108110
let ecrecover_count = exec_result.statistics.circuit_statistic.ecrecover
109-
* get_geometry_config().cycles_per_ecrecover_circuit as f32;
111+
* ProtocolGeometry::V1_5_0
112+
.config()
113+
.cycles_per_ecrecover_circuit as f32;
110114
assert!((ecrecover_count - 1.0).abs() < 1e-4, "{ecrecover_count}");
111115
}

core/lib/multivm/src/versions/vm_1_3_2/pubdata_utils.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::collections::HashMap;
22

3-
use circuit_sequencer_api_1_3_3::sort_storage_access::sort_storage_access_queries;
3+
use circuit_sequencer_api::sort_storage_access::sort_storage_access_queries;
44
use zk_evm_1_3_3::aux_structures::Timestamp;
55
use zksync_types::{StorageKey, PUBLISH_BYTECODE_OVERHEAD, SYSTEM_CONTEXT_ADDRESS};
66

77
use crate::{
88
interface::{storage::WriteStorage, VmEvent},
9-
utils::bytecode::bytecode_len_in_bytes,
9+
utils::{bytecode::bytecode_len_in_bytes, glue_log_query},
1010
vm_1_3_2::{history_recorder::HistoryMode, oracles::storage::storage_key_of_log, VmInstance},
1111
};
1212

@@ -71,16 +71,20 @@ impl<H: HistoryMode, S: WriteStorage> VmInstance<S, H> {
7171
.state
7272
.storage
7373
.storage_log_queries_after_timestamp(from_timestamp);
74-
let (_, deduplicated_logs) =
75-
sort_storage_access_queries(storage_logs.iter().map(|log| &log.log_query));
74+
let (_, deduplicated_logs) = sort_storage_access_queries(
75+
storage_logs.iter().map(|log| glue_log_query(log.log_query)),
76+
);
7677

7778
deduplicated_logs
7879
.into_iter()
7980
.filter_map(|log| {
8081
if log.rw_flag {
81-
let key = storage_key_of_log(&log);
82+
let key = storage_key_of_log(&glue_log_query(log));
8283
let pre_paid = pre_paid_before_tx(&key);
83-
let to_pay_by_user = self.state.storage.base_price_for_write(&log);
84+
let to_pay_by_user = self
85+
.state
86+
.storage
87+
.base_price_for_write(&glue_log_query(log));
8488

8589
if to_pay_by_user > pre_paid {
8690
Some(to_pay_by_user - pre_paid)

core/lib/multivm/src/versions/vm_1_3_2/vm_with_bootloader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashMap;
22

3-
use circuit_sequencer_api_1_3_3::INITIAL_MONOTONIC_CYCLE_COUNTER;
3+
use circuit_sequencer_api::INITIAL_MONOTONIC_CYCLE_COUNTER;
44
use itertools::Itertools;
55
use zk_evm_1_3_3::{
66
aux_structures::{MemoryPage, Timestamp},

core/lib/multivm/src/versions/vm_1_4_1/tracers/circuits_capacity.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use circuit_sequencer_api_1_4_1::{geometry_config::get_geometry_config, toolset::GeometryConfig};
1+
use circuit_sequencer_api::geometry_config::{GeometryConfig, ProtocolGeometry};
22

33
use crate::{interface::CircuitStatistic, utils::CircuitCycleStatistic};
44

@@ -40,7 +40,7 @@ pub(crate) const UMA_READ_RAM_CYCLES: u32 = 3;
4040
pub(crate) const PRECOMPILE_RAM_CYCLES: u32 = 1;
4141
pub(crate) const PRECOMPILE_LOG_DEMUXER_CYCLES: u32 = 1;
4242

43-
const GEOMETRY_CONFIG: GeometryConfig = get_geometry_config();
43+
const GEOMETRY_CONFIG: GeometryConfig = ProtocolGeometry::V1_4_1.config();
4444

4545
pub(crate) fn circuit_statistic_from_cycles(cycles: CircuitCycleStatistic) -> CircuitStatistic {
4646
CircuitStatistic {

0 commit comments

Comments
 (0)