@@ -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> {
674672mod 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