From 1bffa35dfad64d3fd3f889e6dc2f4a8d9c9e1baa Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Tue, 30 May 2023 10:34:34 -0400 Subject: [PATCH] fix: enodeToMultiaddress when using ipv6 Fixes #560 --- waku/v2/node/wakuoptions.go | 8 ++++---- waku/v2/protocol/enr/enr.go | 13 ++++++++++++- waku/v2/utils/ip.go | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 waku/v2/utils/ip.go diff --git a/waku/v2/node/wakuoptions.go b/waku/v2/node/wakuoptions.go index 1ca086fc..333e73a2 100644 --- a/waku/v2/node/wakuoptions.go +++ b/waku/v2/node/wakuoptions.go @@ -230,12 +230,12 @@ func WithExternalIP(ip net.IP) WakuNodeOption { params.addressFactory = func(inputAddr []multiaddr.Multiaddr) (addresses []multiaddr.Multiaddr) { addresses = append(addresses, inputAddr...) - component := "/ip4/" - if ip.To4() == nil && ip.To16() != nil { - component = "/ip6/" + ipType := "/ip4/" + if utils.IsIPv6(ip.String()) { + ipType = "/ip6/" } - hostAddrMA, err := multiaddr.NewMultiaddr(component + ip.String()) + hostAddrMA, err := multiaddr.NewMultiaddr(ipType + ip.String()) if err != nil { panic("Could not build external IP") } diff --git a/waku/v2/protocol/enr/enr.go b/waku/v2/protocol/enr/enr.go index 9d6bec32..df22d2c0 100644 --- a/waku/v2/protocol/enr/enr.go +++ b/waku/v2/protocol/enr/enr.go @@ -57,7 +57,18 @@ func enodeToMultiAddr(node *enode.Node) (multiaddr.Multiaddr, error) { return nil, err } - return multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/%s/tcp/%d/p2p/%s", node.IP(), node.TCP(), peerID)) + ipType := "ip4" + portNumber := node.TCP() + if utils.IsIPv6(node.IP().String()) { + ipType = "ip6" + var port enr.TCP6 + if err := node.Record().Load(&port); err != nil { + return nil, err + } + portNumber = int(port) + } + + return multiaddr.NewMultiaddr(fmt.Sprintf("/%s/%s/tcp/%d/p2p/%s", ipType, node.IP(), portNumber, peerID)) } // Multiaddress is used to extract all the multiaddresses that are part of a ENR record diff --git a/waku/v2/utils/ip.go b/waku/v2/utils/ip.go new file mode 100644 index 00000000..d74473e8 --- /dev/null +++ b/waku/v2/utils/ip.go @@ -0,0 +1,16 @@ +package utils + +import ( + "net" + "strings" +) + +func IsIPv4(str string) bool { + ip := net.ParseIP(str) + return ip != nil && !strings.Contains(str, ":") +} + +func IsIPv6(str string) bool { + ip := net.ParseIP(str) + return ip != nil && strings.Contains(str, ":") +}