From 35e88fbe7974f89b6a51911181de255ad1fafb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:58:45 -0300 Subject: [PATCH 1/5] fix: parse bootnode IP addresses --- crates/net/p2p/src/lib.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index fe3cdde..d17ce2d 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -1,6 +1,6 @@ use std::{ collections::{HashMap, HashSet}, - net::{IpAddr, SocketAddr}, + net::{IpAddr, Ipv4Addr, SocketAddr}, time::Duration, }; @@ -458,8 +458,15 @@ pub fn parse_enrs(enrs: Vec) -> Vec { .unwrap(); let quic_port = u16::decode(quic_port_bytes.as_ref()).unwrap(); + let (_, ip_bytes) = record + .pairs + .iter() + .find(|(key, _)| key.as_ref() == b"ip") + .expect("node record missing IP address"); + let ip = IpAddr::from(Ipv4Addr::decode(ip_bytes.as_ref()).expect("invalid IPv4 address")); + bootnodes.push(Bootnode { - ip: "127.0.0.1".parse().unwrap(), + ip, quic_port, public_key: public_key.into(), }); From febbea0dc45b093e8ec3bb77886e1eebecb509d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Mon, 9 Feb 2026 13:18:36 -0300 Subject: [PATCH 2/5] fix: decode as 4 octets instead of RLP --- crates/net/p2p/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index d17ce2d..14cfec8 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -463,7 +463,8 @@ pub fn parse_enrs(enrs: Vec) -> Vec { .iter() .find(|(key, _)| key.as_ref() == b"ip") .expect("node record missing IP address"); - let ip = IpAddr::from(Ipv4Addr::decode(ip_bytes.as_ref()).expect("invalid IPv4 address")); + let ip_octets: [u8; 4] = ip_bytes.as_ref().try_into().expect("invalid IPv4 address"); + let ip = IpAddr::from(Ipv4Addr::from(ip_octets)); bootnodes.push(Bootnode { ip, From 22bf3a776f74c9483cf4f8582c8491983da8e9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Mon, 9 Feb 2026 13:19:26 -0300 Subject: [PATCH 3/5] docs: add TODO --- crates/net/p2p/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index 14cfec8..edd2546 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -458,6 +458,8 @@ pub fn parse_enrs(enrs: Vec) -> Vec { .unwrap(); let quic_port = u16::decode(quic_port_bytes.as_ref()).unwrap(); + + // TODO: support IPv6 let (_, ip_bytes) = record .pairs .iter() From 4dc2521642280e2b6c996950b5b22ca657319a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Mon, 9 Feb 2026 14:22:07 -0300 Subject: [PATCH 4/5] feat: add support for "ip6" too --- crates/net/p2p/src/lib.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index edd2546..9e4db82 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -1,6 +1,6 @@ use std::{ collections::{HashMap, HashSet}, - net::{IpAddr, Ipv4Addr, SocketAddr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, time::Duration, }; @@ -459,14 +459,25 @@ pub fn parse_enrs(enrs: Vec) -> Vec { let quic_port = u16::decode(quic_port_bytes.as_ref()).unwrap(); - // TODO: support IPv6 - let (_, ip_bytes) = record + let ipv4 = record .pairs .iter() .find(|(key, _)| key.as_ref() == b"ip") + .map(|(_, bytes)| { + let octets: [u8; 4] = bytes.as_ref().try_into().expect("invalid IPv4 address"); + IpAddr::from(Ipv4Addr::from(octets)) + }); + let ipv6 = record + .pairs + .iter() + .find(|(key, _)| key.as_ref() == b"ip6") + .map(|(_, bytes)| { + let octets: [u8; 16] = bytes.as_ref().try_into().expect("invalid IPv6 address"); + IpAddr::from(Ipv6Addr::from(octets)) + }); + let ip = ipv4 + .or(ipv6) .expect("node record missing IP address"); - let ip_octets: [u8; 4] = ip_bytes.as_ref().try_into().expect("invalid IPv4 address"); - let ip = IpAddr::from(Ipv4Addr::from(ip_octets)); bootnodes.push(Bootnode { ip, From 829f0a10fa94d060e8d9617d49d916bf25d0f989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Mon, 9 Feb 2026 14:39:29 -0300 Subject: [PATCH 5/5] chore: add comment --- crates/net/p2p/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/net/p2p/src/lib.rs b/crates/net/p2p/src/lib.rs index 9e4db82..6d04494 100644 --- a/crates/net/p2p/src/lib.rs +++ b/crates/net/p2p/src/lib.rs @@ -475,9 +475,9 @@ pub fn parse_enrs(enrs: Vec) -> Vec { let octets: [u8; 16] = bytes.as_ref().try_into().expect("invalid IPv6 address"); IpAddr::from(Ipv6Addr::from(octets)) }); - let ip = ipv4 - .or(ipv6) - .expect("node record missing IP address"); + + // Prefer IPv4 if both are present + let ip = ipv4.or(ipv6).expect("node record missing IP address"); bootnodes.push(Bootnode { ip,