diff --git a/Makefile b/Makefile
index 3b6ef16a4..e51c587e1 100644
--- a/Makefile
+++ b/Makefile
@@ -17,10 +17,16 @@ ifeq ($(CMD), via-verifier)
VIA_ENV := via_verifier
DIFF := 1
MODE := verifier
+else ifeq ($(CMD), via-verifier-1)
+ VIA_ENV := via_verifier_1
+ DIFF := 5
+ MODE := verifier
else ifeq ($(CMD), via-restart)
VIA_ENV := via
else ifeq ($(CMD), via-restart-verifier)
VIA_ENV := via_verifier
+else ifeq ($(CMD), via-restart-verifier-1)
+ VIA_ENV := via_verifier-1
else ifeq ($(CMD), via-coordinator)
VIA_ENV := via_coordinator
DIFF := 2
@@ -101,6 +107,14 @@ all: base transactions btc-explorer bootstrap-dev server-genesis server
.PHONY: via-verifier
via-verifier: base verifier
+# Run the basic setup workflow in verifier
+.PHONY: via-verifier-1
+via-verifier-1: base verifier
+
+# Run the basic setup workflow in verifier
+.PHONY: via-restart-verifier-1
+via-restart-verifier-1: base verifier
+
# Restart the verifier
.PHONY: via-restart-verifier
via-restart-verifier: env-soft verifier
@@ -209,7 +223,7 @@ bootstrap-dev:
@$(CLI_TOOL) bootstrap system-bootstrapping \
--private-key cVZduZu265sWeAqFYygoDEE1FZ7wV9rpW5qdqjRkUehjaUMWLT1R \
--start-block 1 \
- --verifiers-pub-keys 03d8e2443ef58aa80fb6256bf3b94d2ecf9117f19cb17661ec60ad35fd84ff4a8b,02043f839b8ecd9ffd79f26ec7d05750555cd0d1e0777cfc84a29b7e38e6324662 \
+ --verifiers-pub-keys 03d8e2443ef58aa80fb6256bf3b94d2ecf9117f19cb17661ec60ad35fd84ff4a8b,02043f839b8ecd9ffd79f26ec7d05750555cd0d1e0777cfc84a29b7e38e6324662,0397970cc213de18e3b7a9fbd6e54f6b24a582d561d9d05f154a0bc152038b3543 \
--governance-address bcrt1q92gkfme6k9dkpagrkwt76etkaq29hvf02w5m38f6shs4ddpw7hzqp347zm \
--bridge-wallet-path etc/test_config/via/new_bridge_address.json \
--sequencer-address bcrt1qx2lk0unukm80qmepjp49hwf9z6xnz0s73k9j56
diff --git a/core/lib/basic_types/src/via_roles.rs b/core/lib/basic_types/src/via_roles.rs
index 9de877e2f..75fedccb2 100644
--- a/core/lib/basic_types/src/via_roles.rs
+++ b/core/lib/basic_types/src/via_roles.rs
@@ -4,4 +4,5 @@ use serde::{Deserialize, Serialize};
pub enum ViaNodeRole {
Verifier,
Coordinator,
+ VerifierAndProcessor,
}
diff --git a/core/lib/config/src/configs/via_btc_sender.rs b/core/lib/config/src/configs/via_btc_sender.rs
index 5b63c7e02..c01ab2536 100644
--- a/core/lib/config/src/configs/via_btc_sender.rs
+++ b/core/lib/config/src/configs/via_btc_sender.rs
@@ -1,5 +1,6 @@
-use std::time::Duration;
+use std::{str::FromStr, time::Duration};
+use bitcoin::Address;
use serde::{Deserialize, Serialize};
const DEFAULT_DA_LAYER: &str = "celestia";
@@ -60,6 +61,10 @@ impl ViaBtcSenderConfig {
pub fn stuck_inscription_block_number(&self) -> u32 {
self.stuck_inscription_block_number.unwrap_or(6)
}
+
+ pub fn wallet_address(&self) -> anyhow::Result
{
+ Ok(Address::from_str(&self.wallet_address)?.assume_checked())
+ }
}
impl ViaBtcSenderConfig {
diff --git a/core/lib/config/src/configs/via_verifier.rs b/core/lib/config/src/configs/via_verifier.rs
index edd1b97a2..5391c6b01 100644
--- a/core/lib/config/src/configs/via_verifier.rs
+++ b/core/lib/config/src/configs/via_verifier.rs
@@ -27,22 +27,22 @@ pub struct ViaVerifierConfig {
pub poll_interval: u64,
/// Port to which the coordinator server is listening.
- pub coordinator_port: u16,
+ pub coordinator_port: Option,
/// The coordinator url.
- pub coordinator_http_url: String,
+ pub coordinator_http_url: Option,
/// Verifier Request Timeout (in seconds)
- pub verifier_request_timeout: u8,
+ pub verifier_request_timeout: Option,
/// The verifier btc wallet address.
- pub wallet_address: String,
+ pub wallet_address: Option,
/// The bridge address merkle root.
pub bridge_address_merkle_root: Option,
/// The session timeout.
- pub session_timeout: u64,
+ pub session_timeout: Option,
/// Transaction weight limit.
pub max_tx_weight: Option,
@@ -54,13 +54,16 @@ impl ViaVerifierConfig {
}
pub fn wallet_address(&self) -> anyhow::Result {
- Ok(Address::from_str(&self.wallet_address)?.assume_checked())
+ Ok(Address::from_str(&self.wallet_address.clone().unwrap())?.assume_checked())
}
}
impl ViaVerifierConfig {
pub fn bind_addr(&self) -> SocketAddr {
- SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), self.coordinator_port)
+ SocketAddr::new(
+ IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
+ self.coordinator_port(),
+ )
}
pub fn max_tx_weight(&self) -> u64 {
@@ -72,15 +75,31 @@ impl ViaVerifierConfig {
.unwrap_or((MAX_STANDARD_TX_WEIGHT - 20000).into())
}
+ pub fn coordinator_port(&self) -> u16 {
+ self.coordinator_port.unwrap_or_default()
+ }
+
+ pub fn coordinator_http_url(&self) -> String {
+ self.coordinator_http_url.clone().unwrap_or_default()
+ }
+
+ pub fn verifier_request_timeout(&self) -> u8 {
+ self.verifier_request_timeout.unwrap_or(60)
+ }
+
+ pub fn session_timeout(&self) -> u64 {
+ self.session_timeout.unwrap_or(300)
+ }
+
pub fn for_tests() -> Self {
Self {
role: ViaNodeRole::Verifier,
poll_interval: 1000,
- coordinator_http_url: "http://localhost:3000".into(),
- coordinator_port: 3000,
- verifier_request_timeout: 10,
- wallet_address: "".into(),
- session_timeout: 30,
+ coordinator_http_url: None,
+ coordinator_port: None,
+ verifier_request_timeout: None,
+ wallet_address: None,
+ session_timeout: None,
max_tx_weight: None,
bridge_address_merkle_root: None,
}
diff --git a/docker-compose-via.yml b/docker-compose-via.yml
index 414611f74..ef0a72221 100644
--- a/docker-compose-via.yml
+++ b/docker-compose-via.yml
@@ -27,7 +27,7 @@ x-cli-env: &cli-env
TEST_ADDRESS_OP_RETURN: bcrt1qu7z4qrlwl33qqz8duph0k7hv8trvgx8dt8jzfz
VERIFIER_1_ADDRESS: bcrt1qw2mvkvm6alfhe86yf328kgvr7mupdx4vln7kpv
VERIFIER_2_ADDRESS: bcrt1qk8mkhrmgtq24nylzyzejznfzws6d98g4kmuuh4
- VERIFIER_3_ADDRESS: bcrt1q23lgaa90s85jvtl6dsrkvn0g949cwjkwuyzwdm
+ VERIFIER_3_ADDRESS: bcrt1qynr9a3cxue43kluh0v2yaxp4cyhfanna7se755
BRIDGE_TEST_ADDRESS: bcrt1pcx974cg2w66cqhx67zadf85t8k4sd2wp68l8x8agd3aj4tuegsgsz97amg
BRIDGE_TEST_ADDRESS2: bcrt1pm4rre0xv8ryr9lr5lrnzx5tpyk0xr43kfw3aja68c0845vsu5wus3u40fp
GOV_ADDRESS: bcrt1q92gkfme6k9dkpagrkwt76etkaq29hvf02w5m38f6shs4ddpw7hzqp347zm
diff --git a/etc/env/configs/via_verifier.toml b/etc/env/configs/via_verifier.toml
index 6b137c463..9f0e9e0c8 100644
--- a/etc/env/configs/via_verifier.toml
+++ b/etc/env/configs/via_verifier.toml
@@ -2,7 +2,7 @@ __imports__ = ["base", "l2-inits/via_verifier.init.env"]
[via_verifier]
# The verifier role.
-role = "Verifier"
+role = "VerifierAndProcessor"
# The wallet used in musig2 sessions.
private_key = "cQ4UHjdsGWFMcQ8zXcaSr7m4Kxq9x7g9EKqguTaFH7fA34mZAnqW"
wallet_address = "bcrt1qk8mkhrmgtq24nylzyzejznfzws6d98g4kmuuh4"
diff --git a/etc/env/configs/via_verifier_1.toml b/etc/env/configs/via_verifier_1.toml
new file mode 100644
index 000000000..bb01f69b7
--- /dev/null
+++ b/etc/env/configs/via_verifier_1.toml
@@ -0,0 +1,10 @@
+__imports__ = ["base", "l2-inits/via_verifier_1.init.env"]
+
+[via_verifier]
+# The verifier role.
+role = "Verifier"
+
+[via_btc_sender]
+# The wallet used in the btc sender.
+private_key = "cNgSiSJnL76tCs2gFdXeLMC2CcB553qThyVnodbgyjFFYtb4NLT6"
+wallet_address = "bcrt1qynr9a3cxue43kluh0v2yaxp4cyhfanna7se755"
diff --git a/via_verifier/bin/verifier_server/src/node_builder.rs b/via_verifier/bin/verifier_server/src/node_builder.rs
index c7e2ddce6..bcb560f1e 100644
--- a/via_verifier/bin/verifier_server/src/node_builder.rs
+++ b/via_verifier/bin/verifier_server/src/node_builder.rs
@@ -29,7 +29,6 @@ use zksync_types::via_roles::ViaNodeRole;
use zksync_vlog::prometheus::PrometheusExporterConfig;
pub struct ViaNodeBuilder {
- is_coordinator: bool,
node: ZkStackServiceBuilder,
configs: ViaGeneralVerifierConfig,
}
@@ -37,7 +36,6 @@ pub struct ViaNodeBuilder {
impl ViaNodeBuilder {
pub fn new(configs: ViaGeneralVerifierConfig) -> anyhow::Result {
Ok(Self {
- is_coordinator: configs.via_verifier_config.role == ViaNodeRole::Coordinator,
node: ZkStackServiceBuilder::new().context("Cannot create ZkStackServiceBuilder")?,
configs,
})
@@ -218,11 +216,13 @@ impl ViaNodeBuilder {
.add_object_store_layer()?
.add_zkp_verification_layer()?;
- if self.is_coordinator {
+ if self.configs.via_verifier_config.role == ViaNodeRole::Coordinator {
self = self.add_verifier_coordinator_api_layer()?
}
- self = self.add_withdrawal_verifier_task_layer()?;
+ if self.configs.via_verifier_config.role != ViaNodeRole::Verifier {
+ self = self.add_withdrawal_verifier_task_layer()?;
+ }
Ok(self.node.build())
}
diff --git a/via_verifier/lib/verifier_dal/src/withdrawals_dal.rs b/via_verifier/lib/verifier_dal/src/withdrawals_dal.rs
index b579e4e02..231b85934 100644
--- a/via_verifier/lib/verifier_dal/src/withdrawals_dal.rs
+++ b/via_verifier/lib/verifier_dal/src/withdrawals_dal.rs
@@ -164,7 +164,7 @@ impl ViaWithdrawalDal<'_, '_> {
bridge_withdrawal_id: i64,
withdrawal: &WithdrawalRequest,
) -> DalResult<()> {
- let result = sqlx::query!(
+ sqlx::query!(
r#"
UPDATE via_withdrawals SET
bridge_withdrawal_id = $4,
diff --git a/via_verifier/node/via_btc_sender/src/btc_vote_inscription.rs b/via_verifier/node/via_btc_sender/src/btc_vote_inscription.rs
index 1e2eaf4e8..cfffd4f5c 100644
--- a/via_verifier/node/via_btc_sender/src/btc_vote_inscription.rs
+++ b/via_verifier/node/via_btc_sender/src/btc_vote_inscription.rs
@@ -7,7 +7,10 @@ use via_btc_client::{
};
use via_verifier_dal::{Connection, ConnectionPool, Verifier, VerifierDal};
use zksync_config::ViaBtcSenderConfig;
-use zksync_types::via_verifier_btc_inscription_operations::ViaVerifierBtcInscriptionRequestType;
+use zksync_types::{
+ via_verifier_btc_inscription_operations::ViaVerifierBtcInscriptionRequestType,
+ via_wallet::SystemWallets,
+};
use crate::metrics::METRICS;
@@ -56,6 +59,8 @@ impl ViaVoteInscription {
&mut self,
storage: &mut Connection<'_, Verifier>,
) -> anyhow::Result<()> {
+ self.validate_verifier_address().await?;
+
if storage
.via_l1_block_dal()
.has_reorg_in_progress()
@@ -149,4 +154,25 @@ impl ViaVoteInscription {
reversed_bytes.reverse();
Txid::from_slice(&reversed_bytes).with_context(|| "Failed to convert H256 to Txid")
}
+
+ /// Check if the wallet is in the verifier set.
+ async fn validate_verifier_address(&self) -> anyhow::Result<()> {
+ let mut storage = self.pool.connection().await?;
+
+ let last_processed_l1_block = storage
+ .via_indexer_dal()
+ .get_last_processed_l1_block("via_btc_watch")
+ .await?;
+
+ let Some(wallets_map) = storage
+ .via_wallet_dal()
+ .get_system_wallets_raw(last_processed_l1_block as i64)
+ .await?
+ else {
+ anyhow::bail!("System wallets not found")
+ };
+
+ let wallets = SystemWallets::try_from(wallets_map)?;
+ wallets.is_valid_verifier_address(self.config.wallet_address()?)
+ }
}
diff --git a/via_verifier/node/via_verifier_coordinator/src/coordinator/api_decl.rs b/via_verifier/node/via_verifier_coordinator/src/coordinator/api_decl.rs
index 615c07132..6e1cdd6f1 100644
--- a/via_verifier/node/via_verifier_coordinator/src/coordinator/api_decl.rs
+++ b/via_verifier/node/via_verifier_coordinator/src/coordinator/api_decl.rs
@@ -41,8 +41,8 @@ impl RestApi {
.iter()
.map(|s| bitcoin::secp256k1::PublicKey::from_str(s).unwrap())
.collect(),
- verifier_request_timeout: config.verifier_request_timeout,
- session_timeout: config.session_timeout,
+ verifier_request_timeout: config.verifier_request_timeout(),
+ session_timeout: config.session_timeout(),
};
let transaction_builder = Arc::new(TransactionBuilder::new(btc_client.clone())?);
diff --git a/via_verifier/node/via_verifier_coordinator/src/verifier/mod.rs b/via_verifier/node/via_verifier_coordinator/src/verifier/mod.rs
index 43b15744e..ce04d87bc 100644
--- a/via_verifier/node/via_verifier_coordinator/src/verifier/mod.rs
+++ b/via_verifier/node/via_verifier_coordinator/src/verifier/mod.rs
@@ -271,7 +271,7 @@ impl ViaWithdrawalVerifier {
}
async fn get_session(&self) -> anyhow::Result {
- let url = format!("{}/session", self.verifier_config.coordinator_http_url);
+ let url = format!("{}/session", self.verifier_config.coordinator_http_url());
let headers = self.create_request_headers()?;
let resp = self
.client
@@ -295,7 +295,7 @@ impl ViaWithdrawalVerifier {
async fn get_session_nonces(&self) -> anyhow::Result>> {
let nonces_url = format!(
"{}/session/nonce",
- self.verifier_config.coordinator_http_url
+ self.verifier_config.coordinator_http_url()
);
let headers = self.create_request_headers()?;
let resp = self
@@ -338,7 +338,7 @@ impl ViaWithdrawalVerifier {
let url = format!(
"{}/session/nonce",
- self.verifier_config.coordinator_http_url
+ self.verifier_config.coordinator_http_url()
);
let headers = self.create_request_headers()?;
@@ -373,7 +373,7 @@ impl ViaWithdrawalVerifier {
) -> anyhow::Result>> {
let url = format!(
"{}/session/signature",
- self.verifier_config.coordinator_http_url
+ self.verifier_config.coordinator_http_url()
);
let headers = self.create_request_headers()?;
let resp = self
@@ -475,7 +475,7 @@ impl ViaWithdrawalVerifier {
let url = format!(
"{}/session/signature",
- self.verifier_config.coordinator_http_url
+ self.verifier_config.coordinator_http_url()
);
let headers = self.create_request_headers()?;
@@ -535,7 +535,7 @@ impl ViaWithdrawalVerifier {
}
async fn create_new_session(&mut self) -> anyhow::Result<()> {
- let url = format!("{}/session/new", self.verifier_config.coordinator_http_url);
+ let url = format!("{}/session/new", self.verifier_config.coordinator_http_url());
let headers = self.create_request_headers()?;
let resp = self
.client
diff --git a/via_verifier/node/via_zk_verifier/src/lib.rs b/via_verifier/node/via_zk_verifier/src/lib.rs
index c7e1ab72c..feba77795 100644
--- a/via_verifier/node/via_zk_verifier/src/lib.rs
+++ b/via_verifier/node/via_zk_verifier/src/lib.rs
@@ -18,7 +18,7 @@ use via_verifier_types::protocol_version::check_if_supported_sequencer_version;
use zksync_config::{ViaBtcWatchConfig, ViaVerifierConfig};
use zksync_da_client::{types::InclusionData, DataAvailabilityClient};
use zksync_object_store::ObjectStore;
-use zksync_types::{via_wallet::SystemWallets, L1BatchNumber, H160, H256};
+use zksync_types::{L1BatchNumber, H160, H256};
mod metrics;
@@ -91,8 +91,6 @@ impl ViaVerifier {
return Ok(());
}
- self.validate_verifier_address().await?;
-
if let Some((l1_batch_number, mut raw_tx_id)) = storage
.via_votes_dal()
.get_first_not_verified_l1_batch_in_canonical_inscription_chain()
@@ -407,24 +405,4 @@ impl ViaVerifier {
Ok((blob, hash))
}
- /// Check if the wallet is in the verifier set.
- async fn validate_verifier_address(&self) -> anyhow::Result<()> {
- let mut storage = self.pool.connection().await?;
-
- let last_processed_l1_block = storage
- .via_indexer_dal()
- .get_last_processed_l1_block("via_btc_watch")
- .await?;
-
- let Some(wallets_map) = storage
- .via_wallet_dal()
- .get_system_wallets_raw(last_processed_l1_block as i64)
- .await?
- else {
- anyhow::bail!("System wallets not found")
- };
-
- let wallets = SystemWallets::try_from(wallets_map)?;
- wallets.is_valid_verifier_address(self.config.wallet_address()?)
- }
}