diff --git a/waku/node.go b/waku/node.go index b6c26a6e..a392b155 100644 --- a/waku/node.go +++ b/waku/node.go @@ -216,15 +216,6 @@ func Execute(options Options) { addPeers(wakuNode, options.LightPush.Nodes, lightpush.LightPushID_v20beta1) addPeers(wakuNode, options.Filter.Nodes, filter.FilterID_v20beta1) - if options.DNSDiscovery.Enable || options.DiscV5.Enable { - for _, addr := range wakuNode.ListenAddresses() { - ip, _ := addr.ValueForProtocol(multiaddr.P_IP4) - // TODO: use enode.New - enr := enode.NewV4(&prvKey.PublicKey, net.ParseIP(ip), hostAddr.Port, 0) - log.Info("ENR: ", enr) - } - } - if err = wakuNode.Start(); err != nil { log.Fatal(fmt.Errorf("could not start waku node, %w", err)) } diff --git a/waku/v2/node/wakunode2.go b/waku/v2/node/wakunode2.go index 5cb73b48..87d794a3 100644 --- a/waku/v2/node/wakunode2.go +++ b/waku/v2/node/wakunode2.go @@ -186,6 +186,14 @@ func (w *WakuNode) checkForAddressChanges() { case <-first: for _, addr := range addrs { log.Info("Listening on ", addr) + + // TODO: make this optional depending on DNS Disc being enabled + enr, ip, err := utils.GetENRandIP(addr, w.opts.privKey) + if err != nil { + log.Error("could not obtain ENR record from multiaddress", err) + } else { + log.Info(fmt.Sprintf("ENR for IP %s: %s", ip, enr)) + } } case <-w.addressChangesSub.Out(): newAddrs := w.ListenAddresses() @@ -206,6 +214,14 @@ func (w *WakuNode) checkForAddressChanges() { for _, addr := range newAddrs { w.addrChan <- addr log.Warn("Listening on ", addr) + + // TODO: make this optional depending on DNS Disc being enabled + enr, ip, err := utils.GetENRandIP(addr, w.opts.privKey) + if err != nil { + log.Error("could not obtain ENR record from multiaddress", err) + } else { + log.Warn(fmt.Sprintf("ENR for IP %s: %s", ip, enr)) + } } } } diff --git a/waku/v2/utils/peer.go b/waku/v2/utils/peer.go index 2ecc3dea..143ac751 100644 --- a/waku/v2/utils/peer.go +++ b/waku/v2/utils/peer.go @@ -2,15 +2,19 @@ package utils import ( "context" + "crypto/ecdsa" "errors" "fmt" "math/rand" + "net" + "strconv" "sync" "time" ma "github.com/multiformats/go-multiaddr" "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" @@ -134,3 +138,35 @@ func EnodeToPeerInfo(node *enode.Node) (*peer.AddrInfo, error) { return peer.AddrInfoFromP2pAddr(address) } + +func GetENRandIP(addr ma.Multiaddr, privK *ecdsa.PrivateKey) (*enode.Node, *net.TCPAddr, error) { + ip, err := addr.ValueForProtocol(ma.P_IP4) + if err != nil { + return nil, nil, err + } + + portStr, err := addr.ValueForProtocol(ma.P_TCP) + if err != nil { + return nil, nil, err + } + + port, err := strconv.Atoi(portStr) + if err != nil { + return nil, nil, err + } + + tcpAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", ip, port)) + if err != nil { + return nil, nil, err + } + + r := &enr.Record{} + r.Set(enr.TCP(port)) + r.Set(enr.IP(net.ParseIP(ip))) + + enode.SignV4(r, privK) + + node, err := enode.New(enode.ValidSchemes, r) + + return node, tcpAddr, err +}