From f2b94623ec82051cc88f42389059243e5143290a Mon Sep 17 00:00:00 2001 From: Morty Date: Thu, 26 Jun 2025 18:15:26 +0800 Subject: [PATCH 1/7] feat: add flag to disable tx broadcast & receive --- crates/net/network/src/config.rs | 14 +++++++ crates/net/network/src/manager.rs | 4 ++ crates/net/network/src/network.rs | 20 ++++++++++ crates/net/network/src/transactions/mod.rs | 12 +++--- crates/scroll/node/src/builder/network.rs | 46 ++++++++++++++++++---- crates/scroll/node/src/node.rs | 14 +++++-- 6 files changed, 93 insertions(+), 17 deletions(-) diff --git a/crates/net/network/src/config.rs b/crates/net/network/src/config.rs index aee5dce37fb..7045ef2d8d0 100644 --- a/crates/net/network/src/config.rs +++ b/crates/net/network/src/config.rs @@ -82,6 +82,10 @@ pub struct NetworkConfig { pub extra_protocols: RlpxSubProtocols, /// Whether to disable transaction gossip pub tx_gossip_disabled: bool, + /// Whether to disable transaction broadcast + pub tx_gossip_broadcast_disabled: bool, + /// Whether to disable transaction receive + pub tx_gossip_receive_disabled: bool, /// How to instantiate transactions manager. pub transactions_manager_config: TransactionsManagerConfig, /// The NAT resolver for external IP @@ -211,6 +215,10 @@ pub struct NetworkConfigBuilder { head: Option, /// Whether tx gossip is disabled tx_gossip_disabled: bool, + /// Whether to disable transaction broadcast + tx_gossip_broadcast_disabled: bool, + /// Whether to disable transaction receiving + tx_gossip_receive_disabled: bool, /// The block importer type block_import: Option>>, /// How to instantiate transactions manager. @@ -258,6 +266,8 @@ impl NetworkConfigBuilder { extra_protocols: Default::default(), head: None, tx_gossip_disabled: false, + tx_gossip_broadcast_disabled: false, + tx_gossip_receive_disabled: false, block_import: None, transactions_manager_config: Default::default(), nat: None, @@ -608,6 +618,8 @@ impl NetworkConfigBuilder { extra_protocols, head, tx_gossip_disabled, + tx_gossip_broadcast_disabled, + tx_gossip_receive_disabled, block_import, transactions_manager_config, nat, @@ -678,6 +690,8 @@ impl NetworkConfigBuilder { extra_protocols, fork_filter, tx_gossip_disabled, + tx_gossip_broadcast_disabled, + tx_gossip_receive_disabled, transactions_manager_config, nat, handshake, diff --git a/crates/net/network/src/manager.rs b/crates/net/network/src/manager.rs index d2ce957614e..8df7aba470d 100644 --- a/crates/net/network/src/manager.rs +++ b/crates/net/network/src/manager.rs @@ -249,6 +249,8 @@ impl NetworkManager { dns_discovery_config, extra_protocols, tx_gossip_disabled, + tx_gossip_broadcast_disabled, + tx_gossip_receive_disabled, transactions_manager_config: _, nat, handshake, @@ -333,6 +335,8 @@ impl NetworkManager { network_mode, Arc::new(AtomicU64::new(chain_id)), tx_gossip_disabled, + tx_gossip_broadcast_disabled, + tx_gossip_receive_disabled, discv4, discv5, event_sender.clone(), diff --git a/crates/net/network/src/network.rs b/crates/net/network/src/network.rs index ffe8bf1531f..fdba1de9a52 100644 --- a/crates/net/network/src/network.rs +++ b/crates/net/network/src/network.rs @@ -63,6 +63,8 @@ impl NetworkHandle { network_mode: NetworkMode, chain_id: Arc, tx_gossip_disabled: bool, + tx_gossip_broadcast_disabled: bool, + tx_gossip_receive_disabled: bool, discv4: Option, discv5: Option, event_sender: EventSender>>, @@ -80,6 +82,8 @@ impl NetworkHandle { initial_sync_done: Arc::new(AtomicBool::new(false)), chain_id, tx_gossip_disabled, + tx_gossip_broadcast_disabled, + tx_gossip_receive_disabled, discv4, discv5, event_sender, @@ -191,6 +195,18 @@ impl NetworkHandle { self.inner.tx_gossip_disabled } + /// Whether tx gossip broadcast is disabled + #[allow(clippy::missing_const_for_fn)] + pub fn tx_gossip_broadcast_disabled(&self) -> bool { + self.inner.tx_gossip_broadcast_disabled + } + + /// Whether tx gossip receiving is disabled + #[allow(clippy::missing_const_for_fn)] + pub fn tx_gossip_receive_disabled(&self) -> bool { + self.inner.tx_gossip_receive_disabled + } + /// Returns the secret key used for authenticating sessions. #[allow(clippy::missing_const_for_fn)] pub fn secret_key(&self) -> &SecretKey { @@ -474,6 +490,10 @@ struct NetworkInner { chain_id: Arc, /// Whether to disable transaction gossip tx_gossip_disabled: bool, + /// Whether to disable transaction broadcast + tx_gossip_broadcast_disabled: bool, + /// Whether to disable transaction receive + tx_gossip_receive_disabled: bool, /// The instance of the discv4 service discv4: Option, /// The instance of the discv5 service diff --git a/crates/net/network/src/transactions/mod.rs b/crates/net/network/src/transactions/mod.rs index 0fdee4a915f..23cd6292a8d 100644 --- a/crates/net/network/src/transactions/mod.rs +++ b/crates/net/network/src/transactions/mod.rs @@ -550,7 +550,7 @@ impl if self.network.is_initially_syncing() { return } - if self.network.tx_gossip_disabled() { + if self.network.tx_gossip_disabled() || self.network.tx_gossip_receive_disabled() { return } @@ -822,7 +822,7 @@ where if self.network.is_initially_syncing() { return } - if self.network.tx_gossip_disabled() { + if self.network.tx_gossip_disabled() || self.network.tx_gossip_broadcast_disabled() { return } @@ -981,7 +981,7 @@ where propagation_mode: PropagationMode, ) -> PropagatedTransactions { let mut propagated = PropagatedTransactions::default(); - if self.network.tx_gossip_disabled() { + if self.network.tx_gossip_disabled() || self.network.tx_gossip_broadcast_disabled() { return propagated } @@ -1089,7 +1089,7 @@ where response: oneshot::Sender>>, ) { if let Some(peer) = self.peers.get_mut(&peer_id) { - if self.network.tx_gossip_disabled() { + if self.network.tx_gossip_disabled() || self.network.tx_gossip_broadcast_disabled() { let _ = response.send(Ok(PooledTransactions::default())); return } @@ -1184,7 +1184,7 @@ where // Send a `NewPooledTransactionHashes` to the peer with up to // `SOFT_LIMIT_COUNT_HASHES_IN_NEW_POOLED_TRANSACTIONS_BROADCAST_MESSAGE` // transactions in the pool. - if self.network.is_initially_syncing() || self.network.tx_gossip_disabled() { + if self.network.is_initially_syncing() || self.network.tx_gossip_disabled() || self.network.tx_gossip_broadcast_disabled() { trace!(target: "net::tx", ?peer_id, "Skipping transaction broadcast: node syncing or gossip disabled"); return } @@ -1288,7 +1288,7 @@ where if self.network.is_initially_syncing() { return } - if self.network.tx_gossip_disabled() { + if self.network.tx_gossip_disabled() || self.network.tx_gossip_receive_disabled() { return } diff --git a/crates/scroll/node/src/builder/network.rs b/crates/scroll/node/src/builder/network.rs index c69adf6ca27..7bcfffbc8be 100644 --- a/crates/scroll/node/src/builder/network.rs +++ b/crates/scroll/node/src/builder/network.rs @@ -16,7 +16,43 @@ use std::fmt::Debug; /// The network builder for Scroll. #[derive(Debug, Default, Clone, Copy)] -pub struct ScrollNetworkBuilder; +pub struct ScrollNetworkBuilder { + /// Disable transaction pool broadcast + pub disable_txpool_broadcast: bool, + /// Disable transaction pool receive + pub disable_txpool_receive: bool, +}; + +impl ScrollNetworkBuilder { + /// Returns the [`NetworkConfig`] that contains the settings to launch the p2p network. + /// + /// This applies the configured [`ScrollNetworkBuilder`] settings. + pub fn network_config( + &self, + ctx: &BuilderContext, + ) -> eyre::Result::Provider, ScrollNetworkPrimitives>> + where + Node: + FullNodeTypes>, + { + let Self { disable_txpool_broadcast, disable_txpool_receive } = self.clone(); + // set the network mode to work. + let config = ctx.network_config()?; + + let network_config = NetworkConfig { + network_mode: NetworkMode::Work, + header_transform: Box::new(transform), + // When `sequencer_endpoint` is configured, the node will forward all transactions to a + // Sequencer node for execution and inclusion on L1, and disable its own txpool + // gossip broadcast/receive to prevent other parties in the network from learning about them. + tx_gossip_broadcast_disabled: disable_txpool_broadcast, + tx_gossip_receive_disabled: disable_txpool_receive, + ..config + }; + + Ok(network_config) + } +} impl NetworkBuilder for ScrollNetworkBuilder where @@ -41,13 +77,7 @@ where let chain_spec = ctx.chain_spec(); let transform = ScrollHeaderTransform { chain_spec }; - // set the network mode to work. - let config = ctx.network_config()?; - let config = NetworkConfig { - network_mode: NetworkMode::Work, - header_transform: Box::new(transform), - ..config - }; + let config = self::network_config(ctx); let network = NetworkManager::builder(config).await?; let handle = ctx.start_network(network, pool); diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index 7e1da81bfef..9556b03c7ec 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -16,11 +16,16 @@ use reth_trie_db::MerklePatriciaTrie; /// The Scroll node implementation. #[derive(Clone, Debug, Default)] -pub struct ScrollNode; +pub struct ScrollNode { + /// A bool that represents if the transaction broadcast should be disabled. + pub disable_tx_broadcast: bool, + /// A bool that represents if the transaction receiving should be disabled. + pub disable_tx_receive: bool, +}; impl ScrollNode { /// Returns a [`ComponentsBuilder`] configured for a regular Ethereum node. - pub fn components() -> ComponentsBuilder< + pub fn components(disable_txpool_broadcast: bool, disable_txpool_receive: bool) -> ComponentsBuilder< Node, ScrollPoolBuilder, BasicPayloadServiceBuilder, @@ -42,7 +47,10 @@ impl ScrollNode { .pool(ScrollPoolBuilder::default()) .executor(ScrollExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new(ScrollPayloadBuilderBuilder::default())) - .network(ScrollNetworkBuilder) + .network(ScrollNetworkBuilder { + disable_txpool_broadcast: self::disable_txpool_broadcast, + disable_txpool_receive: self::disable_txpool_receive, + }) .executor(ScrollExecutorBuilder) .consensus(ScrollConsensusBuilder) } From 5a064a003b97a76e0afcd6f98cbb2f6ed5806296 Mon Sep 17 00:00:00 2001 From: Morty Date: Mon, 30 Jun 2025 06:59:16 +0800 Subject: [PATCH 2/7] fix compile --- crates/scroll/node/src/builder/network.rs | 2 +- crates/scroll/node/src/node.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/scroll/node/src/builder/network.rs b/crates/scroll/node/src/builder/network.rs index 7bcfffbc8be..578a37b4f1a 100644 --- a/crates/scroll/node/src/builder/network.rs +++ b/crates/scroll/node/src/builder/network.rs @@ -21,7 +21,7 @@ pub struct ScrollNetworkBuilder { pub disable_txpool_broadcast: bool, /// Disable transaction pool receive pub disable_txpool_receive: bool, -}; +} impl ScrollNetworkBuilder { /// Returns the [`NetworkConfig`] that contains the settings to launch the p2p network. diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index 9556b03c7ec..d81a32c4e34 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -21,11 +21,11 @@ pub struct ScrollNode { pub disable_tx_broadcast: bool, /// A bool that represents if the transaction receiving should be disabled. pub disable_tx_receive: bool, -}; +} impl ScrollNode { /// Returns a [`ComponentsBuilder`] configured for a regular Ethereum node. - pub fn components(disable_txpool_broadcast: bool, disable_txpool_receive: bool) -> ComponentsBuilder< + pub fn components() -> ComponentsBuilder< Node, ScrollPoolBuilder, BasicPayloadServiceBuilder, From 93cf644ad9bb884cfa0f8d4f56164c733118757e Mon Sep 17 00:00:00 2001 From: Morty Date: Mon, 30 Jun 2025 07:06:26 +0800 Subject: [PATCH 3/7] fix compile --- crates/scroll/node/src/node.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index d81a32c4e34..439859684b1 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -25,7 +25,7 @@ pub struct ScrollNode { impl ScrollNode { /// Returns a [`ComponentsBuilder`] configured for a regular Ethereum node. - pub fn components() -> ComponentsBuilder< + pub fn components(&self) -> ComponentsBuilder< Node, ScrollPoolBuilder, BasicPayloadServiceBuilder, @@ -48,8 +48,8 @@ impl ScrollNode { .executor(ScrollExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new(ScrollPayloadBuilderBuilder::default())) .network(ScrollNetworkBuilder { - disable_txpool_broadcast: self::disable_txpool_broadcast, - disable_txpool_receive: self::disable_txpool_receive, + disable_txpool_broadcast: self.disable_txpool_broadcast, + disable_txpool_receive: self.disable_txpool_receive, }) .executor(ScrollExecutorBuilder) .consensus(ScrollConsensusBuilder) @@ -74,7 +74,7 @@ where >; fn components_builder(&self) -> Self::ComponentsBuilder { - Self::components() + Self::components(self) } fn add_ons(&self) -> Self::AddOns { From e7bb1dbe43c53245959ab6303e4abb5d1cc1cce0 Mon Sep 17 00:00:00 2001 From: Morty Date: Tue, 1 Jul 2025 03:34:32 +0800 Subject: [PATCH 4/7] fix: unwarp issue --- crates/scroll/node/src/builder/network.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/scroll/node/src/builder/network.rs b/crates/scroll/node/src/builder/network.rs index 578a37b4f1a..7dd54c0887c 100644 --- a/crates/scroll/node/src/builder/network.rs +++ b/crates/scroll/node/src/builder/network.rs @@ -36,9 +36,14 @@ impl ScrollNetworkBuilder { FullNodeTypes>, { let Self { disable_txpool_broadcast, disable_txpool_receive } = self.clone(); - // set the network mode to work. + + // get the header transform. + let chain_spec = ctx.chain_spec(); + let transform = ScrollHeaderTransform { chain_spec }; + let config = ctx.network_config()?; + // set the network mode to work. let network_config = NetworkConfig { network_mode: NetworkMode::Work, header_transform: Box::new(transform), @@ -73,12 +78,7 @@ where ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { - // get the header transform. - let chain_spec = ctx.chain_spec(); - let transform = ScrollHeaderTransform { chain_spec }; - - let config = self::network_config(ctx); - + let config = self::network_config(ctx)?; let network = NetworkManager::builder(config).await?; let handle = ctx.start_network(network, pool); info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized"); From 18e0db6a5f80ffb66a290b683eda20296fa12e01 Mon Sep 17 00:00:00 2001 From: Morty Date: Sat, 5 Jul 2025 01:28:10 +0800 Subject: [PATCH 5/7] refactor: remove fields on ScrollNode --- crates/scroll/node/src/node.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index 439859684b1..0004f3375a4 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -16,16 +16,11 @@ use reth_trie_db::MerklePatriciaTrie; /// The Scroll node implementation. #[derive(Clone, Debug, Default)] -pub struct ScrollNode { - /// A bool that represents if the transaction broadcast should be disabled. - pub disable_tx_broadcast: bool, - /// A bool that represents if the transaction receiving should be disabled. - pub disable_tx_receive: bool, -} +pub struct ScrollNode; impl ScrollNode { /// Returns a [`ComponentsBuilder`] configured for a regular Ethereum node. - pub fn components(&self) -> ComponentsBuilder< + pub fn components() -> ComponentsBuilder< Node, ScrollPoolBuilder, BasicPayloadServiceBuilder, @@ -74,7 +69,7 @@ where >; fn components_builder(&self) -> Self::ComponentsBuilder { - Self::components(self) + Self::components() } fn add_ons(&self) -> Self::AddOns { From 3c4e04bcc54f4333015255b8614f3f538ddbf004 Mon Sep 17 00:00:00 2001 From: Morty Date: Mon, 7 Jul 2025 19:23:58 +0800 Subject: [PATCH 6/7] fix: comment --- crates/scroll/node/src/node.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index 0004f3375a4..73c29dc25e8 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -42,10 +42,7 @@ impl ScrollNode { .pool(ScrollPoolBuilder::default()) .executor(ScrollExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new(ScrollPayloadBuilderBuilder::default())) - .network(ScrollNetworkBuilder { - disable_txpool_broadcast: self.disable_txpool_broadcast, - disable_txpool_receive: self.disable_txpool_receive, - }) + .network(ScrollNetworkBuilder::default()) .executor(ScrollExecutorBuilder) .consensus(ScrollConsensusBuilder) } From 979204d8f4fe7c49e88e2d8a2666e9e4e609b80c Mon Sep 17 00:00:00 2001 From: Morty Date: Tue, 8 Jul 2025 00:57:50 +0800 Subject: [PATCH 7/7] fix: ci --- crates/scroll/node/src/builder/network.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/scroll/node/src/builder/network.rs b/crates/scroll/node/src/builder/network.rs index 7dd54c0887c..acae2012de0 100644 --- a/crates/scroll/node/src/builder/network.rs +++ b/crates/scroll/node/src/builder/network.rs @@ -78,7 +78,7 @@ where ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { - let config = self::network_config(ctx)?; + let config = ctx.network_config()?; let network = NetworkManager::builder(config).await?; let handle = ctx.start_network(network, pool); info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized");