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, ":") +}