diff --git a/waku/v2/node/wakunode2.go b/waku/v2/node/wakunode2.go index 7f2a7cbe..5ef808c9 100644 --- a/waku/v2/node/wakunode2.go +++ b/waku/v2/node/wakunode2.go @@ -316,13 +316,13 @@ func (w *WakuNode) watchMultiaddressChanges(ctx context.Context) { case <-ctx.Done(): return case <-first: - addr := maps.Keys(addrsSet) + addr := maps.Values(addrsSet) w.log.Info("listening", logging.MultiAddrs("multiaddr", addr...)) case <-w.addressChangesSub.Out(): newAddrs := utils.MultiAddrSet(w.ListenAddresses()...) - if !maps.Equal(addrsSet, newAddrs) { + if !utils.MultiAddrSetEquals(addrsSet, newAddrs) { addrsSet = newAddrs - addrs := maps.Keys(addrsSet) + addrs := maps.Values(addrsSet) w.log.Info("listening addresses update received", logging.MultiAddrs("multiaddr", addrs...)) err := w.setupENR(ctx, addrs) if err != nil { diff --git a/waku/v2/utils/multiaddr.go b/waku/v2/utils/multiaddr.go index b60d4a87..35061216 100644 --- a/waku/v2/utils/multiaddr.go +++ b/waku/v2/utils/multiaddr.go @@ -17,10 +17,23 @@ func EncapsulatePeerID(peerID peer.ID, addrs ...multiaddr.Multiaddr) []multiaddr return result } -func MultiAddrSet(addr ...multiaddr.Multiaddr) map[multiaddr.Multiaddr]struct{} { - r := make(map[multiaddr.Multiaddr]struct{}) +func MultiAddrSetEquals(m1 map[string]multiaddr.Multiaddr, m2 map[string]multiaddr.Multiaddr) bool { + if len(m1) != len(m2) { + return false + } + for k1, v1 := range m1 { + v2, ok := m2[k1] + if !ok || !v1.Equal(v2) { + return false + } + } + return true +} + +func MultiAddrSet(addr ...multiaddr.Multiaddr) map[string]multiaddr.Multiaddr { + r := make(map[string]multiaddr.Multiaddr) for _, a := range addr { - r[a] = struct{}{} + r[a.String()] = a } return r } diff --git a/waku/v2/utils/multiaddr_test.go b/waku/v2/utils/multiaddr_test.go new file mode 100644 index 00000000..dd8ff4ec --- /dev/null +++ b/waku/v2/utils/multiaddr_test.go @@ -0,0 +1,42 @@ +package utils + +import ( + "github.com/multiformats/go-multiaddr" + "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" + "testing" +) + +func TestMultiaddrAsKeyMap(t *testing.T) { + addr := "/ip4/127.0.0.1/tcp/63634/p2p/16Uiu2HAmJSLz9nyDMmjRpZzHAxMFiEUeszWgPReekzAroCgkTgbD" + m1 := make(map[multiaddr.Multiaddr]struct{}) + mm1, err := multiaddr.NewMultiaddr(addr) + require.NoError(t, err) + m1[mm1] = struct{}{} + _, ok := m1[mm1] + require.True(t, ok) + mm2, err := multiaddr.NewMultiaddr(addr) + require.NoError(t, err) + _, ok = m1[mm2] + require.False(t, ok) + + m2 := make(map[multiaddr.Multiaddr]struct{}) + m2[mm2] = struct{}{} + require.False(t, maps.Equal(m1, m2)) +} + +func TestMultiAddrSetEquals(t *testing.T) { + addr := "/ip4/127.0.0.1/tcp/63634/p2p/16Uiu2HAmJSLz9nyDMmjRpZzHAxMFiEUeszWgPReekzAroCgkTgbD" + ma1, err := multiaddr.NewMultiaddr(addr) + require.NoError(t, err) + ma2, err := multiaddr.NewMultiaddr(addr) + require.NoError(t, err) + + m1 := map[string]multiaddr.Multiaddr{ + addr: ma1, + } + m2 := map[string]multiaddr.Multiaddr{ + addr: ma2, + } + require.True(t, MultiAddrSetEquals(m1, m2)) +}