Skip to content

Commit 0f4d475

Browse files
fix: preserve basic nodes from peers file by avoiding peer_config overwrite (#19887)
Co-authored-by: Matthias Seitz <[email protected]>
1 parent c037a57 commit 0f4d475

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

crates/node/core/src/args/network.rs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,17 +288,15 @@ impl NetworkArgs {
288288
// Configure peer connections
289289
let ip_filter = self.ip_filter().unwrap_or_default();
290290
let peers_config = config
291-
.peers
292-
.clone()
291+
.peers_config_with_basic_nodes_from_file(
292+
self.persistent_peers_file(peers_file).as_deref(),
293+
)
293294
.with_max_inbound_opt(self.max_inbound_peers)
294295
.with_max_outbound_opt(self.max_outbound_peers)
295296
.with_ip_filter(ip_filter);
296297

297298
// Configure basic network stack
298299
NetworkConfigBuilder::<N>::new(secret_key)
299-
.peer_config(config.peers_config_with_basic_nodes_from_file(
300-
self.persistent_peers_file(peers_file).as_deref(),
301-
))
302300
.external_ip_resolver(self.nat)
303301
.sessions_config(
304302
SessionsConfig::default().with_upscaled_event_buffer(peers_config.max_peers()),
@@ -674,6 +672,15 @@ fn parse_block_num_hash(s: &str) -> Result<BlockNumHash, String> {
674672
mod tests {
675673
use super::*;
676674
use clap::Parser;
675+
use reth_chainspec::MAINNET;
676+
use reth_config::Config;
677+
use reth_network_peers::NodeRecord;
678+
use secp256k1::SecretKey;
679+
use std::{
680+
fs,
681+
time::{SystemTime, UNIX_EPOCH},
682+
};
683+
677684
/// A helper type to parse Args more easily
678685
#[derive(Parser)]
679686
struct CommandParser<T: Args> {
@@ -925,4 +932,38 @@ mod tests {
925932

926933
assert!(args.ip_filter().is_err());
927934
}
935+
936+
#[test]
937+
fn network_config_preserves_basic_nodes_from_peers_file() {
938+
let enode = "enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301";
939+
let unique = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos();
940+
941+
let peers_file = std::env::temp_dir().join(format!("reth_peers_test_{}.json", unique));
942+
fs::write(&peers_file, format!("[\"{}\"]", enode)).expect("write peers file");
943+
944+
// Build NetworkArgs with peers_file set and no_persist_peers=false
945+
let args = NetworkArgs {
946+
peers_file: Some(peers_file.clone()),
947+
no_persist_peers: false,
948+
..Default::default()
949+
};
950+
951+
// Build the network config using a deterministic secret key
952+
let secret_key = SecretKey::from_byte_array(&[1u8; 32]).unwrap();
953+
let builder = args.network_config::<reth_network::EthNetworkPrimitives>(
954+
&Config::default(),
955+
MAINNET.clone(),
956+
secret_key,
957+
peers_file.clone(),
958+
);
959+
960+
let net_cfg = builder.build_with_noop_provider(MAINNET.clone());
961+
962+
// Assert basic_nodes contains our node
963+
let node: NodeRecord = enode.parse().unwrap();
964+
assert!(net_cfg.peers_config.basic_nodes.contains(&node));
965+
966+
// Cleanup
967+
let _ = fs::remove_file(&peers_file);
968+
}
928969
}

0 commit comments

Comments
 (0)