Skip to content

Commit

Permalink
Handle Zero Root Requests (#7151)
Browse files Browse the repository at this point in the history
* handle zero root requests
* clean up
* Merge refs/heads/master into handleZeroRoots
* Merge refs/heads/master into handleZeroRoots
* Merge branch 'master' into handleZeroRoots
  • Loading branch information
nisdas committed Sep 1, 2020
1 parent b4c0a89 commit 2349012
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 3 deletions.
4 changes: 4 additions & 0 deletions beacon-chain/sync/rate_limiter.go
Expand Up @@ -75,6 +75,10 @@ func (l *limiter) validateRequest(stream network.Stream, amt uint64) error {
}
key := stream.Conn().RemotePeer().String()
remaining := collector.Remaining(key)
// Treat each request as a minimum of 1.
if amt == 0 {
amt = 1
}
if amt > uint64(remaining) {
l.p2p.Peers().Scorers().BadResponsesScorer().Increment(stream.Conn().RemotePeer())
if l.p2p.Peers().IsBad(stream.Conn().RemotePeer()) {
Expand Down
9 changes: 6 additions & 3 deletions beacon-chain/sync/rpc_beacon_blocks_by_root.go
Expand Up @@ -70,7 +70,13 @@ func (s *Service) beaconBlocksRootRPCHandler(ctx context.Context, msg interface{
if !ok {
return errors.New("message is not type [][32]byte")
}
if err := s.rateLimiter.validateRequest(stream, uint64(len(blockRoots))); err != nil {
return err
}
if len(blockRoots) == 0 {
// Add to rate limiter in the event no
// roots are requested.
s.rateLimiter.add(stream, 1)
resp, err := s.generateErrorResponse(responseCodeInvalidRequest, "no block roots provided in request")
if err != nil {
log.WithError(err).Debug("Failed to generate a response error")
Expand All @@ -79,9 +85,6 @@ func (s *Service) beaconBlocksRootRPCHandler(ctx context.Context, msg interface{
}
return errors.New("no block roots provided")
}
if err := s.rateLimiter.validateRequest(stream, uint64(len(blockRoots))); err != nil {
return err
}

if uint64(len(blockRoots)) > params.BeaconNetworkConfig().MaxRequestBlocks {
resp, err := s.generateErrorResponse(responseCodeInvalidRequest, "requested more than the max block limit")
Expand Down
32 changes: 32 additions & 0 deletions beacon-chain/sync/rpc_beacon_blocks_by_root_test.go
Expand Up @@ -140,6 +140,38 @@ func TestRecentBeaconBlocks_RPCRequestSent(t *testing.T) {
}
}

func TestRecentBeaconBlocksRPCHandler_HandleZeroBlocks(t *testing.T) {
p1 := p2ptest.NewTestP2P(t)
p2 := p2ptest.NewTestP2P(t)
p1.Connect(p2)
assert.Equal(t, 1, len(p1.BHost.Network().Peers()), "Expected peers to be connected")
d, _ := db.SetupDB(t)

r := &Service{p2p: p1, db: d, rateLimiter: newRateLimiter(p1)}
pcl := protocol.ID("/testing")
topic := string(pcl)
r.rateLimiter.limiterMap[topic] = leakybucket.NewCollector(1, 1, false)

var wg sync.WaitGroup
wg.Add(1)
p2.BHost.SetStreamHandler(pcl, func(stream network.Stream) {
defer wg.Done()
expectFailure(t, 1, "no block roots provided in request", stream)
})

stream1, err := p1.BHost.NewStream(context.Background(), p2.BHost.ID(), pcl)
require.NoError(t, err)
err = r.beaconBlocksRootRPCHandler(context.Background(), [][32]byte{}, stream1)
assert.ErrorContains(t, "no block roots provided", err)
if testutil.WaitTimeout(&wg, 1*time.Second) {
t.Fatal("Did not receive stream within 1 sec")
}

lter, err := r.rateLimiter.retrieveCollector(topic)
require.NoError(t, err)
assert.Equal(t, 1, int(lter.Count(stream1.Conn().RemotePeer().String())))
}

type testList [][32]byte

func (*testList) Limit() uint64 {
Expand Down

0 comments on commit 2349012

Please sign in to comment.