From a5cf30fb1a5eed004a1950e7df8612fb5ecd9f39 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Fri, 20 Dec 2024 17:44:59 +0100 Subject: [PATCH 01/10] chore: da_dispatcher refactoring --- core/bin/zksync_server/src/node_builder.rs | 15 +++- core/lib/config/src/configs/da_client/mod.rs | 2 + core/lib/config/src/configs/da_dispatcher.rs | 2 +- core/lib/protobuf_config/src/da_client.rs | 4 +- .../src/proto/config/da_client.proto | 3 + core/node/da_dispatcher/src/da_dispatcher.rs | 68 ++++++++++++------- etc/env/file_based/overrides/validium.yaml | 2 + 7 files changed, 66 insertions(+), 30 deletions(-) diff --git a/core/bin/zksync_server/src/node_builder.rs b/core/bin/zksync_server/src/node_builder.rs index f1db73164eb1..41a620510edc 100644 --- a/core/bin/zksync_server/src/node_builder.rs +++ b/core/bin/zksync_server/src/node_builder.rs @@ -530,10 +530,16 @@ impl MainNodeBuilder { } fn add_da_client_layer(mut self) -> anyhow::Result { + let eth_sender_config = try_load_config!(self.configs.eth); + if let Some(sender_config) = eth_sender_config.sender { + if sender_config.pubdata_sending_mode != PubdataSendingMode::Custom { + tracing::warn!("DA dispatcher is enabled, but the pubdata sending mode is not `Custom`. DA client will not be started."); + return Ok(self); + } + } + let Some(da_client_config) = self.configs.da_client_config.clone() else { - tracing::warn!("No config for DA client, using the NoDA client"); - self.node.add_layer(NoDAClientWiringLayer); - return Ok(self); + bail!("No config for DA client"); }; let secrets = try_load_config!(self.secrets.data_availability); @@ -555,6 +561,9 @@ impl MainNodeBuilder { self.node .add_layer(ObjectStorageClientWiringLayer::new(config)); } + (DAClientConfig::NoDA, _) => { + self.node.add_layer(NoDAClientWiringLayer); + } _ => bail!("invalid pair of da_client and da_secrets"), } diff --git a/core/lib/config/src/configs/da_client/mod.rs b/core/lib/config/src/configs/da_client/mod.rs index f82fd134edb5..717239814b9b 100644 --- a/core/lib/config/src/configs/da_client/mod.rs +++ b/core/lib/config/src/configs/da_client/mod.rs @@ -8,6 +8,7 @@ pub const AVAIL_CLIENT_CONFIG_NAME: &str = "Avail"; pub const CELESTIA_CLIENT_CONFIG_NAME: &str = "Celestia"; pub const EIGEN_CLIENT_CONFIG_NAME: &str = "Eigen"; pub const OBJECT_STORE_CLIENT_CONFIG_NAME: &str = "ObjectStore"; +pub const NO_DA_CLIENT_CONFIG_NAME: &str = "NoDA"; #[derive(Debug, Clone, PartialEq)] pub enum DAClientConfig { @@ -15,6 +16,7 @@ pub enum DAClientConfig { Celestia(CelestiaConfig), Eigen(EigenConfig), ObjectStore(ObjectStoreConfig), + NoDA, } impl From for DAClientConfig { diff --git a/core/lib/config/src/configs/da_dispatcher.rs b/core/lib/config/src/configs/da_dispatcher.rs index e9ad6bd3c074..4addee1ac140 100644 --- a/core/lib/config/src/configs/da_dispatcher.rs +++ b/core/lib/config/src/configs/da_dispatcher.rs @@ -3,7 +3,7 @@ use std::time::Duration; use serde::Deserialize; pub const DEFAULT_POLLING_INTERVAL_MS: u32 = 5000; -pub const DEFAULT_MAX_ROWS_TO_DISPATCH: u32 = 100; +pub const DEFAULT_MAX_ROWS_TO_DISPATCH: u32 = 3; pub const DEFAULT_MAX_RETRIES: u16 = 5; pub const DEFAULT_USE_DUMMY_INCLUSION_DATA: bool = false; diff --git a/core/lib/protobuf_config/src/da_client.rs b/core/lib/protobuf_config/src/da_client.rs index 341a6a9e4f43..95086fef9b26 100644 --- a/core/lib/protobuf_config/src/da_client.rs +++ b/core/lib/protobuf_config/src/da_client.rs @@ -5,7 +5,7 @@ use zksync_config::configs::{ avail::{AvailClientConfig, AvailConfig, AvailDefaultConfig, AvailGasRelayConfig}, celestia::CelestiaConfig, eigen::EigenConfig, - DAClientConfig::{Avail, Celestia, Eigen, ObjectStore}, + DAClientConfig::{Avail, Celestia, Eigen, NoDA, ObjectStore}, }, }; use zksync_protobuf::{required, ProtoRepr}; @@ -62,6 +62,7 @@ impl ProtoRepr for proto::DataAvailabilityClient { proto::data_availability_client::Config::ObjectStore(conf) => { ObjectStore(object_store_proto::ObjectStore::read(conf)?) } + proto::data_availability_client::Config::NoDa(_) => NoDA, }; Ok(client) @@ -102,6 +103,7 @@ impl ProtoRepr for proto::DataAvailabilityClient { ObjectStore(config) => proto::data_availability_client::Config::ObjectStore( object_store_proto::ObjectStore::build(config), ), + NoDA => proto::data_availability_client::Config::NoDa(proto::NoDaConfig {}), }; Self { diff --git a/core/lib/protobuf_config/src/proto/config/da_client.proto b/core/lib/protobuf_config/src/proto/config/da_client.proto index 0a302120d775..ecd61fbef628 100644 --- a/core/lib/protobuf_config/src/proto/config/da_client.proto +++ b/core/lib/protobuf_config/src/proto/config/da_client.proto @@ -41,6 +41,8 @@ message EigenConfig { optional uint64 inclusion_polling_interval_ms = 2; } +message NoDAConfig {} + message DataAvailabilityClient { // oneof in protobuf allows for None oneof config { @@ -48,5 +50,6 @@ message DataAvailabilityClient { object_store.ObjectStore object_store = 2; CelestiaConfig celestia = 3; EigenConfig eigen = 4; + NoDAConfig no_da = 5; } } diff --git a/core/node/da_dispatcher/src/da_dispatcher.rs b/core/node/da_dispatcher/src/da_dispatcher.rs index 2cdde9951be9..935c31542c45 100644 --- a/core/node/da_dispatcher/src/da_dispatcher.rs +++ b/core/node/da_dispatcher/src/da_dispatcher.rs @@ -1,4 +1,4 @@ -use std::{future::Future, time::Duration}; +use std::{future::Future, sync::Arc, time::Duration}; use anyhow::Context; use chrono::Utc; @@ -14,7 +14,7 @@ use zksync_types::L1BatchNumber; use crate::metrics::METRICS; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct DataAvailabilityDispatcher { client: Box, pool: ConnectionPool, @@ -35,37 +35,55 @@ impl DataAvailabilityDispatcher { } pub async fn run(self, mut stop_receiver: Receiver) -> anyhow::Result<()> { - loop { - if *stop_receiver.borrow() { - break; - } + let self_arc = Arc::new(self.clone()); - let subtasks = futures::future::join( - async { - if let Err(err) = self.dispatch().await { - tracing::error!("dispatch error {err:?}"); - } - }, - async { - if let Err(err) = self.poll_for_inclusion().await { - tracing::error!("poll_for_inclusion error {err:?}"); - } - }, - ); + let mut stop_receiver_dispatch = stop_receiver.clone(); - tokio::select! { - _ = subtasks => {}, - _ = stop_receiver.changed() => { + let dispatch_task = tokio::spawn(async move { + loop { + if *stop_receiver_dispatch.borrow() { break; } - } - if tokio::time::timeout(self.config.polling_interval(), stop_receiver.changed()) + if let Err(err) = self_arc.dispatch().await { + tracing::error!("dispatch error {err:?}"); + } + + if tokio::time::timeout( + self_arc.config.polling_interval(), + stop_receiver_dispatch.changed(), + ) .await .is_ok() - { - break; + { + break; + } + } + }); + + let inclusion_task = tokio::spawn(async move { + loop { + if *stop_receiver.borrow() { + break; + } + + if let Err(err) = self.poll_for_inclusion().await { + tracing::error!("poll_for_inclusion error {err:?}"); + } + + if tokio::time::timeout(self.config.polling_interval(), stop_receiver.changed()) + .await + .is_ok() + { + break; + } } + }); + + tokio::select! { + _ = dispatch_task => {}, + _ = inclusion_task => {}, + _ = stop_receiver.changed() => {}, } tracing::info!("Stop signal received, da_dispatcher is shutting down"); diff --git a/etc/env/file_based/overrides/validium.yaml b/etc/env/file_based/overrides/validium.yaml index 1af02dd95893..8988600e9325 100644 --- a/etc/env/file_based/overrides/validium.yaml +++ b/etc/env/file_based/overrides/validium.yaml @@ -4,3 +4,5 @@ eth: state_keeper: pubdata_overhead_part: 0 compute_overhead_part: 1 +da_client: + no_da: From 7998a1b5ea6f19af890cf51ecd06097ab251e39d Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Fri, 20 Dec 2024 17:46:26 +0100 Subject: [PATCH 02/10] modify finality state --- core/node/da_clients/src/avail/sdk.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/node/da_clients/src/avail/sdk.rs b/core/node/da_clients/src/avail/sdk.rs index 19309dc3cbf3..4eb81ed72879 100644 --- a/core/node/da_clients/src/avail/sdk.rs +++ b/core/node/da_clients/src/avail/sdk.rs @@ -21,6 +21,7 @@ use zksync_types::H256; use crate::utils::to_non_retriable_da_error; const PROTOCOL_VERSION: u8 = 4; +const FINALITY_STATE: &str = "inBlock"; /// An implementation of the `DataAvailabilityClient` trait that interacts with the Avail network. #[derive(Debug, Clone)] @@ -291,7 +292,7 @@ impl RawAvailClient { let status = sub.next().await.transpose()?; if status.is_some() && status.as_ref().unwrap().is_object() { - if let Some(block_hash) = status.unwrap().get("finalized") { + if let Some(block_hash) = status.unwrap().get(FINALITY_STATE) { break block_hash .as_str() .ok_or_else(|| anyhow::anyhow!("Invalid block hash"))? From 6668605e742c0bd8c9d6a2475120b85632562229 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Sun, 22 Dec 2024 19:19:45 +0100 Subject: [PATCH 03/10] fix --- core/node/da_dispatcher/src/da_dispatcher.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/node/da_dispatcher/src/da_dispatcher.rs b/core/node/da_dispatcher/src/da_dispatcher.rs index 935c31542c45..f59a30b362ee 100644 --- a/core/node/da_dispatcher/src/da_dispatcher.rs +++ b/core/node/da_dispatcher/src/da_dispatcher.rs @@ -38,6 +38,7 @@ impl DataAvailabilityDispatcher { let self_arc = Arc::new(self.clone()); let mut stop_receiver_dispatch = stop_receiver.clone(); + let mut stop_receiver_poll_for_inclusion = stop_receiver.clone(); let dispatch_task = tokio::spawn(async move { loop { @@ -63,7 +64,7 @@ impl DataAvailabilityDispatcher { let inclusion_task = tokio::spawn(async move { loop { - if *stop_receiver.borrow() { + if *stop_receiver_poll_for_inclusion.borrow() { break; } @@ -71,9 +72,12 @@ impl DataAvailabilityDispatcher { tracing::error!("poll_for_inclusion error {err:?}"); } - if tokio::time::timeout(self.config.polling_interval(), stop_receiver.changed()) - .await - .is_ok() + if tokio::time::timeout( + self.config.polling_interval(), + stop_receiver_poll_for_inclusion.changed(), + ) + .await + .is_ok() { break; } From 08f107b80208a9347e50b270d23127445c2e5f34 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Mon, 6 Jan 2025 17:28:10 +0000 Subject: [PATCH 04/10] fix default config --- core/bin/zksync_server/src/node_builder.rs | 8 +++++--- core/lib/protobuf_config/src/da_client.rs | 3 +-- etc/env/file_based/overrides/validium.yaml | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/bin/zksync_server/src/node_builder.rs b/core/bin/zksync_server/src/node_builder.rs index 41a620510edc..27b14a16504c 100644 --- a/core/bin/zksync_server/src/node_builder.rs +++ b/core/bin/zksync_server/src/node_builder.rs @@ -542,6 +542,11 @@ impl MainNodeBuilder { bail!("No config for DA client"); }; + if let DAClientConfig::NoDA = da_client_config { + self.node.add_layer(NoDAClientWiringLayer); + return Ok(self); + } + let secrets = try_load_config!(self.secrets.data_availability); match (da_client_config, secrets) { (DAClientConfig::Avail(config), DataAvailabilitySecrets::Avail(secret)) => { @@ -561,9 +566,6 @@ impl MainNodeBuilder { self.node .add_layer(ObjectStorageClientWiringLayer::new(config)); } - (DAClientConfig::NoDA, _) => { - self.node.add_layer(NoDAClientWiringLayer); - } _ => bail!("invalid pair of da_client and da_secrets"), } diff --git a/core/lib/protobuf_config/src/da_client.rs b/core/lib/protobuf_config/src/da_client.rs index 95086fef9b26..7f220c1851a9 100644 --- a/core/lib/protobuf_config/src/da_client.rs +++ b/core/lib/protobuf_config/src/da_client.rs @@ -16,8 +16,7 @@ impl ProtoRepr for proto::DataAvailabilityClient { type Type = configs::DAClientConfig; fn read(&self) -> anyhow::Result { - let config = required(&self.config).context("config")?; - + let config = required(&self.config).context("da_client config")?; let client = match config { proto::data_availability_client::Config::Avail(conf) => Avail(AvailConfig { bridge_api_url: required(&conf.bridge_api_url) diff --git a/etc/env/file_based/overrides/validium.yaml b/etc/env/file_based/overrides/validium.yaml index 8988600e9325..516973f66689 100644 --- a/etc/env/file_based/overrides/validium.yaml +++ b/etc/env/file_based/overrides/validium.yaml @@ -5,4 +5,4 @@ state_keeper: pubdata_overhead_part: 0 compute_overhead_part: 1 da_client: - no_da: + no_da: {} From b579ec438fd971e5410152239cc73310e2218e30 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Mon, 6 Jan 2025 17:55:06 +0000 Subject: [PATCH 05/10] fix --- core/bin/zksync_server/src/node_builder.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/bin/zksync_server/src/node_builder.rs b/core/bin/zksync_server/src/node_builder.rs index 07086c3165a9..784639ffd6ae 100644 --- a/core/bin/zksync_server/src/node_builder.rs +++ b/core/bin/zksync_server/src/node_builder.rs @@ -121,22 +121,23 @@ impl MainNodeBuilder { self.node.runtime_handle() } - pub fn get_pubdata_type(&self) -> PubdataType { + pub fn get_pubdata_type(&self) -> anyhow::Result { if self.genesis_config.l1_batch_commit_data_generator_mode == L1BatchCommitmentMode::Rollup { - return PubdataType::Rollup; + return Ok(PubdataType::Rollup); } let Some(da_client_config) = self.configs.da_client_config.clone() else { - return PubdataType::NoDA; + bail!("No config for DA client"); }; - match da_client_config { + Ok(match da_client_config { DAClientConfig::Avail(_) => PubdataType::Avail, DAClientConfig::Celestia(_) => PubdataType::Celestia, DAClientConfig::Eigen(_) => PubdataType::Eigen, DAClientConfig::ObjectStore(_) => PubdataType::ObjectStore, - } + DAClientConfig::NoDA => PubdataType::NoDA, + }) } fn add_sigint_handler_layer(mut self) -> anyhow::Result { From 3f4e577d636ac1461c805f5cf8d135a23f3390f1 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Mon, 6 Jan 2025 18:03:45 +0000 Subject: [PATCH 06/10] fix Result --- core/bin/zksync_server/src/node_builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/bin/zksync_server/src/node_builder.rs b/core/bin/zksync_server/src/node_builder.rs index 784639ffd6ae..765f8b59e650 100644 --- a/core/bin/zksync_server/src/node_builder.rs +++ b/core/bin/zksync_server/src/node_builder.rs @@ -274,7 +274,7 @@ impl MainNodeBuilder { try_load_config!(self.configs.mempool_config), try_load_config!(wallets.state_keeper), self.contracts_config.l2_da_validator_addr, - self.get_pubdata_type(), + self.get_pubdata_type()?, ); let db_config = try_load_config!(self.configs.db_config); let experimental_vm_config = self From 270ab732a73ea32e0bc8dab59975ef1fccc20a4e Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Tue, 7 Jan 2025 22:24:14 +0000 Subject: [PATCH 07/10] core review fixes --- core/bin/zksync_server/src/node_builder.rs | 21 +++++++++---------- .../lib/config/src/configs/da_client/avail.rs | 21 +++++++++++++++++++ core/lib/config/src/configs/da_dispatcher.rs | 4 ++++ core/lib/protobuf_config/src/da_client.rs | 2 ++ .../src/proto/config/da_client.proto | 1 + core/node/da_clients/src/avail/client.rs | 8 +++++-- core/node/da_clients/src/avail/sdk.rs | 16 ++++++++++---- 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/core/bin/zksync_server/src/node_builder.rs b/core/bin/zksync_server/src/node_builder.rs index 765f8b59e650..9f49f822e8b5 100644 --- a/core/bin/zksync_server/src/node_builder.rs +++ b/core/bin/zksync_server/src/node_builder.rs @@ -127,17 +127,16 @@ impl MainNodeBuilder { return Ok(PubdataType::Rollup); } - let Some(da_client_config) = self.configs.da_client_config.clone() else { - bail!("No config for DA client"); - }; - - Ok(match da_client_config { - DAClientConfig::Avail(_) => PubdataType::Avail, - DAClientConfig::Celestia(_) => PubdataType::Celestia, - DAClientConfig::Eigen(_) => PubdataType::Eigen, - DAClientConfig::ObjectStore(_) => PubdataType::ObjectStore, - DAClientConfig::NoDA => PubdataType::NoDA, - }) + match self.configs.da_client_config.clone() { + None => Err(anyhow::anyhow!("No config for DA client")), + Some(da_client_config) => Ok(match da_client_config { + DAClientConfig::Avail(_) => PubdataType::Avail, + DAClientConfig::Celestia(_) => PubdataType::Celestia, + DAClientConfig::Eigen(_) => PubdataType::Eigen, + DAClientConfig::ObjectStore(_) => PubdataType::ObjectStore, + DAClientConfig::NoDA => PubdataType::NoDA, + }), + } } fn add_sigint_handler_layer(mut self) -> anyhow::Result { diff --git a/core/lib/config/src/configs/da_client/avail.rs b/core/lib/config/src/configs/da_client/avail.rs index 48aaf5b0e61e..9b3ccf64bccb 100644 --- a/core/lib/config/src/configs/da_client/avail.rs +++ b/core/lib/config/src/configs/da_client/avail.rs @@ -4,6 +4,9 @@ use zksync_basic_types::secrets::{APIKey, SeedPhrase}; pub const AVAIL_GAS_RELAY_CLIENT_NAME: &str = "GasRelay"; pub const AVAIL_FULL_CLIENT_NAME: &str = "FullClient"; +pub const IN_BLOCK_FINALITY_STATE: &str = "inBlock"; +pub const FINALIZED_FINALITY_STATE: &str = "finalized"; + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(tag = "avail_client")] pub enum AvailClientConfig { @@ -23,6 +26,7 @@ pub struct AvailConfig { pub struct AvailDefaultConfig { pub api_node_url: String, pub app_id: u32, + pub finality_state: Option, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -36,3 +40,20 @@ pub struct AvailSecrets { pub seed_phrase: Option, pub gas_relay_api_key: Option, } + +impl AvailDefaultConfig { + pub fn finality_state(&self) -> anyhow::Result { + match self.finality_state.clone() { + Some(finality_state) => match finality_state { + IN_BLOCK_FINALITY_STATE | FINALIZED_FINALITY_STATE => Ok(finality_state), + _ => Err(anyhow::anyhow!( + "Invalid finality state: {}. Supported values are: {}, {}", + finality_state, + IN_BLOCK_FINALITY_STATE, + FINALIZED_FINALITY_STATE + )), + }, + None => Ok(IN_BLOCK_FINALITY_STATE.to_string()), + } + } +} diff --git a/core/lib/config/src/configs/da_dispatcher.rs b/core/lib/config/src/configs/da_dispatcher.rs index 4addee1ac140..aeacc6c8b102 100644 --- a/core/lib/config/src/configs/da_dispatcher.rs +++ b/core/lib/config/src/configs/da_dispatcher.rs @@ -2,9 +2,13 @@ use std::time::Duration; use serde::Deserialize; +/// The default interval between the `da_dispatcher's` iterations. pub const DEFAULT_POLLING_INTERVAL_MS: u32 = 5000; +/// The maximum number of rows to fetch from the database in a single query. pub const DEFAULT_MAX_ROWS_TO_DISPATCH: u32 = 3; +/// The maximum number of retries for the dispatch of a blob. pub const DEFAULT_MAX_RETRIES: u16 = 5; +/// Use dummy value as inclusion proof instead of getting it from the client. pub const DEFAULT_USE_DUMMY_INCLUSION_DATA: bool = false; #[derive(Debug, Clone, PartialEq, Deserialize)] diff --git a/core/lib/protobuf_config/src/da_client.rs b/core/lib/protobuf_config/src/da_client.rs index 7f220c1851a9..77d2965149fe 100644 --- a/core/lib/protobuf_config/src/da_client.rs +++ b/core/lib/protobuf_config/src/da_client.rs @@ -30,6 +30,7 @@ impl ProtoRepr for proto::DataAvailabilityClient { .context("api_node_url")? .clone(), app_id: *required(&full_client_conf.app_id).context("app_id")?, + finality_state: full_client_conf.finality_state.clone(), }) } Some(proto::avail_config::Config::GasRelay(gas_relay_conf)) => { @@ -77,6 +78,7 @@ impl ProtoRepr for proto::DataAvailabilityClient { proto::avail_config::Config::FullClient(proto::AvailClientConfig { api_node_url: Some(conf.api_node_url.clone()), app_id: Some(conf.app_id), + finality_state: conf.finality_state.clone(), }), ), AvailClientConfig::GasRelay(conf) => Some( diff --git a/core/lib/protobuf_config/src/proto/config/da_client.proto b/core/lib/protobuf_config/src/proto/config/da_client.proto index ecd61fbef628..9ad7527979e6 100644 --- a/core/lib/protobuf_config/src/proto/config/da_client.proto +++ b/core/lib/protobuf_config/src/proto/config/da_client.proto @@ -22,6 +22,7 @@ message AvailConfig { message AvailClientConfig { optional string api_node_url = 1; optional uint32 app_id = 2; + optional string finality_state = 3; } message AvailGasRelayConfig { diff --git a/core/node/da_clients/src/avail/client.rs b/core/node/da_clients/src/avail/client.rs index c0ead429d91a..115ad77bf44e 100644 --- a/core/node/da_clients/src/avail/client.rs +++ b/core/node/da_clients/src/avail/client.rs @@ -121,8 +121,12 @@ impl AvailClient { .seed_phrase .ok_or_else(|| anyhow::anyhow!("Seed phrase is missing"))?; // these unwraps are safe because we validate in protobuf config - let sdk_client = - RawAvailClient::new(conf.app_id, seed_phrase.0.expose_secret()).await?; + let sdk_client = RawAvailClient::new( + conf.app_id, + seed_phrase.0.expose_secret(), + conf.finality_state()?, + ) + .await?; Ok(Self { config, diff --git a/core/node/da_clients/src/avail/sdk.rs b/core/node/da_clients/src/avail/sdk.rs index 4eb81ed72879..8f28e797dc9a 100644 --- a/core/node/da_clients/src/avail/sdk.rs +++ b/core/node/da_clients/src/avail/sdk.rs @@ -21,13 +21,13 @@ use zksync_types::H256; use crate::utils::to_non_retriable_da_error; const PROTOCOL_VERSION: u8 = 4; -const FINALITY_STATE: &str = "inBlock"; /// An implementation of the `DataAvailabilityClient` trait that interacts with the Avail network. #[derive(Debug, Clone)] pub(crate) struct RawAvailClient { app_id: u32, keypair: Keypair, + finality_state: String, } /// Utility type needed for encoding the call data @@ -45,11 +45,19 @@ struct BoundedVec<_0>(pub Vec<_0>); impl RawAvailClient { pub(crate) const MAX_BLOB_SIZE: usize = 512 * 1024; // 512kb - pub(crate) async fn new(app_id: u32, seed: &str) -> anyhow::Result { + pub(crate) async fn new( + app_id: u32, + seed: &str, + finality_state: String, + ) -> anyhow::Result { let mnemonic = Mnemonic::parse(seed)?; let keypair = Keypair::from_phrase(&mnemonic, None)?; - Ok(Self { app_id, keypair }) + Ok(Self { + app_id, + keypair, + finality_state, + }) } /// Returns a hex-encoded extrinsic @@ -292,7 +300,7 @@ impl RawAvailClient { let status = sub.next().await.transpose()?; if status.is_some() && status.as_ref().unwrap().is_object() { - if let Some(block_hash) = status.unwrap().get(FINALITY_STATE) { + if let Some(block_hash) = status.unwrap().get(self.finality_state.as_str()) { break block_hash .as_str() .ok_or_else(|| anyhow::anyhow!("Invalid block hash"))? From 6d00fa234b60d8f255a4a6220394614865aa4d8a Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Tue, 7 Jan 2025 22:36:01 +0000 Subject: [PATCH 08/10] fix --- core/lib/config/src/configs/da_client/avail.rs | 2 +- core/lib/config/src/testonly.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/lib/config/src/configs/da_client/avail.rs b/core/lib/config/src/configs/da_client/avail.rs index 9b3ccf64bccb..7b7740999080 100644 --- a/core/lib/config/src/configs/da_client/avail.rs +++ b/core/lib/config/src/configs/da_client/avail.rs @@ -44,7 +44,7 @@ pub struct AvailSecrets { impl AvailDefaultConfig { pub fn finality_state(&self) -> anyhow::Result { match self.finality_state.clone() { - Some(finality_state) => match finality_state { + Some(finality_state) => match finality_state.as_str() { IN_BLOCK_FINALITY_STATE | FINALIZED_FINALITY_STATE => Ok(finality_state), _ => Err(anyhow::anyhow!( "Invalid finality state: {}. Supported values are: {}, {}", diff --git a/core/lib/config/src/testonly.rs b/core/lib/config/src/testonly.rs index f6ad6bd4dae8..3472cf4e7d0a 100644 --- a/core/lib/config/src/testonly.rs +++ b/core/lib/config/src/testonly.rs @@ -959,6 +959,7 @@ impl Distribution for EncodeDist { config: AvailClientConfig::FullClient(AvailDefaultConfig { api_node_url: self.sample(rng), app_id: self.sample(rng), + finality_state: None, }), }) } From 34c44408761484032c2d7ddfbab4be7efd78b3cb Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Tue, 7 Jan 2025 22:40:43 +0000 Subject: [PATCH 09/10] fix test --- core/lib/env_config/src/da_client.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/lib/env_config/src/da_client.rs b/core/lib/env_config/src/da_client.rs index 8ceeb215faf4..4bfce921dddc 100644 --- a/core/lib/env_config/src/da_client.rs +++ b/core/lib/env_config/src/da_client.rs @@ -146,6 +146,7 @@ mod tests { config: AvailClientConfig::FullClient(AvailDefaultConfig { api_node_url: api_node_url.to_string(), app_id, + finality_state: None, }), }) } From a5332683d46a7ac3ca6db1fcf88627fbab950748 Mon Sep 17 00:00:00 2001 From: dimazhornyk Date: Wed, 8 Jan 2025 09:10:21 +0000 Subject: [PATCH 10/10] improve comment --- core/lib/config/src/configs/da_dispatcher.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/lib/config/src/configs/da_dispatcher.rs b/core/lib/config/src/configs/da_dispatcher.rs index aeacc6c8b102..dfbd4d517b9d 100644 --- a/core/lib/config/src/configs/da_dispatcher.rs +++ b/core/lib/config/src/configs/da_dispatcher.rs @@ -4,7 +4,8 @@ use serde::Deserialize; /// The default interval between the `da_dispatcher's` iterations. pub const DEFAULT_POLLING_INTERVAL_MS: u32 = 5000; -/// The maximum number of rows to fetch from the database in a single query. +/// The maximum number of rows to fetch from the database in a single query. The value has to be +/// not too high to avoid the dispatcher iteration taking too much time. pub const DEFAULT_MAX_ROWS_TO_DISPATCH: u32 = 3; /// The maximum number of retries for the dispatch of a blob. pub const DEFAULT_MAX_RETRIES: u16 = 5;