Skip to content

Commit 719455c

Browse files
authored
refactor(contract-verifier): Brush up contract verifier (#3189)
## What ❔ Brushes up contract verifier code. ## Why ❔ Would make it easier to support EVM emulation in the contract verifier. ## Checklist - [x] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [x] Tests for the changes have been added / updated. - [x] Documentation comments have been added / updated. - [x] Code has been formatted via `zkstack dev fmt` and `zkstack dev lint`.
1 parent 9dae839 commit 719455c

File tree

29 files changed

+1344
-576
lines changed

29 files changed

+1344
-576
lines changed

.github/workflows/ci-core-reusable.yml

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ jobs:
3434
echo "SCCACHE_GCS_SERVICE_ACCOUNT=gha-ci-runners@matterlabs-infra.iam.gserviceaccount.com" >> .env
3535
echo "SCCACHE_GCS_RW_MODE=READ_WRITE" >> .env
3636
echo "RUSTC_WRAPPER=sccache" >> .env
37+
echo RUN_CONTRACT_VERIFICATION_TEST=true >> .env
3738
3839
# TODO: Remove when we after upgrade of hardhat-plugins
3940
- name: pre-download compilers
@@ -73,6 +74,9 @@ jobs:
7374
- name: Contracts unit tests
7475
run: ci_run yarn l1-contracts test
7576

77+
- name: Download compilers for contract verifier tests
78+
run: ci_run zkstack contract-verifier init --zksolc-version=v1.5.3 --zkvyper-version=v1.5.4 --solc-version=0.8.26 --vyper-version=v0.3.10 --era-vm-solc-version=0.8.26-1.0.1 --only --chain era
79+
7680
- name: Rust unit tests
7781
run: |
7882
ci_run zkstack dev test rust

Cargo.lock

+4-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ hyper = "1.3"
135135
insta = "1.29.0"
136136
itertools = "0.10"
137137
jsonrpsee = { version = "0.23", default-features = false }
138-
lazy_static = "1.4"
139138
leb128 = "0.2.5"
140139
lru = { version = "0.12.1", default-features = false }
141140
mini-moka = "0.10.0"

core/bin/contract-verifier/src/main.rs

+5-99
Original file line numberDiff line numberDiff line change
@@ -7,105 +7,11 @@ use tokio::sync::watch;
77
use zksync_config::configs::PrometheusConfig;
88
use zksync_contract_verifier_lib::ContractVerifier;
99
use zksync_core_leftovers::temp_config_store::{load_database_secrets, load_general_config};
10-
use zksync_dal::{ConnectionPool, Core, CoreDal};
10+
use zksync_dal::{ConnectionPool, Core};
1111
use zksync_queued_job_processor::JobProcessor;
12-
use zksync_utils::{env::Workspace, wait_for_tasks::ManagedTasks};
12+
use zksync_utils::wait_for_tasks::ManagedTasks;
1313
use zksync_vlog::prometheus::PrometheusExporterConfig;
1414

15-
async fn update_compiler_versions(connection_pool: &ConnectionPool<Core>) {
16-
let mut storage = connection_pool.connection().await.unwrap();
17-
let mut transaction = storage.start_transaction().await.unwrap();
18-
19-
let zksync_home = Workspace::locate().core();
20-
21-
let zksolc_path = zksync_home.join("etc/zksolc-bin/");
22-
let zksolc_versions: Vec<String> = std::fs::read_dir(zksolc_path)
23-
.unwrap()
24-
.filter_map(|file| {
25-
let file = file.unwrap();
26-
let Ok(file_type) = file.file_type() else {
27-
return None;
28-
};
29-
if file_type.is_dir() {
30-
file.file_name().into_string().ok()
31-
} else {
32-
None
33-
}
34-
})
35-
.collect();
36-
transaction
37-
.contract_verification_dal()
38-
.set_zksolc_versions(zksolc_versions)
39-
.await
40-
.unwrap();
41-
42-
let solc_path = zksync_home.join("etc/solc-bin/");
43-
let solc_versions: Vec<String> = std::fs::read_dir(solc_path)
44-
.unwrap()
45-
.filter_map(|file| {
46-
let file = file.unwrap();
47-
let Ok(file_type) = file.file_type() else {
48-
return None;
49-
};
50-
if file_type.is_dir() {
51-
file.file_name().into_string().ok()
52-
} else {
53-
None
54-
}
55-
})
56-
.collect();
57-
transaction
58-
.contract_verification_dal()
59-
.set_solc_versions(solc_versions)
60-
.await
61-
.unwrap();
62-
63-
let zkvyper_path = zksync_home.join("etc/zkvyper-bin/");
64-
let zkvyper_versions: Vec<String> = std::fs::read_dir(zkvyper_path)
65-
.unwrap()
66-
.filter_map(|file| {
67-
let file = file.unwrap();
68-
let Ok(file_type) = file.file_type() else {
69-
return None;
70-
};
71-
if file_type.is_dir() {
72-
file.file_name().into_string().ok()
73-
} else {
74-
None
75-
}
76-
})
77-
.collect();
78-
transaction
79-
.contract_verification_dal()
80-
.set_zkvyper_versions(zkvyper_versions)
81-
.await
82-
.unwrap();
83-
84-
let vyper_path = zksync_home.join("etc/vyper-bin/");
85-
let vyper_versions: Vec<String> = std::fs::read_dir(vyper_path)
86-
.unwrap()
87-
.filter_map(|file| {
88-
let file = file.unwrap();
89-
let Ok(file_type) = file.file_type() else {
90-
return None;
91-
};
92-
if file_type.is_dir() {
93-
file.file_name().into_string().ok()
94-
} else {
95-
None
96-
}
97-
})
98-
.collect();
99-
100-
transaction
101-
.contract_verification_dal()
102-
.set_vyper_versions(vyper_versions)
103-
.await
104-
.unwrap();
105-
106-
transaction.commit().await.unwrap();
107-
}
108-
10915
#[derive(StructOpt)]
11016
#[structopt(name = "ZKsync contract code verifier", author = "Matter Labs")]
11117
struct Opt {
@@ -160,9 +66,9 @@ async fn main() -> anyhow::Result<()> {
16066
.expect("Error setting Ctrl+C handler");
16167
}
16268

163-
update_compiler_versions(&pool).await;
164-
165-
let contract_verifier = ContractVerifier::new(verifier_config, pool);
69+
let contract_verifier = ContractVerifier::new(verifier_config.compilation_timeout(), pool)
70+
.await
71+
.context("failed initializing contract verifier")?;
16672
let tasks = vec![
16773
// TODO PLA-335: Leftovers after the prover DB split.
16874
// The prover connection pool is not used by the contract verifier, but we need to pass it

core/lib/config/src/configs/contract_verifier.rs

-7
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,16 @@ use serde::Deserialize;
99
pub struct ContractVerifierConfig {
1010
/// Max time of a single compilation (in s).
1111
pub compilation_timeout: u64,
12-
/// Interval between polling db for verification requests (in ms).
13-
pub polling_interval: Option<u64>,
1412
/// Port to which the Prometheus exporter server is listening.
1513
pub prometheus_port: u16,
16-
pub threads_per_server: Option<u16>,
1714
pub port: u16,
18-
pub url: String,
1915
}
2016

2117
impl ContractVerifierConfig {
2218
pub fn compilation_timeout(&self) -> Duration {
2319
Duration::from_secs(self.compilation_timeout)
2420
}
2521

26-
pub fn polling_interval(&self) -> Duration {
27-
Duration::from_millis(self.polling_interval.unwrap_or(1000))
28-
}
2922
pub fn bind_addr(&self) -> SocketAddr {
3023
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), self.port)
3124
}

core/lib/config/src/testonly.rs

-3
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,8 @@ impl Distribution<configs::ContractVerifierConfig> for EncodeDist {
241241
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> configs::ContractVerifierConfig {
242242
configs::ContractVerifierConfig {
243243
compilation_timeout: self.sample(rng),
244-
polling_interval: self.sample(rng),
245244
prometheus_port: self.sample(rng),
246-
threads_per_server: self.sample(rng),
247245
port: self.sample(rng),
248-
url: self.sample(rng),
249246
}
250247
}
251248
}

core/lib/contract_verifier/Cargo.toml

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ categories.workspace = true
1313
[dependencies]
1414
zksync_types.workspace = true
1515
zksync_dal.workspace = true
16-
zksync_config.workspace = true
1716
zksync_contracts.workspace = true
1817
zksync_queued_job_processor.workspace = true
1918
zksync_utils.workspace = true
@@ -27,8 +26,11 @@ ethabi.workspace = true
2726
vise.workspace = true
2827
hex.workspace = true
2928
serde = { workspace = true, features = ["derive"] }
30-
lazy_static.workspace = true
3129
tempfile.workspace = true
3230
regex.workspace = true
3331
tracing.workspace = true
3432
semver.workspace = true
33+
34+
[dev-dependencies]
35+
zksync_node_test_utils.workspace = true
36+
zksync_vm_interface.workspace = true

core/lib/contract_verifier/src/error.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
#[derive(Debug, Clone, thiserror::Error)]
1+
use zksync_dal::DalError;
2+
3+
#[derive(Debug, thiserror::Error)]
24
pub enum ContractVerifierError {
35
#[error("Internal error")]
4-
InternalError,
6+
Internal(#[from] anyhow::Error),
57
#[error("Deployed bytecode is not equal to generated one from given source")]
68
BytecodeMismatch,
79
#[error("Constructor arguments are not correct")]
@@ -23,3 +25,9 @@ pub enum ContractVerifierError {
2325
#[error("Failed to deserialize standard JSON input")]
2426
FailedToDeserializeInput,
2527
}
28+
29+
impl From<DalError> for ContractVerifierError {
30+
fn from(err: DalError) -> Self {
31+
Self::Internal(err.generalize())
32+
}
33+
}

0 commit comments

Comments
 (0)