From 30710f1ba86ad1fef00f473e16e589c6c2725129 Mon Sep 17 00:00:00 2001 From: Youngjoon Lee <5462944+youngjoon-lee@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:34:24 +0900 Subject: [PATCH 1/2] feat(chain): check remaining blocks in IBD to enable blob validation --- nodes/nomos-executor/config.yaml | 1 + nodes/nomos-node/config.yaml | 3 +- .../chain-service/src/bootstrap/config.rs | 4 + .../chain-service/src/bootstrap/download.rs | 61 +++++++++++---- .../chain/chain-service/src/bootstrap/ibd.rs | 78 +++++++++++++++---- .../chain-service/src/bootstrap/state.rs | 1 + nomos-services/chain/chain-service/src/lib.rs | 18 ++++- tests/src/nodes/executor.rs | 1 + tests/src/nodes/validator.rs | 1 + 9 files changed, 133 insertions(+), 35 deletions(-) diff --git a/nodes/nomos-executor/config.yaml b/nodes/nomos-executor/config.yaml index 699086cf6f..c9b032c3ac 100644 --- a/nodes/nomos-executor/config.yaml +++ b/nodes/nomos-executor/config.yaml @@ -252,6 +252,7 @@ cryptarchia: state_recording_interval: [ 60, 0 ] ibd: peers: [ ] + final_blocks_with_blob_validation: 8640 sync: orphan: max_orphan_cache_size: 5 diff --git a/nodes/nomos-node/config.yaml b/nodes/nomos-node/config.yaml index ed8d14555b..689270cfc5 100644 --- a/nodes/nomos-node/config.yaml +++ b/nodes/nomos-node/config.yaml @@ -241,6 +241,7 @@ cryptarchia: state_recording_interval: [ 60, 0 ] ibd: peers: [ ] + final_blocks_with_blob_validation: 8640 sync: orphan: max_orphan_cache_size: 5 @@ -261,4 +262,4 @@ membership: sdp: wallet: known_keys: - - "0000000000000000000000000000000000000000000000000000000000000000" \ No newline at end of file + - "0000000000000000000000000000000000000000000000000000000000000000" diff --git a/nomos-services/chain/chain-service/src/bootstrap/config.rs b/nomos-services/chain/chain-service/src/bootstrap/config.rs index 097fbd2beb..bb1995617a 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/config.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/config.rs @@ -1,5 +1,6 @@ use std::{collections::HashSet, hash::Hash, time::Duration}; +use cryptarchia_engine::Length; use nomos_utils::bounded_duration::{MinimalBoundedDuration, SECOND}; use serde::{Deserialize, Serialize}; use serde_with::serde_as; @@ -43,6 +44,9 @@ where /// when no download is needed at the moment from a peer. #[serde(default = "default_delay_before_new_download")] pub delay_before_new_download: Duration, + /// Threshold in number of remaining blocks to the target height + /// at which blob validation becomes enabled during IBD. + pub final_blocks_with_blob_validation: Length, } const fn default_offline_grace_period() -> Duration { diff --git a/nomos-services/chain/chain-service/src/bootstrap/download.rs b/nomos-services/chain/chain-service/src/bootstrap/download.rs index a5e09b0b42..4aede693a8 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/download.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/download.rs @@ -6,6 +6,7 @@ use std::{ time::Duration, }; +use cryptarchia_engine::Length; use cryptarchia_sync::HeaderId; use futures::{future::BoxFuture, stream::FuturesUnordered, Stream, StreamExt as _}; use overwatch::DynError; @@ -22,7 +23,7 @@ pub struct Downloads<'a, NodeId, Block> { /// [`Future`]s that read a single block from a [`Download`]. downloads: FuturesUnordered>>, /// A set of blocks that are being targeted by [`Self::downloads`]. - targets: HashSet, + targets: HashSet, /// [`Delay`] for peers that have no download needed at the moment. delays: FuturesUnordered>>, /// The duration of a delay. @@ -143,7 +144,7 @@ where })); } - pub const fn targets(&self) -> &HashSet { + pub const fn targets(&self) -> &HashSet { &self.targets } @@ -175,7 +176,7 @@ pub enum DownloadsOutput { pub struct Download { peer: NodeId, /// The target block this download aims to reach. - target: HeaderId, + target: Target, /// A stream of blocks that may continue up to [`Self::target`]. stream: BoxedStream>, /// The last block that was read from [`Self::stream`]. @@ -183,10 +184,30 @@ pub struct Download { last: Option, } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct Target { + id: HeaderId, + height: Length, +} + +impl Target { + pub const fn new(id: HeaderId, height: Length) -> Self { + Self { id, height } + } + + pub const fn id(&self) -> HeaderId { + self.id + } + + pub const fn height(&self) -> Length { + self.height + } +} + impl Download { pub fn new( peer: NodeId, - target: HeaderId, + target: Target, stream: BoxedStream>, ) -> Self { Self { @@ -204,6 +225,10 @@ impl Download { pub const fn last(&self) -> Option { self.last } + + pub const fn target(&self) -> Target { + self.target + } } impl Stream for Download @@ -216,7 +241,7 @@ where fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { // Check if the target block has already been reached. if let Some(last) = self.last { - if last == self.target { + if last == self.target.id() { return Poll::Ready(None); } } @@ -284,7 +309,7 @@ mod tests { #[tokio::test] async fn download_empty_stream() { let peer: TestNodeId = 1; - let target = header_id(1); + let target = Target::new(header_id(1), 1u64.into()); let stream = block_stream(vec![]); let mut download = Download::new(peer, target, stream); @@ -294,7 +319,7 @@ mod tests { #[tokio::test] async fn download_blocks_until_target() { let peer: TestNodeId = 1; - let target = header_id(3); + let target = Target::new(header_id(3), 3u64.into()); let stream = block_stream(vec![ Ok((header_id(1), 100)), Ok((header_id(2), 200)), @@ -329,7 +354,7 @@ mod tests { #[tokio::test] async fn download_blocks_if_no_target_in_stream() { let peer: TestNodeId = 1; - let target = header_id(4); + let target = Target::new(header_id(4), 4u64.into()); let stream = block_stream(vec![ Ok((header_id(1), 100)), Ok((header_id(2), 200)), @@ -356,7 +381,7 @@ mod tests { #[tokio::test] async fn download_with_error() { let peer: TestNodeId = 1; - let target = header_id(3); + let target = Target::new(header_id(3), 3u64.into()); let stream = block_stream(vec![ Ok((header_id(1), 100)), Err(DynError::from("test error")), @@ -377,7 +402,7 @@ mod tests { #[tokio::test] async fn add_single_download() { let mut downloads = Downloads::new(Duration::from_millis(1)); - let target = header_id(2); + let target = Target::new(header_id(2), 2u64.into()); let download = Download::new( 1, target, @@ -431,7 +456,7 @@ mod tests { #[tokio::test] async fn add_single_download_with_error() { let mut downloads = Downloads::new(Duration::from_millis(1)); - let target = header_id(2); + let target = Target::new(header_id(2), 2u64.into()); let download = Download::new( 1, target, @@ -477,12 +502,12 @@ mod tests { // Download 1: Single block let peer1: TestNodeId = 1; - let target1 = header_id(1); + let target1 = Target::new(header_id(1), 1u64.into()); let download1 = Download::new(peer1, target1, block_stream(vec![Ok((header_id(1), 100))])); // Download 2: Two blocks let peer2: TestNodeId = 2; - let target2 = header_id(3); + let target2 = Target::new(header_id(3), 2u64.into()); let download2 = Download::new( peer2, target2, @@ -566,7 +591,7 @@ mod tests { // Download 1 let peer1: TestNodeId = 1; - let target = header_id(1); + let target = Target::new(header_id(1), 1u64.into()); let download1 = Download::new(peer1, target, block_stream(vec![Ok((header_id(1), 100))])); // Download 2: with the same target @@ -616,7 +641,11 @@ mod tests { // Add a download for peer1 let peer1: TestNodeId = 1; // An empty stream for simplicity - let download = Download::new(peer1, header_id(1), block_stream(vec![])); + let download = Download::new( + peer1, + Target::new(header_id(1), 1u64.into()), + block_stream(vec![]), + ); downloads.add_download(download); // Add a delay for peer2 @@ -644,7 +673,7 @@ mod tests { // An empty stream for simplicity let download = Download::new( peer1, - header_id(1), + Target::new(header_id(1), 1u64.into()), slow_block_stream(vec![Ok((header_id(1), 100))], Duration::from_secs(2)), ); downloads.add_download(download); diff --git a/nomos-services/chain/chain-service/src/bootstrap/ibd.rs b/nomos-services/chain/chain-service/src/bootstrap/ibd.rs index 370e3cb85d..6cd9d2fa00 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/ibd.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/ibd.rs @@ -1,5 +1,6 @@ use std::{collections::HashSet, fmt::Debug, future::Future, hash::Hash, marker::PhantomData}; +use cryptarchia_engine::Length; use cryptarchia_sync::GetTipResponse; use futures::StreamExt as _; use nomos_core::header::HeaderId; @@ -7,7 +8,8 @@ use overwatch::DynError; use tracing::{debug, error}; use crate::{ - bootstrap::download::{Delay, Download, Downloads, DownloadsOutput}, + blob::{BlobValidation, SkipBlobValidation}, + bootstrap::download::{Delay, Download, Downloads, DownloadsOutput, Target}, network::NetworkAdapter, Cryptarchia, Error as ChainError, IbdConfig, }; @@ -19,7 +21,8 @@ pub struct InitialBlockDownload, NetAdapter::PeerId: Clone + Eq + Hash, - ProcessBlockFn: Fn(Cryptarchia, HashSet, NetAdapter::Block) -> ProcessBlockFut, + ProcessBlockFn: + Fn(Cryptarchia, HashSet, NetAdapter::Block, Target) -> ProcessBlockFut, ProcessBlockFut: Future), Error>>, { config: IbdConfig, @@ -33,7 +36,8 @@ impl where NetAdapter: NetworkAdapter, NetAdapter::PeerId: Clone + Eq + Hash, - ProcessBlockFn: Fn(Cryptarchia, HashSet, NetAdapter::Block) -> ProcessBlockFut, + ProcessBlockFn: + Fn(Cryptarchia, HashSet, NetAdapter::Block, Target) -> ProcessBlockFut, ProcessBlockFut: Future), Error>>, { pub const fn new( @@ -56,8 +60,9 @@ where NetAdapter: NetworkAdapter + Send + Sync, NetAdapter::PeerId: Copy + Clone + Eq + Hash + Debug + Send + Sync + Unpin, NetAdapter::Block: Debug + Unpin, - ProcessBlockFn: - Fn(Cryptarchia, HashSet, NetAdapter::Block) -> ProcessBlockFut + Send + Sync, + ProcessBlockFn: Fn(Cryptarchia, HashSet, NetAdapter::Block, Target) -> ProcessBlockFut + + Send + + Sync, ProcessBlockFut: Future), Error>> + Send, RuntimeServiceId: Sync, { @@ -133,7 +138,7 @@ where peer: NetAdapter::PeerId, latest_downloaded_block: Option, cryptarchia: &Cryptarchia, - targets_in_progress: &HashSet, + targets_in_progress: &HashSet, ) -> Result>, Error> { // Get the most recent peer's tip. let tip_response = self @@ -144,7 +149,7 @@ where // Use the peer's tip as the target for the download. let target = match tip_response { - GetTipResponse::Tip { tip, .. } => tip, + GetTipResponse::Tip { tip, height, .. } => Target::new(tip, height), GetTipResponse::Failure(reason) => { return Err(Error::BlockProvider(DynError::from(reason))); } @@ -159,7 +164,7 @@ where .network .request_blocks_from_peer( peer, - target, + target.id(), cryptarchia.tip(), cryptarchia.lib(), latest_downloaded_block.map_or_else(HashSet::new, |id| HashSet::from([id])), @@ -171,11 +176,11 @@ where } fn should_download( - target: &HeaderId, + target: &Target, cryptarchia: &Cryptarchia, - targets_in_progress: &HashSet, + targets_in_progress: &HashSet, ) -> bool { - cryptarchia.consensus.branches().get(target).is_none() + cryptarchia.consensus.branches().get(&target.id()).is_none() && !targets_in_progress.contains(target) } @@ -225,6 +230,7 @@ where cryptarchia.clone(), storage_blocks_to_remove.clone(), block, + download.target(), ) .await; match process_block_result { @@ -311,10 +317,54 @@ where } } +#[expect( + clippy::if_same_then_else, + reason = "will be resolved by using historic sampling" +)] +pub fn determine_blob_validation( + parent: HeaderId, + target: Target, + cryptarchia: &Cryptarchia, + final_blocks_with_blob_validation: Length, +) -> Result + Send + Sync>, Error> { + if depth_from_target(parent, target, cryptarchia)? <= final_blocks_with_blob_validation { + Ok(Box::new(SkipBlobValidation)) // TODO: use historic sampling: https://github.com/logos-co/nomos/issues/1675 + } else { + Ok(Box::new(SkipBlobValidation)) + } +} + +pub fn depth_from_target( + parent: HeaderId, + target: Target, + cryptarchia: &Cryptarchia, +) -> Result { + let parent_height = cryptarchia + .consensus + .branches() + .get(&parent) + .ok_or(Error::ParentNotFound(parent))? + .length(); + let height = parent_height + .checked_add(1u64.into()) + .expect("Height shouldn't be overflown"); + target + .height() + .checked_sub(height) + .ok_or(Error::ReceivedBlockIsHigherThanTarget { + received: height, + target: target.height(), + }) +} + #[derive(Debug, thiserror::Error)] pub enum Error { #[error("Block provider error: {0}")] BlockProvider(DynError), + #[error("Parent block not found: {0}")] + ParentNotFound(HeaderId), + #[error("Received block height({received}) is higher than the target height({target})")] + ReceivedBlockIsHigherThanTarget { received: Length, target: Length }, #[error("All peers failed")] AllPeersFailed, #[error("Block processing failed: {0}")] @@ -325,7 +375,7 @@ pub enum Error { mod tests { use std::{collections::HashMap, iter::empty, num::NonZero}; - use cryptarchia_engine::{EpochConfig, Length, Slot}; + use cryptarchia_engine::{EpochConfig, Slot}; use nomos_core::sdp::{MinStake, ServiceParameters}; use nomos_ledger::LedgerState; use nomos_network::{backends::NetworkBackend, message::ChainSyncEvent, NetworkService}; @@ -652,8 +702,6 @@ mod tests { // All blocks from peer1 that provided valid blocks // should be added to the local chain. assert!(peer1.chain.iter().all(|b| contain(b, &cryptarchia))); - // The local tip should be the same as peer1's tip. - assert_eq!(cryptarchia.tip(), peer1.tip.unwrap().id); // Blocks from peer0 remain in the local chain only until // right before the failure. @@ -708,6 +756,7 @@ mod tests { mut cryptarchia: Cryptarchia, storage_blocks_to_remove: HashSet, block: Block, + _: Target, ) -> Result<(Cryptarchia, HashSet), Error> { // Add the block only to the consensus, not to the ledger state // because the mocked block doesn't have a proof. @@ -731,6 +780,7 @@ mod tests { IbdConfig { peers, delay_before_new_download: std::time::Duration::from_millis(1), + final_blocks_with_blob_validation: 2u64.into(), } } diff --git a/nomos-services/chain/chain-service/src/bootstrap/state.rs b/nomos-services/chain/chain-service/src/bootstrap/state.rs index b72d3002f5..cf96ec84a3 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/state.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/state.rs @@ -136,6 +136,7 @@ mod tests { ibd: IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_millis(1), + final_blocks_with_blob_validation: 2u64.into(), }, } } diff --git a/nomos-services/chain/chain-service/src/lib.rs b/nomos-services/chain/chain-service/src/lib.rs index fba27a7695..b012a6385f 100644 --- a/nomos-services/chain/chain-service/src/lib.rs +++ b/nomos-services/chain/chain-service/src/lib.rs @@ -637,21 +637,31 @@ where // It needs to be replaced with a trait, which requires substantial // refactoring. https://github.com/logos-co/nomos/issues/1505 let initial_block_download = InitialBlockDownload::new( - bootstrap_config.ibd, + bootstrap_config.ibd.clone(), network_adapter, - |cryptarchia, storage_blocks_to_remove, block| { + |cryptarchia, storage_blocks_to_remove, block, target| { let leader = &leader; let relays = &relays; let state_updater = &self.service_resources_handle.state_updater; let new_block_subscription_sender = &self.new_block_subscription_sender; let lib_subscription_sender = &self.lib_subscription_sender; async move { + let blob_validation = + ibd::determine_blob_validation::( + block.header().parent(), + target, + &cryptarchia, + bootstrap_config.ibd.final_blocks_with_blob_validation, + ) + .inspect_err(|e| { + error!("Failed to determine blob validation during IBD: {e:?}"); + })?; + Self::process_block_and_update_state( cryptarchia, leader, block, - // TODO: Enable this once entering DA window: https://github.com/logos-co/nomos/issues/1675 - &SkipBlobValidation, + blob_validation.as_ref(), &storage_blocks_to_remove, relays, new_block_subscription_sender, diff --git a/tests/src/nodes/executor.rs b/tests/src/nodes/executor.rs index 3743b1432e..4c91fe8b75 100644 --- a/tests/src/nodes/executor.rs +++ b/tests/src/nodes/executor.rs @@ -449,6 +449,7 @@ pub fn create_executor_config(config: GeneralConfig) -> Config { ibd: chain_service::IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_secs(10), + final_blocks_with_blob_validation: 8640u64.into(), }, }, sync: SyncConfig { diff --git a/tests/src/nodes/validator.rs b/tests/src/nodes/validator.rs index 47ed53c113..c3212b8d59 100644 --- a/tests/src/nodes/validator.rs +++ b/tests/src/nodes/validator.rs @@ -475,6 +475,7 @@ pub fn create_validator_config(config: GeneralConfig) -> Config { ibd: chain_service::IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_secs(10), + final_blocks_with_blob_validation: 8640u64.into(), }, }, sync: SyncConfig { From 558c76d5ebe82302c474a610e76ae01f8c5863cb Mon Sep 17 00:00:00 2001 From: Youngjoon Lee <5462944+youngjoon-lee@users.noreply.github.com> Date: Tue, 23 Sep 2025 15:12:11 +0900 Subject: [PATCH 2/2] rename param: final_blocks_.. -> last_blocks_... --- nodes/nomos-executor/config.yaml | 2 +- nodes/nomos-node/config.yaml | 2 +- nomos-services/chain/chain-service/src/bootstrap/config.rs | 2 +- nomos-services/chain/chain-service/src/bootstrap/ibd.rs | 6 +++--- nomos-services/chain/chain-service/src/bootstrap/state.rs | 2 +- nomos-services/chain/chain-service/src/lib.rs | 2 +- tests/src/nodes/executor.rs | 2 +- tests/src/nodes/validator.rs | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/nodes/nomos-executor/config.yaml b/nodes/nomos-executor/config.yaml index c9b032c3ac..fc9ba5a1ae 100644 --- a/nodes/nomos-executor/config.yaml +++ b/nodes/nomos-executor/config.yaml @@ -252,7 +252,7 @@ cryptarchia: state_recording_interval: [ 60, 0 ] ibd: peers: [ ] - final_blocks_with_blob_validation: 8640 + last_blocks_with_blob_validation: 8640 sync: orphan: max_orphan_cache_size: 5 diff --git a/nodes/nomos-node/config.yaml b/nodes/nomos-node/config.yaml index 689270cfc5..700a69346c 100644 --- a/nodes/nomos-node/config.yaml +++ b/nodes/nomos-node/config.yaml @@ -241,7 +241,7 @@ cryptarchia: state_recording_interval: [ 60, 0 ] ibd: peers: [ ] - final_blocks_with_blob_validation: 8640 + last_blocks_with_blob_validation: 8640 sync: orphan: max_orphan_cache_size: 5 diff --git a/nomos-services/chain/chain-service/src/bootstrap/config.rs b/nomos-services/chain/chain-service/src/bootstrap/config.rs index bb1995617a..28b529e681 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/config.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/config.rs @@ -46,7 +46,7 @@ where pub delay_before_new_download: Duration, /// Threshold in number of remaining blocks to the target height /// at which blob validation becomes enabled during IBD. - pub final_blocks_with_blob_validation: Length, + pub last_blocks_with_blob_validation: Length, } const fn default_offline_grace_period() -> Duration { diff --git a/nomos-services/chain/chain-service/src/bootstrap/ibd.rs b/nomos-services/chain/chain-service/src/bootstrap/ibd.rs index 6cd9d2fa00..7968a28e73 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/ibd.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/ibd.rs @@ -325,9 +325,9 @@ pub fn determine_blob_validation( parent: HeaderId, target: Target, cryptarchia: &Cryptarchia, - final_blocks_with_blob_validation: Length, + last_blocks_with_blob_validation: Length, ) -> Result + Send + Sync>, Error> { - if depth_from_target(parent, target, cryptarchia)? <= final_blocks_with_blob_validation { + if depth_from_target(parent, target, cryptarchia)? <= last_blocks_with_blob_validation { Ok(Box::new(SkipBlobValidation)) // TODO: use historic sampling: https://github.com/logos-co/nomos/issues/1675 } else { Ok(Box::new(SkipBlobValidation)) @@ -780,7 +780,7 @@ mod tests { IbdConfig { peers, delay_before_new_download: std::time::Duration::from_millis(1), - final_blocks_with_blob_validation: 2u64.into(), + last_blocks_with_blob_validation: 2u64.into(), } } diff --git a/nomos-services/chain/chain-service/src/bootstrap/state.rs b/nomos-services/chain/chain-service/src/bootstrap/state.rs index cf96ec84a3..320c123983 100644 --- a/nomos-services/chain/chain-service/src/bootstrap/state.rs +++ b/nomos-services/chain/chain-service/src/bootstrap/state.rs @@ -136,7 +136,7 @@ mod tests { ibd: IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_millis(1), - final_blocks_with_blob_validation: 2u64.into(), + last_blocks_with_blob_validation: 2u64.into(), }, } } diff --git a/nomos-services/chain/chain-service/src/lib.rs b/nomos-services/chain/chain-service/src/lib.rs index b012a6385f..acb52ab3cc 100644 --- a/nomos-services/chain/chain-service/src/lib.rs +++ b/nomos-services/chain/chain-service/src/lib.rs @@ -651,7 +651,7 @@ where block.header().parent(), target, &cryptarchia, - bootstrap_config.ibd.final_blocks_with_blob_validation, + bootstrap_config.ibd.last_blocks_with_blob_validation, ) .inspect_err(|e| { error!("Failed to determine blob validation during IBD: {e:?}"); diff --git a/tests/src/nodes/executor.rs b/tests/src/nodes/executor.rs index 4c91fe8b75..333b8163b6 100644 --- a/tests/src/nodes/executor.rs +++ b/tests/src/nodes/executor.rs @@ -449,7 +449,7 @@ pub fn create_executor_config(config: GeneralConfig) -> Config { ibd: chain_service::IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_secs(10), - final_blocks_with_blob_validation: 8640u64.into(), + last_blocks_with_blob_validation: 8640u64.into(), }, }, sync: SyncConfig { diff --git a/tests/src/nodes/validator.rs b/tests/src/nodes/validator.rs index c3212b8d59..d957b05fa3 100644 --- a/tests/src/nodes/validator.rs +++ b/tests/src/nodes/validator.rs @@ -475,7 +475,7 @@ pub fn create_validator_config(config: GeneralConfig) -> Config { ibd: chain_service::IbdConfig { peers: HashSet::new(), delay_before_new_download: Duration::from_secs(10), - final_blocks_with_blob_validation: 8640u64.into(), + last_blocks_with_blob_validation: 8640u64.into(), }, }, sync: SyncConfig {