Skip to content

Commit 3694854

Browse files
authored
network/retrieval: add balances to the retrieval protocol (ethersphere#1758)
1 parent 174d094 commit 3694854

File tree

4 files changed

+27
-16
lines changed

4 files changed

+27
-16
lines changed

network/retrieval/retrieve.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/ethersphere/swarm/p2p/protocols"
3939
"github.com/ethersphere/swarm/spancontext"
4040
"github.com/ethersphere/swarm/storage"
41+
"github.com/ethersphere/swarm/swap"
4142
opentracing "github.com/opentracing/opentracing-go"
4243
olog "github.com/opentracing/opentracing-go/log"
4344
)
@@ -53,7 +54,7 @@ var (
5354

5455
retrievalPeers = metrics.GetOrRegisterGauge("network.retrieve.peers", nil)
5556

56-
Spec = &protocols.Spec{
57+
spec = &protocols.Spec{
5758
Name: "bzz-retrieve",
5859
Version: 1,
5960
MaxMsgSize: 10 * 1024 * 1024,
@@ -79,11 +80,11 @@ func (p *RetrievalPrices) Price(msg interface{}) *protocols.Price {
7980
}
8081

8182
func (p *RetrievalPrices) retrieveRequestPrice() uint64 {
82-
return uint64(1)
83+
return swap.RetrieveRequestPrice
8384
}
8485

8586
func (p *RetrievalPrices) chunkDeliveryPrice() uint64 {
86-
return uint64(1)
87+
return swap.ChunkDeliveryPrice
8788
}
8889

8990
// createPriceOracle sets up a matrix which can be queried to get
@@ -111,21 +112,27 @@ type Retrieval struct {
111112
netStore *storage.NetStore
112113
kad *network.Kademlia
113114
peers map[enode.ID]*Peer
115+
spec *protocols.Spec
114116
prices protocols.Prices
115117
logger log.Logger
116118
quit chan struct{}
117119
}
118120

119121
// New returns a new instance of the retrieval protocol handler
120-
func New(kad *network.Kademlia, ns *storage.NetStore, baseKey []byte) *Retrieval {
122+
func New(kad *network.Kademlia, ns *storage.NetStore, baseKey []byte, balance protocols.Balance) *Retrieval {
121123
r := &Retrieval{
122124
kad: kad,
123125
peers: make(map[enode.ID]*Peer),
126+
spec: spec,
124127
netStore: ns,
125128
logger: log.New("base", hex.EncodeToString(baseKey)[:16]),
126129
quit: make(chan struct{}),
127130
}
128131
r.createPriceOracle()
132+
if balance != nil && !reflect.ValueOf(balance).IsNil() {
133+
// swap is enabled, so setup the hook
134+
r.spec.Hook = protocols.NewAccounting(balance, r.prices)
135+
}
129136
return r
130137
}
131138

@@ -226,7 +233,7 @@ func (r *Retrieval) findPeer(ctx context.Context, req *storage.Request) (retPeer
226233
r.kad.EachConn(req.Addr[:], 255, func(p *network.Peer, po int) bool {
227234
id := p.ID()
228235

229-
if !p.HasCap(Spec.Name) {
236+
if !p.HasCap(r.spec.Name) {
230237
return true
231238
}
232239

@@ -453,16 +460,16 @@ func (r *Retrieval) Stop() error {
453460
func (r *Retrieval) Protocols() []p2p.Protocol {
454461
return []p2p.Protocol{
455462
{
456-
Name: Spec.Name,
457-
Version: Spec.Version,
458-
Length: Spec.Length(),
463+
Name: r.spec.Name,
464+
Version: r.spec.Version,
465+
Length: r.spec.Length(),
459466
Run: r.runProtocol,
460467
},
461468
}
462469
}
463470

464471
func (r *Retrieval) runProtocol(p *p2p.Peer, rw p2p.MsgReadWriter) error {
465-
peer := protocols.NewPeer(p, rw, Spec)
472+
peer := protocols.NewPeer(p, rw, r.spec)
466473
bp := network.NewBzzPeer(peer)
467474

468475
return r.Run(bp)
@@ -471,3 +478,7 @@ func (r *Retrieval) runProtocol(p *p2p.Peer, rw p2p.MsgReadWriter) error {
471478
func (r *Retrieval) APIs() []rpc.API {
472479
return nil
473480
}
481+
482+
func (r *Retrieval) Spec() *protocols.Spec {
483+
return r.spec
484+
}

network/retrieval/retrieve_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func TestRequestFromPeers(t *testing.T) {
242242

243243
to.On(peer)
244244

245-
s := New(to, nil, to.BaseAddr())
245+
s := New(to, nil, to.BaseAddr(), nil)
246246

247247
req := storage.NewRequest(storage.Address(hash0[:]))
248248
id, err := s.findPeer(context.Background(), req)
@@ -273,7 +273,7 @@ func TestRequestFromPeersWithLightNode(t *testing.T) {
273273

274274
to.On(peer)
275275

276-
r := New(to, nil, to.BaseAddr())
276+
r := New(to, nil, to.BaseAddr(), nil)
277277
req := storage.NewRequest(storage.Address(hash0[:]))
278278

279279
// making a request which should return with "no peer found"
@@ -288,7 +288,7 @@ func TestRequestFromPeersWithLightNode(t *testing.T) {
288288
func TestHasPriceImplementation(t *testing.T) {
289289
addr := network.RandomAddr()
290290
to := network.NewKademlia(addr.OAddr, network.NewKadParams())
291-
r := New(to, nil, to.BaseAddr())
291+
r := New(to, nil, to.BaseAddr(), nil)
292292

293293
if r.prices == nil {
294294
t.Fatal("No prices implementation available for retrieve protocol")
@@ -336,7 +336,7 @@ func newBzzRetrieveWithLocalstore(ctx *adapters.ServiceContext, bucket *sync.Map
336336
return nil, nil, err
337337
}
338338

339-
r := New(kad, netStore, kad.BaseAddr())
339+
r := New(kad, netStore, kad.BaseAddr(), nil)
340340
netStore.RemoteGet = r.RequestFromPeers
341341
bucket.Store(bucketKeyFileStore, fileStore)
342342
bucket.Store(bucketKeyNetstore, netStore)

network/stream/v2/common_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func newSyncSimServiceFunc(o *SyncSimServiceOptions) func(ctx *adapters.ServiceC
127127
bucket.Store(bucketKeyFileStore, fileStore)
128128
bucket.Store(bucketKeyLocalStore, localStore)
129129

130-
ret := retrieval.New(kad, netStore, kad.BaseAddr())
130+
ret := retrieval.New(kad, netStore, kad.BaseAddr(), nil)
131131
netStore.RemoteGet = ret.RequestFromPeers
132132

133133
if o.InitialChunkCount > 0 {

swarm.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
208208
common.FromHex(config.BzzKey),
209209
network.NewKadParams(),
210210
)
211-
self.retrieval = retrieval.New(to, self.netStore, bzzconfig.OverlayAddr) // nodeID.Bytes())
211+
self.retrieval = retrieval.New(to, self.netStore, bzzconfig.OverlayAddr, self.swap) // nodeID.Bytes())
212212
self.netStore.RemoteGet = self.retrieval.RequestFromPeers
213213

214214
feedsHandler.SetStore(self.netStore)
@@ -228,7 +228,7 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
228228

229229
log.Debug("Setup local storage")
230230

231-
self.bzz = network.NewBzz(bzzconfig, to, self.stateStore, stream.Spec, retrieval.Spec, self.streamer.Run, self.retrieval.Run)
231+
self.bzz = network.NewBzz(bzzconfig, to, self.stateStore, stream.Spec, self.retrieval.Spec(), self.streamer.Run, self.retrieval.Run)
232232

233233
self.bzzEth = bzzeth.New()
234234

0 commit comments

Comments
 (0)