diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 7019daf9b..15b53985a 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -772,18 +772,18 @@ func (api *ConsensusAPI) GetPayloadBodiesByHashV1(hashes []common.Hash) []*engin // GetPayloadBodiesByRangeV1 implements engine_getPayloadBodiesByRangeV1 which allows for retrieval of a range // of block bodies by the engine api. -func (api *ConsensusAPI) GetPayloadBodiesByRangeV1(start, count uint64) ([]*engine.ExecutionPayloadBodyV1, error) { +func (api *ConsensusAPI) GetPayloadBodiesByRangeV1(start, count hexutil.Uint64) ([]*engine.ExecutionPayloadBodyV1, error) { if start == 0 || count == 0 || count > 1024 { return nil, engine.InvalidParams.With(fmt.Errorf("invalid start or count, start: %v count: %v", start, count)) } // limit count up until current current := api.eth.BlockChain().CurrentBlock().NumberU64() - end := start + count - if end > current { - end = current + last := uint64(start) + uint64(count) - 1 + if last > current { + last = current } - var bodies []*engine.ExecutionPayloadBodyV1 - for i := start; i < end; i++ { + bodies := make([]*engine.ExecutionPayloadBodyV1, 0, uint64(count)) + for i := uint64(start); i <= last; i++ { block := api.eth.BlockChain().GetBlockByNumber(i) bodies = append(bodies, getBody(block)) } diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 96613ac16..f7881415a 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -1311,9 +1311,14 @@ func TestGetBlockBodiesByRange(t *testing.T) { tests := []struct { results []*types.Body - start uint64 - count uint64 + start hexutil.Uint64 + count hexutil.Uint64 }{ + { + results: []*types.Body{blocks[9].Body()}, + start: 10, + count: 1, + }, // Genesis { results: []*types.Body{blocks[0].Body()}, @@ -1334,14 +1339,25 @@ func TestGetBlockBodiesByRange(t *testing.T) { }, // unavailable block { - results: []*types.Body{blocks[18].Body()}, + results: []*types.Body{blocks[18].Body(), blocks[19].Body()}, start: 19, count: 3, }, - // after range + // unavailable block + { + results: []*types.Body{blocks[19].Body()}, + start: 20, + count: 2, + }, + { + results: []*types.Body{blocks[19].Body()}, + start: 20, + count: 1, + }, + // whole range unavailable { results: make([]*types.Body, 0), - start: 20, + start: 22, count: 2, }, } @@ -1354,11 +1370,11 @@ func TestGetBlockBodiesByRange(t *testing.T) { if len(result) == len(test.results) { for i, r := range result { if !equalBody(test.results[i], r) { - t.Fatalf("test %v: invalid response: expected %+v got %+v", k, test.results[i], r) + t.Fatalf("test %d: invalid response: expected \n%+v\ngot\n%+v", k, test.results[i], r) } } } else { - t.Fatalf("invalid length want %v got %v", len(test.results), len(result)) + t.Fatalf("test %d: invalid length want %v got %v", k, len(test.results), len(result)) } } } @@ -1369,8 +1385,8 @@ func TestGetBlockBodiesByRangeInvalidParams(t *testing.T) { defer node.Close() tests := []struct { - start uint64 - count uint64 + start hexutil.Uint64 + count hexutil.Uint64 }{ // Genesis {