diff --git a/swarm/network/stream/delivery.go b/swarm/network/stream/delivery.go index e1a13fe8d5..489d2a0293 100644 --- a/swarm/network/stream/delivery.go +++ b/swarm/network/stream/delivery.go @@ -259,6 +259,11 @@ func (d *Delivery) RequestFromPeers(ctx context.Context, req *network.Request) ( //log.Warn("Delivery.RequestFromPeers: peer not found", "id", id) return true } + // nodes that do not provide stream protocol + // should not be requested, e.g. bootnodes + if !hasStreamCap(sp.Peer.Peer) { + return true + } spID = &id return false }) diff --git a/swarm/network/stream/delivery_test.go b/swarm/network/stream/delivery_test.go index 70d3829b3f..13e13c0f58 100644 --- a/swarm/network/stream/delivery_test.go +++ b/swarm/network/stream/delivery_test.go @@ -285,7 +285,7 @@ func TestRequestFromPeers(t *testing.T) { addr := network.RandomAddr() to := network.NewKademlia(addr.OAddr, network.NewKadParams()) delivery := NewDelivery(to, nil) - protocolsPeer := protocols.NewPeer(p2p.NewPeer(dummyPeerID, "dummy", nil), nil, nil) + protocolsPeer := protocols.NewPeer(p2p.NewPeer(dummyPeerID, "dummy", []p2p.Cap{{Name: "stream"}}), nil, nil) peer := network.NewPeer(&network.BzzPeer{ BzzAddr: network.RandomAddr(), LightNode: false, diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go index 989fbaeb09..d0e12f5b5c 100644 --- a/swarm/network/stream/stream.go +++ b/swarm/network/stream/stream.go @@ -516,6 +516,11 @@ func (r *Registry) requestPeerSubscriptions(kad *network.Kademlia, subs map[enod // nil as base takes the node's base; we need to pass 255 as `EachConn` runs // from deepest bins backwards kad.EachConn(nil, 255, func(p *network.Peer, po int) bool { + // nodes that do not provide stream protocol + // should not be subscribed, e.g. bootnodes + if !hasStreamCap(p.Peer.Peer) { + return true + } //if the peer's bin is shallower than the kademlia depth, //only the peer's bin should be subscribed if po < kadDepth { @@ -924,3 +929,13 @@ func (api *API) SubscribeStream(peerId enode.ID, s Stream, history *Range, prior func (api *API) UnsubscribeStream(peerId enode.ID, s Stream) error { return api.streamer.Unsubscribe(peerId, s) } + +// hasStreamCap check if p2p.Peer the "stream" capability. +func hasStreamCap(p *p2p.Peer) (yes bool) { + for _, c := range p.Caps() { + if c.Name == "stream" { + return true + } + } + return false +}