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..acae2012de0 100644 --- a/crates/scroll/node/src/builder/network.rs +++ b/crates/scroll/node/src/builder/network.rs @@ -16,7 +16,48 @@ 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(); + + // 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), + // 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 @@ -37,18 +78,7 @@ where ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { - // get the header transform. - 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 network = NetworkManager::builder(config).await?; let handle = ctx.start_network(network, pool); info!(target: "reth::cli", enode=%handle.local_node_record(), "P2P networking initialized"); diff --git a/crates/scroll/node/src/node.rs b/crates/scroll/node/src/node.rs index 7e1da81bfef..73c29dc25e8 100644 --- a/crates/scroll/node/src/node.rs +++ b/crates/scroll/node/src/node.rs @@ -42,7 +42,7 @@ impl ScrollNode { .pool(ScrollPoolBuilder::default()) .executor(ScrollExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new(ScrollPayloadBuilderBuilder::default())) - .network(ScrollNetworkBuilder) + .network(ScrollNetworkBuilder::default()) .executor(ScrollExecutorBuilder) .consensus(ScrollConsensusBuilder) }