From 8303c592d35ce31fd3b726988070802232580e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Thu, 20 Jun 2024 03:52:43 -0400 Subject: [PATCH] fix: use IP addresses instead of dns to store multiaddresses (#1134) Co-authored-by: Prem Chaitanya Prathi --- waku/v2/node/address_test.go | 29 +++++++++++++++-------------- waku/v2/node/localnode.go | 24 ++++++++++++++++++------ 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/waku/v2/node/address_test.go b/waku/v2/node/address_test.go index 4b173115..6f270e16 100644 --- a/waku/v2/node/address_test.go +++ b/waku/v2/node/address_test.go @@ -1,6 +1,7 @@ package node import ( + "context" "net" "testing" @@ -9,23 +10,23 @@ import ( ) func TestExternalAddressSelection(t *testing.T) { - a1, _ := ma.NewMultiaddr("/ip4/192.168.0.106/tcp/60000/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid - a2, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/60000/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid but should not be prefered - a3, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid - a4, _ := ma.NewMultiaddr("/dns4/www.status.im/tcp/2012/ws/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (it's useless) - a5, _ := ma.NewMultiaddr("/dns4/www.status.im/tcp/443/wss/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid - a6, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/wss/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (local + wss) - a7, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/ws/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (it's useless) - a8, _ := ma.NewMultiaddr("/dns4/node-02.gc-us-central1-a.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmDQugwDHM3YeUp86iGjrUvbdw3JPRgikC7YoGBsT2ymMg/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID - a9, _ := ma.NewMultiaddr("/dns4/node-02.gc-us-central1-a.status.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAmDQugwDHM3YeUp86iGjrUvbdw3JPRgikC7YoGBsT2ymMg/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID + a1, _ := ma.NewMultiaddr("/ip4/192.168.0.106/tcp/60000/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid + a2, _ := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/60000/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid but should not be prefered + a3, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid + a4, _ := ma.NewMultiaddr("/dns4/www.status.im/tcp/2012/ws/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (it's useless) + a5, _ := ma.NewMultiaddr("/dns4/www.status.im/tcp/443/wss/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Valid + a6, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/wss/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (local + wss) + a7, _ := ma.NewMultiaddr("/ip4/192.168.1.20/tcp/19710/ws/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // Invalid (it's useless) + a8, _ := ma.NewMultiaddr("/dns4/node-02.gc-us-central1-a.status.prod.statusim.net/tcp/30303/p2p/16Uiu2HAmDQugwDHM3YeUp86iGjrUvbdw3JPRgikC7YoGBsT2ymMg/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID + a9, _ := ma.NewMultiaddr("/dns4/node-02.gc-us-central1-a.status.prod.statusim.net/tcp/443/wss/p2p/16Uiu2HAmDQugwDHM3YeUp86iGjrUvbdw3JPRgikC7YoGBsT2ymMg/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID a10, _ := ma.NewMultiaddr("/dns4/node-01.gc-us-central1-a.waku.test.statusim.net/tcp/8000/wss/p2p/16Uiu2HAmDCp8XJ9z1ev18zuv8NHekAsjNyezAvmMfFEJkiharitG/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID a11, _ := ma.NewMultiaddr("/dns4/node-01.gc-us-central1-a.waku.test.statusim.net/tcp/30303/p2p/16Uiu2HAmDCp8XJ9z1ev18zuv8NHekAsjNyezAvmMfFEJkiharitG/p2p-circuit/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID - a12, _ := ma.NewMultiaddr("/ip4/188.23.1.8/tcp/30303/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID + a12, _ := ma.NewMultiaddr("/ip4/188.23.1.8/tcp/30303/p2p/16Uiu2HAmUVVrJo1KMw4QwUANYF7Ws4mfcRqf9xHaaGP87GbMuY2f") // VALID addrs := []ma.Multiaddr{a1, a2, a3, a4, a5, a6, a7} w := &WakuNode{} - extAddr, multiaddr, err := w.getENRAddresses([]ma.Multiaddr{a1, a2, a3, a4, a5, a6, a7}) + extAddr, multiaddr, err := w.getENRAddresses(context.Background(), []ma.Multiaddr{a1, a2, a3, a4, a5, a6, a7}) a4NoP2P, _ := decapsulateP2P(a4) require.NoError(t, err) require.Equal(t, extAddr.IP, net.IPv4(192, 168, 0, 106)) @@ -34,13 +35,13 @@ func TestExternalAddressSelection(t *testing.T) { require.Len(t, multiaddr, 4) addrs = append(addrs, a8, a9, a10, a11, a12) - extAddr, _, err = w.getENRAddresses(addrs) + extAddr, _, err = w.getENRAddresses(context.Background(), addrs) require.NoError(t, err) require.Equal(t, extAddr.IP, net.IPv4(188, 23, 1, 8)) require.Equal(t, extAddr.Port, 30303) - a8RelayNode, _ := decapsulateCircuitRelayAddr(a8) - _, multiaddr, err = w.getENRAddresses([]ma.Multiaddr{a1, a8}) + a8RelayNode, _ := decapsulateCircuitRelayAddr(context.Background(), a8) + _, multiaddr, err = w.getENRAddresses(context.Background(), []ma.Multiaddr{a1, a8}) require.NoError(t, err) require.Len(t, multiaddr, 1) require.Equal(t, multiaddr[0].String(), a8RelayNode.String()) // Should have included circuit-relay addr diff --git a/waku/v2/node/localnode.go b/waku/v2/node/localnode.go index 163c46d2..6259fa18 100644 --- a/waku/v2/node/localnode.go +++ b/waku/v2/node/localnode.go @@ -11,6 +11,7 @@ import ( "github.com/libp2p/go-libp2p/core/event" "github.com/multiformats/go-multiaddr" ma "github.com/multiformats/go-multiaddr" + madns "github.com/multiformats/go-multiaddr-dns" "github.com/waku-org/go-waku/waku/v2/protocol" wenr "github.com/waku-org/go-waku/waku/v2/protocol/enr" "github.com/waku-org/go-waku/waku/v2/protocol/relay" @@ -183,7 +184,7 @@ func decapsulateP2P(addr ma.Multiaddr) (ma.Multiaddr, error) { return addr, nil } -func decapsulateCircuitRelayAddr(addr ma.Multiaddr) (ma.Multiaddr, error) { +func decapsulateCircuitRelayAddr(ctx context.Context, addr ma.Multiaddr) (ma.Multiaddr, error) { _, err := addr.ValueForProtocol(ma.P_CIRCUIT) if err != nil { return nil, errors.New("not a circuit relay address") @@ -194,6 +195,16 @@ func decapsulateCircuitRelayAddr(addr ma.Multiaddr) (ma.Multiaddr, error) { return c.Protocol().Code == ma.P_CIRCUIT }) + // If the multiaddress is a dns4 address, we resolve it + addrs, err := madns.DefaultResolver.Resolve(ctx, addr) + if err != nil { + return nil, err + } + + if len(addrs) > 0 { + return addrs[0], nil + } + return addr, nil } @@ -221,10 +232,10 @@ func selectWSListenAddresses(addresses []ma.Multiaddr) ([]ma.Multiaddr, error) { return result, nil } -func selectCircuitRelayListenAddresses(addresses []ma.Multiaddr) ([]ma.Multiaddr, error) { +func selectCircuitRelayListenAddresses(ctx context.Context, addresses []ma.Multiaddr) ([]ma.Multiaddr, error) { var result []ma.Multiaddr for _, addr := range addresses { - addr, err := decapsulateCircuitRelayAddr(addr) + addr, err := decapsulateCircuitRelayAddr(ctx, addr) if err != nil { continue } @@ -234,6 +245,7 @@ func selectCircuitRelayListenAddresses(addresses []ma.Multiaddr) ([]ma.Multiaddr return result, nil } + func filter0Port(addresses []ma.Multiaddr) ([]ma.Multiaddr, error) { var result []ma.Multiaddr for _, addr := range addresses { @@ -255,7 +267,7 @@ func filter0Port(addresses []ma.Multiaddr) ([]ma.Multiaddr, error) { return result, nil } -func (w *WakuNode) getENRAddresses(addrs []ma.Multiaddr) (extAddr *net.TCPAddr, multiaddr []ma.Multiaddr, err error) { +func (w *WakuNode) getENRAddresses(ctx context.Context, addrs []ma.Multiaddr) (extAddr *net.TCPAddr, multiaddr []ma.Multiaddr, err error) { extAddr, err = selectMostExternalAddress(addrs) if err != nil { return nil, nil, err @@ -266,7 +278,7 @@ func (w *WakuNode) getENRAddresses(addrs []ma.Multiaddr) (extAddr *net.TCPAddr, return nil, nil, err } - circuitAddrs, err := selectCircuitRelayListenAddresses(addrs) + circuitAddrs, err := selectCircuitRelayListenAddresses(ctx, addrs) if err != nil { return nil, nil, err } @@ -288,7 +300,7 @@ func (w *WakuNode) getENRAddresses(addrs []ma.Multiaddr) (extAddr *net.TCPAddr, } func (w *WakuNode) setupENR(ctx context.Context, addrs []ma.Multiaddr) error { - ipAddr, multiaddresses, err := w.getENRAddresses(addrs) + ipAddr, multiaddresses, err := w.getENRAddresses(ctx, addrs) if err != nil { w.log.Error("obtaining external address", zap.Error(err)) return err