From 6599d91fa7173092e878cc6e27c0c822d7569858 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 13 Jun 2019 09:50:35 -0700 Subject: [PATCH 1/9] WIP: dht mode toggling --- dht.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ dht_net.go | 13 ++++++++++++ 2 files changed, 72 insertions(+) diff --git a/dht.go b/dht.go index da3c5cc33..d8d7573f1 100644 --- a/dht.go +++ b/dht.go @@ -41,6 +41,11 @@ var logger = logging.Logger("dht") // collect members of the routing table. const NumBootstrapQueries = 5 +const ( + ModeServer = 1 + ModeClient = 2 +) + // IpfsDHT is an implementation of Kademlia with S/Kademlia modifications. // It is used to implement the base Routing module. type IpfsDHT struct { @@ -66,6 +71,9 @@ type IpfsDHT struct { plk sync.Mutex protocols []protocol.ID // DHT protocols + + mode int + modeLk sync.Mutex } // Assert that IPFS assumptions about interfaces aren't broken. These aren't a @@ -97,8 +105,10 @@ func New(ctx context.Context, h host.Host, options ...opts.Option) (*IpfsDHT, er dht.proc.AddChild(dht.providers.Process()) dht.Validator = cfg.Validator + dht.mode = ModeClient if !cfg.Client { + dht.mode = ModeServer for _, p := range cfg.Protocols { h.SetStreamHandler(p, dht.handleNewStream) } @@ -365,6 +375,55 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ return filtered } +func (dht *IpfsDHT) SetMode(m int) error { + dht.modeLk.Lock() + defer dht.modeLk.Unlock() + + if m == dht.mode { + return nil + } + + switch m { + case ModeServer: + return dht.moveToServerMode() + case ModeClient: + return dht.moveToClientMode() + default: + return fmt.Errorf("unrecognized dht mode: %d", m) + } +} + +func (dht *IpfsDHT) moveToServerMode() error { + dht.mode = ModeServer + for _, p := range dht.protocols { + dht.host.SetStreamHandler(p, dht.handleNewStream) + } + return nil +} + +func (dht *IpfsDHT) moveToClientMode() error { + dht.mode = ModeClient + for _, p := range dht.protocols { + dht.host.RemoveStreamHandler(p) + } + + pset := make(map[protocol.ID]bool) + for _, p := range dht.protocols { + pset[p] = true + } + + // hacky... also closes both inbound and outbound streams + for _, c := range dht.host.Network().Conns() { + for _, s := range c.GetStreams() { + if pset[s.Protocol()] { + // is it even safe to call close concurrently with a read/write call? + s.Close() + } + } + } + return nil +} + // Context return dht's context func (dht *IpfsDHT) Context() context.Context { return dht.ctx diff --git a/dht_net.go b/dht_net.go index ce9e5de36..811895180 100644 --- a/dht_net.go +++ b/dht_net.go @@ -14,6 +14,7 @@ import ( "github.com/libp2p/go-libp2p-kad-dht/metrics" pb "github.com/libp2p/go-libp2p-kad-dht/pb" + msmux "github.com/multiformats/go-multistream" ggio "github.com/gogo/protobuf/io" @@ -153,6 +154,9 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message ms, err := dht.messageSenderForPeer(ctx, p) if err != nil { + if err == msmux.ErrNotSupported { + dht.RoutingTable().Remove(p) + } stats.Record(ctx, metrics.SentRequestErrors.M(1)) return nil, err } @@ -161,6 +165,9 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message rpmes, err := ms.SendRequest(ctx, pmes) if err != nil { + if err == msmux.ErrNotSupported { + dht.RoutingTable().Remove(p) + } stats.Record(ctx, metrics.SentRequestErrors.M(1)) return nil, err } @@ -187,11 +194,17 @@ func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message ms, err := dht.messageSenderForPeer(ctx, p) if err != nil { + if err == msmux.ErrNotSupported { + dht.RoutingTable().Remove(p) + } stats.Record(ctx, metrics.SentMessageErrors.M(1)) return err } if err := ms.SendMessage(ctx, pmes); err != nil { + if err == msmux.ErrNotSupported { + dht.RoutingTable().Remove(p) + } stats.Record(ctx, metrics.SentMessageErrors.M(1)) return err } From b9468a8eb671e5847c2d54a70467b8c130916c05 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Fri, 14 Jun 2019 10:43:41 -0700 Subject: [PATCH 2/9] reset inbound streams --- dht.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dht.go b/dht.go index d8d7573f1..6421f86ce 100644 --- a/dht.go +++ b/dht.go @@ -41,9 +41,11 @@ var logger = logging.Logger("dht") // collect members of the routing table. const NumBootstrapQueries = 5 +type DHTMode int + const ( - ModeServer = 1 - ModeClient = 2 + ModeServer = DHTMode(1) + ModeClient = DHTMode(2) ) // IpfsDHT is an implementation of Kademlia with S/Kademlia modifications. @@ -375,7 +377,7 @@ func (dht *IpfsDHT) betterPeersToQuery(pmes *pb.Message, p peer.ID, count int) [ return filtered } -func (dht *IpfsDHT) SetMode(m int) error { +func (dht *IpfsDHT) SetMode(m DHTMode) error { dht.modeLk.Lock() defer dht.modeLk.Unlock() @@ -412,12 +414,12 @@ func (dht *IpfsDHT) moveToClientMode() error { pset[p] = true } - // hacky... also closes both inbound and outbound streams for _, c := range dht.host.Network().Conns() { for _, s := range c.GetStreams() { if pset[s.Protocol()] { - // is it even safe to call close concurrently with a read/write call? - s.Close() + if s.Stat().Direction == network.DirInbound { + s.Reset() + } } } } From 03103d07f9be379cc1e84e555dbdb16db0ae82f8 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Tue, 18 Jun 2019 18:12:33 +0200 Subject: [PATCH 3/9] drop out of handlers if we are in client mode --- dht.go | 8 +++++++- dht_net.go | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dht.go b/dht.go index 6421f86ce..e4919d8b9 100644 --- a/dht.go +++ b/dht.go @@ -74,7 +74,7 @@ type IpfsDHT struct { protocols []protocol.ID // DHT protocols - mode int + mode DHTMode modeLk sync.Mutex } @@ -426,6 +426,12 @@ func (dht *IpfsDHT) moveToClientMode() error { return nil } +func (dht *IpfsDHT) getMode() DHTMode { + dht.modeLk.Lock() + defer dht.modeLk.Unlock() + return dht.mode +} + // Context return dht's context func (dht *IpfsDHT) Context() context.Context { return dht.ctx diff --git a/dht_net.go b/dht_net.go index 811895180..c5cc31a3e 100644 --- a/dht_net.go +++ b/dht_net.go @@ -80,6 +80,11 @@ func (dht *IpfsDHT) handleNewMessage(s network.Stream) bool { defer timer.Stop() for { + if dht.getMode() != ModeServer { + logger.Errorf("responding to dht message while not in server mode") + return false + } + var req pb.Message switch err := r.ReadMsg(&req); err { case io.EOF: From fe71ae8acf295d1b5ffe1c9fc1e2f02c82eb7856 Mon Sep 17 00:00:00 2001 From: Cole Brown Date: Wed, 19 Jun 2019 16:39:03 -0400 Subject: [PATCH 4/9] Add basic mode switching test --- dht_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/dht_test.go b/dht_test.go index fc819067e..e0d0d91db 100644 --- a/dht_test.go +++ b/dht_test.go @@ -1387,3 +1387,22 @@ func TestClientModeAtInit(t *testing.T) { err := pinger.Ping(context.Background(), client.PeerID()) assert.True(t, xerrors.Is(err, multistream.ErrNotSupported)) } + +func TestModeChange(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + clientOnly := setupDHT(ctx, t, true) + clientToServer := setupDHT(ctx, t, true) + clientOnly.Host().Peerstore().AddAddrs(clientToServer.PeerID(), clientToServer.Host().Addrs(), peerstore.AddressTTL) + err := clientOnly.Ping(ctx, clientToServer.PeerID()) + assert.True(t, xerrors.Is(err, multistream.ErrNotSupported)) + err = clientToServer.SetMode(ModeServer) + assert.Nil(t, err) + err = clientOnly.Ping(ctx, clientToServer.PeerID()) + assert.Nil(t, err) + err = clientToServer.SetMode(ModeClient) + assert.Nil(t, err) + err = clientOnly.Ping(ctx, clientToServer.PeerID()) + assert.NotNil(t, err) +} From 70c25e0666662d03a0a0b2164c66d3c0e6ba1672 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Thu, 20 Jun 2019 15:39:52 +0200 Subject: [PATCH 5/9] add handlers for protocol changes --- dht.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/dht.go b/dht.go index e4919d8b9..0a8e893d1 100644 --- a/dht.go +++ b/dht.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "github.com/libp2p/go-libp2p-core/event" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" @@ -99,6 +100,8 @@ func New(ctx context.Context, h host.Host, options ...opts.Option) (*IpfsDHT, er // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) + go dht.handleProtocolChanges(ctx, ch, cancel) + dht.proc = goprocessctx.WithContextAndTeardown(ctx, func() error { // remove ourselves from network notifs. dht.host.Network().StopNotify((*netNotifiee)(dht)) @@ -504,3 +507,49 @@ func (dht *IpfsDHT) newContextWithLocalTags(ctx context.Context, extraTags ...ta ) // ignoring error as it is unrelated to the actual function of this code. return ctx } + +func (dht *IpfsDHT) handleProtocolChanges(ctx context.Context) { + // register for event bus protocol ID changes + ch := make(chan event.EvtPeerProtocolsUpdated, 8) + cancel, err := dht.host.EventBus().Subscribe(ch) + if err != nil { + return nil, err + } + defer cancel() + + pmap := make(map[protocol.ID]bool) + for _, p := range dht.protocols { + pmap[p] = true + } + + for { + select { + case e, ok := <-ch: + if !ok { + return + } + var drop, add bool + for _, p := range e.Added { + if pmap[p] { + add = true + } + } + for _, p := range e.Removed { + if pmap[p] { + drop = true + } + } + + if add && drop { + // TODO: discuss how to handle this case + log.Warning("peer adding and dropping dht protocols? odd") + } else if add { + dht.RoutingTable().Update(e.Peer) + } else if drop { + dht.RoutingTable().Remove(e.Peer) + } + case <-ctx.Done(): + return + } + } +} From d99d2e2feefcded04a216e72a82a14fd35684b1f Mon Sep 17 00:00:00 2001 From: Whyrusleeping Date: Thu, 20 Jun 2019 18:20:35 +0200 Subject: [PATCH 6/9] Update dht_net.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Raúl Kripalani --- dht_net.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dht_net.go b/dht_net.go index c5cc31a3e..486465697 100644 --- a/dht_net.go +++ b/dht_net.go @@ -81,7 +81,7 @@ func (dht *IpfsDHT) handleNewMessage(s network.Stream) bool { for { if dht.getMode() != ModeServer { - logger.Errorf("responding to dht message while not in server mode") + logger.Errorf("ignoring incoming dht message while not in server mode") return false } From 5f434a880100e8d522faa44c06e91541bd86004e Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Fri, 21 Jun 2019 13:53:14 +0200 Subject: [PATCH 7/9] fix build --- dht.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dht.go b/dht.go index 0a8e893d1..44467b88b 100644 --- a/dht.go +++ b/dht.go @@ -100,7 +100,7 @@ func New(ctx context.Context, h host.Host, options ...opts.Option) (*IpfsDHT, er // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) - go dht.handleProtocolChanges(ctx, ch, cancel) + go dht.handleProtocolChanges(ctx) dht.proc = goprocessctx.WithContextAndTeardown(ctx, func() error { // remove ourselves from network notifs. @@ -513,7 +513,7 @@ func (dht *IpfsDHT) handleProtocolChanges(ctx context.Context) { ch := make(chan event.EvtPeerProtocolsUpdated, 8) cancel, err := dht.host.EventBus().Subscribe(ch) if err != nil { - return nil, err + panic(err) } defer cancel() @@ -542,7 +542,7 @@ func (dht *IpfsDHT) handleProtocolChanges(ctx context.Context) { if add && drop { // TODO: discuss how to handle this case - log.Warning("peer adding and dropping dht protocols? odd") + logger.Warning("peer adding and dropping dht protocols? odd") } else if add { dht.RoutingTable().Update(e.Peer) } else if drop { From 37010e397dc9d2ffcfcfd995a48a6be60967f8bf Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 24 Jun 2019 16:52:10 +0200 Subject: [PATCH 8/9] clean up constructor --- dht.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dht.go b/dht.go index 44467b88b..d7531a3f2 100644 --- a/dht.go +++ b/dht.go @@ -113,9 +113,8 @@ func New(ctx context.Context, h host.Host, options ...opts.Option) (*IpfsDHT, er dht.mode = ModeClient if !cfg.Client { - dht.mode = ModeServer - for _, p := range cfg.Protocols { - h.SetStreamHandler(p, dht.handleNewStream) + if err := dht.moveToServerMode(); err != nil { + return nil, err } } return dht, nil From 31f06f4b45e45cf9efbb06c07d90e79b5912ecb9 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 24 Jun 2019 17:22:50 +0200 Subject: [PATCH 9/9] some fixes and gomod --- dht.go | 13 +++++++++---- go.mod | 8 ++++---- go.sum | 27 +++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/dht.go b/dht.go index d7531a3f2..a938dbcd2 100644 --- a/dht.go +++ b/dht.go @@ -509,12 +509,11 @@ func (dht *IpfsDHT) newContextWithLocalTags(ctx context.Context, extraTags ...ta func (dht *IpfsDHT) handleProtocolChanges(ctx context.Context) { // register for event bus protocol ID changes - ch := make(chan event.EvtPeerProtocolsUpdated, 8) - cancel, err := dht.host.EventBus().Subscribe(ch) + sub, err := dht.host.EventBus().Subscribe(new(event.EvtPeerProtocolsUpdated)) if err != nil { panic(err) } - defer cancel() + defer sub.Close() pmap := make(map[protocol.ID]bool) for _, p := range dht.protocols { @@ -523,7 +522,13 @@ func (dht *IpfsDHT) handleProtocolChanges(ctx context.Context) { for { select { - case e, ok := <-ch: + case ie, ok := <-sub.Out(): + e, ok := ie.(event.EvtPeerProtocolsUpdated) + if !ok { + logger.Errorf("got wrong type from subscription: %T", ie) + return + } + if !ok { return } diff --git a/go.mod b/go.mod index a29d27561..96fd70a96 100644 --- a/go.mod +++ b/go.mod @@ -9,14 +9,14 @@ require ( github.com/ipfs/go-log v0.0.1 github.com/ipfs/go-todocounter v0.0.1 github.com/jbenet/goprocess v0.1.3 - github.com/libp2p/go-libp2p v0.1.0 - github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p v0.2.0 + github.com/libp2p/go-libp2p-core v0.0.6 github.com/libp2p/go-libp2p-kbucket v0.2.0 - github.com/libp2p/go-libp2p-peerstore v0.1.0 + github.com/libp2p/go-libp2p-peerstore v0.1.1 github.com/libp2p/go-libp2p-record v0.1.0 github.com/libp2p/go-libp2p-routing v0.1.0 github.com/libp2p/go-libp2p-swarm v0.1.0 - github.com/libp2p/go-libp2p-testing v0.0.3 + github.com/libp2p/go-libp2p-testing v0.0.4 github.com/mr-tron/base58 v1.1.2 github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-dns v0.0.2 diff --git a/go.sum b/go.sum index 2a04aeb97..2bc4a5b95 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,11 @@ github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETF github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c h1:aEbSeNALREWXk0G7UdNhR3ayBV7tZ4M2PNmnrCAph6Q= +github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= @@ -104,18 +107,31 @@ github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOS github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-eventbus v0.0.2 h1:L9eslON8FjFBJlyUs9fyEZKnxSqZd2AMDUNldPrqmZI= +github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= github.com/libp2p/go-libp2p v0.1.0 h1:8VXadcPNni74ODoZ+7326LMAppFYmz1fRQOUuT5iZvQ= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= +github.com/libp2p/go-libp2p v0.2.0 h1:hYJgMZYdcwHzDHKb/nLePrtuSP3LqkGIFOQ2aIbKOCM= +github.com/libp2p/go-libp2p v0.2.0/go.mod h1:5nXHmf4Hs+NmkaMsmWcFJgUHTbYNpCfxr20lwus0p1c= +github.com/libp2p/go-libp2p-autonat v0.1.0 h1:aCWAu43Ri4nU0ZPO7NyLzUvvfqd0nE3dX0R/ZGYVgOU= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-blankhost v0.1.3/go.mod h1:KML1//wiKR8vuuJO0y3LUd1uLv+tlkGTAr3jC0S5cLg= +github.com/libp2p/go-libp2p-circuit v0.1.0 h1:eniLL3Y9aq/sryfyV1IAHj5rlvuyj3b7iz8tSiZpdhY= github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= +github.com/libp2p/go-libp2p-core v0.0.5 h1:CMyp9Fh9BstTV4nmAEkc76H1EM9QN98Jogtap2LLAeo= +github.com/libp2p/go-libp2p-core v0.0.5/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= +github.com/libp2p/go-libp2p-core v0.0.6 h1:SsYhfWJ47vLP1Rd9/0hqEm/W/PlFbC/3YLZyLCcvo1w= +github.com/libp2p/go-libp2p-core v0.0.6/go.mod h1:0d9xmaYAVY5qmbp/fcgxHT3ZJsLjYeYPMJAUKpaCHrE= github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-discovery v0.1.0 h1:j+R6cokKcGbnZLf4kcNwpx6mDEUPF3N6SrqMymQhmvs= github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= github.com/libp2p/go-libp2p-kbucket v0.2.0 h1:FB2a0VkOTNGTP5gu/I444u4WabNM9V1zCkQcWb7zajI= github.com/libp2p/go-libp2p-kbucket v0.2.0/go.mod h1:JNymBToym3QXKBMKGy3m29+xprg0EVr/GJFHxFEdgh8= @@ -132,6 +148,8 @@ github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUje github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-peerstore v0.1.1 h1:AJZF2sPpVo+0aAr3IrRiGVsPjJm1INlUQ9EGClgXJ4M= +github.com/libp2p/go-libp2p-peerstore v0.1.1/go.mod h1:ojEWnwG7JpJLkJ9REWYXQslyu9ZLrPWPEcCdiZzEbSM= github.com/libp2p/go-libp2p-record v0.1.0 h1:wHwBGbFzymoIl69BpgwIu0O6ta3TXGcMPvHUAcodzRc= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-routing v0.1.0 h1:hFnj3WR3E2tOcKaGpyzfP4gvFZ3t8JkQmbapN0Ct+oU= @@ -143,10 +161,14 @@ github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evl github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.4 h1:Qev57UR47GcLPXWjrunv5aLIQGO4n9mhI/8/EIrEEFc= +github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-libp2p-yamux v0.2.1 h1:Q3XYNiKCC2vIxrvUJL+Jg1kiyeEaIDNKLjgEjo3VQdI= +github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-mplex v0.0.3 h1:YiMaevQcZtFU6DmKIF8xEO0vaui5kM5HJ1V1xkWQv14= @@ -167,9 +189,12 @@ github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROm github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-ws-transport v0.1.0 h1:F+0OvvdmPTDsVc4AjPHjV7L7Pk1B7D5QwtDcKE2oag4= github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/libp2p/go-yamux v1.2.3 h1:xX8A36vpXb59frIzWFdEgptLMsOANMFq2K7fPRlunYI= +github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= @@ -260,6 +285,8 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/Le golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443 h1:IcSOAf4PyMp3U3XbIEj1/xJ2BjNN2jWv7JoyOsMxXUU= +golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=