From 4e2cae4505d9424df78f3771139be847a6fd1d42 Mon Sep 17 00:00:00 2001 From: sukun Date: Thu, 3 Oct 2024 10:43:59 +0530 Subject: [PATCH 1/5] basichost: ensure no duplicates in Addrs output (#2980) --- p2p/host/basic/basic_host.go | 6 +++- p2p/host/basic/basic_host_test.go | 58 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/p2p/host/basic/basic_host.go b/p2p/host/basic/basic_host.go index b5d252e9d2..761a39b664 100644 --- a/p2p/host/basic/basic_host.go +++ b/p2p/host/basic/basic_host.go @@ -500,6 +500,7 @@ func (h *BasicHost) makeUpdatedAddrEvent(prev, current []ma.Multiaddr) *event.Ev return nil } prevmap := make(map[string]ma.Multiaddr, len(prev)) + currmap := make(map[string]ma.Multiaddr, len(current)) evt := &event.EvtLocalAddressesUpdated{Diffs: true} addrsAdded := false @@ -507,6 +508,9 @@ func (h *BasicHost) makeUpdatedAddrEvent(prev, current []ma.Multiaddr) *event.Ev prevmap[string(addr.Bytes())] = addr } for _, addr := range current { + currmap[string(addr.Bytes())] = addr + } + for _, addr := range currmap { _, ok := prevmap[string(addr.Bytes())] updated := event.UpdatedAddress{Address: addr} if ok { @@ -831,7 +835,7 @@ func (h *BasicHost) Addrs() []ma.Multiaddr { // Make a copy. Consumers can modify the slice elements res := make([]ma.Multiaddr, len(addrs)) copy(res, addrs) - return res + return ma.Unique(res) } // NormalizeMultiaddr returns a multiaddr suitable for equality checks. diff --git a/p2p/host/basic/basic_host_test.go b/p2p/host/basic/basic_host_test.go index 9014e1b4df..1ab98aae9d 100644 --- a/p2p/host/basic/basic_host_test.go +++ b/p2p/host/basic/basic_host_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/libp2p/go-libp2p-testing/race" "github.com/libp2p/go-libp2p/core/event" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" @@ -248,6 +249,63 @@ func TestAllAddrs(t *testing.T) { require.True(t, ma.Contains(h.AllAddrs(), firstAddr), "should still contain the original addr") } +func TestAllAddrsUnique(t *testing.T) { + if race.WithRace() { + t.Skip("updates addrChangeTickrInterval which might be racy") + } + oldInterval := addrChangeTickrInterval + addrChangeTickrInterval = 100 * time.Millisecond + defer func() { + addrChangeTickrInterval = oldInterval + }() + sendNewAddrs := make(chan struct{}) + opts := HostOpts{ + AddrsFactory: func(addrs []ma.Multiaddr) []ma.Multiaddr { + select { + case <-sendNewAddrs: + return []ma.Multiaddr{ + ma.StringCast("/ip4/1.2.3.4/tcp/1"), + ma.StringCast("/ip4/1.2.3.4/tcp/1"), + ma.StringCast("/ip4/1.2.3.4/tcp/1"), + ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1"), + ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1"), + } + default: + return nil + } + }, + } + // no listen addrs + h, err := NewHost(swarmt.GenSwarm(t, swarmt.OptDialOnly), &opts) + require.NoError(t, err) + defer h.Close() + h.Start() + + sub, err := h.EventBus().Subscribe(&event.EvtLocalAddressesUpdated{}) + require.NoError(t, err) + out := make(chan int) + done := make(chan struct{}) + go func() { + cnt := 0 + for { + select { + case <-sub.Out(): + cnt++ + case <-done: + out <- cnt + return + } + } + }() + close(sendNewAddrs) + require.Len(t, h.Addrs(), 2) + require.ElementsMatch(t, []ma.Multiaddr{ma.StringCast("/ip4/1.2.3.4/tcp/1"), ma.StringCast("/ip4/1.2.3.4/udp/1/quic-v1")}, h.Addrs()) + time.Sleep(2*addrChangeTickrInterval + 1*time.Second) // the background loop runs every 5 seconds. Wait for 2x that time. + close(done) + cnt := <-out + require.Equal(t, 1, cnt) +} + // getHostPair gets a new pair of hosts. // The first host initiates the connection to the second host. func getHostPair(t *testing.T) (host.Host, host.Host) { From a1727af4f8df17ced7648d5361eeebc0e76036f9 Mon Sep 17 00:00:00 2001 From: sukun Date: Fri, 4 Oct 2024 07:36:41 +0530 Subject: [PATCH 2/5] autonatv2: recover from panics (#2992) * autonatv2: catch panics * reset streams on panic --- p2p/protocol/autonatv2/autonat.go | 4 ++-- p2p/protocol/autonatv2/autonat_test.go | 1 - p2p/protocol/autonatv2/client.go | 9 +++++++++ p2p/protocol/autonatv2/server.go | 10 ++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/p2p/protocol/autonatv2/autonat.go b/p2p/protocol/autonatv2/autonat.go index 3dc3bc166a..888a95b7ae 100644 --- a/p2p/protocol/autonatv2/autonat.go +++ b/p2p/protocol/autonatv2/autonat.go @@ -25,9 +25,9 @@ const ( DialProtocol = "/libp2p/autonat/2/dial-request" maxMsgSize = 8192 - streamTimeout = time.Minute + streamTimeout = 15 * time.Second dialBackStreamTimeout = 5 * time.Second - dialBackDialTimeout = 30 * time.Second + dialBackDialTimeout = 10 * time.Second dialBackMaxMsgSize = 1024 minHandshakeSizeBytes = 30_000 // for amplification attack prevention maxHandshakeSizeBytes = 100_000 diff --git a/p2p/protocol/autonatv2/autonat_test.go b/p2p/protocol/autonatv2/autonat_test.go index ee97ccc695..11c8f02195 100644 --- a/p2p/protocol/autonatv2/autonat_test.go +++ b/p2p/protocol/autonatv2/autonat_test.go @@ -657,5 +657,4 @@ func TestAreAddrsConsistency(t *testing.T) { } }) } - } diff --git a/p2p/protocol/autonatv2/client.go b/p2p/protocol/autonatv2/client.go index c1d82b7f3a..6ed7a6bb92 100644 --- a/p2p/protocol/autonatv2/client.go +++ b/p2p/protocol/autonatv2/client.go @@ -3,6 +3,8 @@ package autonatv2 import ( "context" "fmt" + "os" + "runtime/debug" "sync" "time" @@ -248,6 +250,13 @@ func newDialRequest(reqs []Request, nonce uint64) pb.Message { // handleDialBack receives the nonce on the dial-back stream func (ac *client) handleDialBack(s network.Stream) { + defer func() { + if rerr := recover(); rerr != nil { + fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack()) + } + s.Reset() + }() + if err := s.Scope().SetService(ServiceName); err != nil { log.Debugf("failed to attach stream to service %s: %w", ServiceName, err) s.Reset() diff --git a/p2p/protocol/autonatv2/server.go b/p2p/protocol/autonatv2/server.go index c5dd2dce3e..d28cfc9371 100644 --- a/p2p/protocol/autonatv2/server.go +++ b/p2p/protocol/autonatv2/server.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" "io" + "os" + "runtime/debug" "sync" "time" @@ -88,6 +90,14 @@ func (as *server) Close() { // handleDialRequest is the dial-request protocol stream handler func (as *server) handleDialRequest(s network.Stream) { + defer func() { + if rerr := recover(); rerr != nil { + fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack()) + s.Reset() + } + }() + + log.Debugf("received dial-request from: %s, addr: %s", s.Conn().RemotePeer(), s.Conn().RemoteMultiaddr()) evt := as.serveDialRequest(s) log.Debugf("completed dial-request from %s, response status: %s, dial status: %s, err: %s", s.Conn().RemotePeer(), evt.ResponseStatus, evt.DialStatus, evt.Error) From 26c18e48674729e400cab0c15b8d87d0900c60ad Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 3 Oct 2024 19:09:29 -0700 Subject: [PATCH 3/5] chore: update go-multiaddr-dns to v0.4.0 --- go.mod | 2 +- go.sum | 7 ++----- test-plans/go.mod | 2 +- test-plans/go.sum | 8 ++------ 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 684f354427..1fb9eb2c67 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/mr-tron/base58 v1.2.0 github.com/multiformats/go-base32 v0.1.0 github.com/multiformats/go-multiaddr v0.13.0 - github.com/multiformats/go-multiaddr-dns v0.3.1 + github.com/multiformats/go-multiaddr-dns v0.4.0 github.com/multiformats/go-multiaddr-fmt v0.1.0 github.com/multiformats/go-multibase v0.2.0 github.com/multiformats/go-multicodec v0.9.0 diff --git a/go.sum b/go.sum index 634d497c4b..bebfa4275a 100644 --- a/go.sum +++ b/go.sum @@ -208,7 +208,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= @@ -234,11 +233,10 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ= github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU= +github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= @@ -250,7 +248,6 @@ github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7B github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= diff --git a/test-plans/go.mod b/test-plans/go.mod index 466a55e911..6bace7c9a6 100644 --- a/test-plans/go.mod +++ b/test-plans/go.mod @@ -54,7 +54,7 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr-dns v0.4.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect diff --git a/test-plans/go.sum b/test-plans/go.sum index 45000bf25b..2498a34cd1 100644 --- a/test-plans/go.sum +++ b/test-plans/go.sum @@ -161,7 +161,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -184,11 +183,10 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ= github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr-dns v0.4.0 h1:P76EJ3qzBXpUXZ3twdCDx/kvagMsNo0LMFXpyms/zgU= +github.com/multiformats/go-multiaddr-dns v0.4.0/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= @@ -200,7 +198,6 @@ github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7B github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -447,7 +444,6 @@ golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 98c83a366f46ed648d451fc83fbf359c6844a54d Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 3 Oct 2024 19:11:53 -0700 Subject: [PATCH 4/5] fix: Release v0.36.5 --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 706bab2ee2..229ccd474f 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "v0.36.4" + "version": "v0.36.5" } From 7c939457c6657d020fdf481bbe92261c5cfc3196 Mon Sep 17 00:00:00 2001 From: Prithvi Shahi Date: Tue, 10 Sep 2024 01:37:25 -0700 Subject: [PATCH 5/5] chore: remove Roadmap file (#2954) --- README.md | 6 ------ ROADMAP.md | 5 ----- 2 files changed, 11 deletions(-) delete mode 100644 ROADMAP.md diff --git a/README.md b/README.md index ebebfb3953..f785935fc2 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ # Table of Contents - [Background](#background) -- [Roadmap](#roadmap) - [Usage](#usage) - [Examples](#examples) - [Dashboards](#dashboards) @@ -36,11 +35,6 @@ To learn more, check out the following resources: - [**js-libp2p implementation**](https://github.com/libp2p/js-libp2p) - [**rust-libp2p implementation**](https://github.com/libp2p/rust-libp2p) -# Roadmap - -Our roadmap for go-libp2p can be found here: https://github.com/libp2p/go-libp2p/blob/master/ROADMAP.md -This document represents current projects the go-libp2p team is focused on and provides an estimation of completion targets. It is a complementary roadmap to the overarching libp2p project roadmap: https://github.com/libp2p/specs/blob/master/ROADMAP.md - # Usage This repository (`go-libp2p`) serves as the entrypoint to the universe of packages that compose the Go implementation of the libp2p stack. diff --git a/ROADMAP.md b/ROADMAP.md deleted file mode 100644 index 5c9eb60301..0000000000 --- a/ROADMAP.md +++ /dev/null @@ -1,5 +0,0 @@ -# go-libp2p roadmap Q4’22/Q1’23 - -Please see our roadmap in [Starmap](https://starmap.site/roadmap/github.com/libp2p/go-libp2p/issues/1806#simple) - -Please add any feedback or questions in: https://github.com/libp2p/go-libp2p/issues/1806 \ No newline at end of file