Commit 950bfeb5 authored by Hamdi Allam's avatar Hamdi Allam

fixes

parent 06de0e15
...@@ -59,10 +59,12 @@ func (c *client) FinalizedBlockHeight() (*big.Int, error) { ...@@ -59,10 +59,12 @@ func (c *client) FinalizedBlockHeight() (*big.Int, error) {
// **NOTE** Local devnet is having issues with the "finalized" block tag. Temp switch // **NOTE** Local devnet is having issues with the "finalized" block tag. Temp switch
// to "latest" to iterate faster locally but this needs to be updated // to "latest" to iterate faster locally but this needs to be updated
header := new(types.Header) var header *types.Header
err := c.rpc.CallContext(ctxwt, header, "eth_getBlockByNumber", "latest", false) err := c.rpc.CallContext(ctxwt, &header, "eth_getBlockByNumber", "latest", false)
if err != nil { if err != nil {
return nil, err return nil, err
} else if header == nil {
return nil, ethereum.NotFound
} }
return header.Number, nil return header.Number, nil
...@@ -73,10 +75,12 @@ func (c *client) BlockHeaderByHash(hash common.Hash) (*types.Header, error) { ...@@ -73,10 +75,12 @@ func (c *client) BlockHeaderByHash(hash common.Hash) (*types.Header, error) {
ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout) ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
defer cancel() defer cancel()
header := new(types.Header) var header *types.Header
err := c.rpc.CallContext(ctxwt, header, "eth_getBlockByHash", hash, false) err := c.rpc.CallContext(ctxwt, &header, "eth_getBlockByHash", hash, false)
if err != nil { if err != nil {
return nil, err return nil, err
} else if header == nil {
return nil, ethereum.NotFound
} }
// sanity check on the data returned // sanity check on the data returned
...@@ -92,10 +96,12 @@ func (c *client) BlockHeaderByNumber(number *big.Int) (*types.Header, error) { ...@@ -92,10 +96,12 @@ func (c *client) BlockHeaderByNumber(number *big.Int) (*types.Header, error) {
ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout) ctxwt, cancel := context.WithTimeout(context.Background(), defaultRequestTimeout)
defer cancel() defer cancel()
header := new(types.Header) var header *types.Header
err := c.rpc.CallContext(ctxwt, header, "eth_getBlockByNumber", toBlockNumArg(number), false) err := c.rpc.CallContext(ctxwt, &header, "eth_getBlockByNumber", toBlockNumArg(number), false)
if err != nil { if err != nil {
return nil, err return nil, err
} else if header == nil {
return nil, ethereum.NotFound
} }
return header, nil return header, nil
...@@ -105,6 +111,15 @@ func (c *client) BlockHeaderByNumber(number *big.Int) (*types.Header, error) { ...@@ -105,6 +111,15 @@ func (c *client) BlockHeaderByNumber(number *big.Int) (*types.Header, error) {
// are placed on the range such as blocks in the "latest", "safe" or "finalized" states. If the specified // are placed on the range such as blocks in the "latest", "safe" or "finalized" states. If the specified
// range is too large, `endHeight > latest`, the resulting list is truncated to the available headers // range is too large, `endHeight > latest`, the resulting list is truncated to the available headers
func (c *client) BlockHeadersByRange(startHeight, endHeight *big.Int) ([]types.Header, error) { func (c *client) BlockHeadersByRange(startHeight, endHeight *big.Int) ([]types.Header, error) {
// avoid the batch call if there's no range
if startHeight.Cmp(endHeight) == 0 {
header, err := c.BlockHeaderByNumber(startHeight)
if err != nil {
return nil, err
}
return []types.Header{*header}, nil
}
count := new(big.Int).Sub(endHeight, startHeight).Uint64() + 1 count := new(big.Int).Sub(endHeight, startHeight).Uint64() + 1
batchElems := make([]rpc.BatchElem, count) batchElems := make([]rpc.BatchElem, count)
for i := uint64(0); i < count; i++ { for i := uint64(0); i < count; i++ {
...@@ -191,7 +206,7 @@ type RPC interface { ...@@ -191,7 +206,7 @@ type RPC interface {
} }
type rpcClient struct { type rpcClient struct {
client *rpc.Client rpc *rpc.Client
metrics Metricer metrics Metricer
} }
...@@ -200,19 +215,19 @@ func newRPC(client *rpc.Client, metrics Metricer) RPC { ...@@ -200,19 +215,19 @@ func newRPC(client *rpc.Client, metrics Metricer) RPC {
} }
func (c *rpcClient) Close() { func (c *rpcClient) Close() {
c.client.Close() c.rpc.Close()
} }
func (c *rpcClient) CallContext(ctx context.Context, result any, method string, args ...any) error { func (c *rpcClient) CallContext(ctx context.Context, result any, method string, args ...any) error {
record := c.metrics.RecordRPCClientRequest(method) record := c.metrics.RecordRPCClientRequest(method)
err := c.client.CallContext(ctx, result, method, args) err := c.rpc.CallContext(ctx, result, method, args...)
record(err) record(err)
return err return err
} }
func (c *rpcClient) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error { func (c *rpcClient) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error {
record := c.metrics.RecordRPCClientBatchRequest(b) record := c.metrics.RecordRPCClientBatchRequest(b)
err := c.client.BatchCallContext(ctx, b) err := c.rpc.BatchCallContext(ctx, b)
record(err) record(err)
return err return err
} }
......
...@@ -2,6 +2,7 @@ package node ...@@ -2,6 +2,7 @@ package node
import ( import (
"errors" "errors"
"fmt"
"math/big" "math/big"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
...@@ -35,7 +36,7 @@ func (f *HeaderTraversal) LastHeader() *types.Header { ...@@ -35,7 +36,7 @@ func (f *HeaderTraversal) LastHeader() *types.Header {
func (f *HeaderTraversal) NextFinalizedHeaders(maxSize uint64) ([]types.Header, error) { func (f *HeaderTraversal) NextFinalizedHeaders(maxSize uint64) ([]types.Header, error) {
finalizedBlockHeight, err := f.ethClient.FinalizedBlockHeight() finalizedBlockHeight, err := f.ethClient.FinalizedBlockHeight()
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("unable to query latest finalized height: %w", err)
} }
if f.lastHeader != nil { if f.lastHeader != nil {
...@@ -55,7 +56,7 @@ func (f *HeaderTraversal) NextFinalizedHeaders(maxSize uint64) ([]types.Header, ...@@ -55,7 +56,7 @@ func (f *HeaderTraversal) NextFinalizedHeaders(maxSize uint64) ([]types.Header,
endHeight := clampBigInt(nextHeight, finalizedBlockHeight, maxSize) endHeight := clampBigInt(nextHeight, finalizedBlockHeight, maxSize)
headers, err := f.ethClient.BlockHeadersByRange(nextHeight, endHeight) headers, err := f.ethClient.BlockHeadersByRange(nextHeight, endHeight)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("error querying blocks by range: %w", err)
} }
numHeaders := len(headers) numHeaders := len(headers)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment