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()?) - } }