Skip to content

Commit

Permalink
ethrpc: add batch header get to Provider
Browse files Browse the repository at this point in the history
  • Loading branch information
marino39 committed May 17, 2024
1 parent 2f6e828 commit 9f79991
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion cmd/chain-watch/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (
)

var ETH_NODE_URL = "http://localhost:8887/polygon"
var ETH_NODE_WSS_URL = ""
var ETH_NODE_WSS_URL = "ws://localhost:8887/polygon/0xhorizon31337"

const SNAPSHOT_ENABLED = false

Expand Down
20 changes: 20 additions & 0 deletions ethrpc/ethrpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,26 @@ func (p *Provider) HeaderByNumber(ctx context.Context, blockNum *big.Int) (*type
return head, err
}

func (p *Provider) HeadersByNumbers(ctx context.Context, blockNumbers []*big.Int) ([]*types.Header, error) {
var headers = make([]*types.Header, len(blockNumbers))

var calls []Call
for index, blockNum := range blockNumbers {
calls = append(calls, HeaderByNumber(blockNum).Into(&headers[index]))
}

_, err := p.Do(ctx, calls...)
return headers, err
}

func (p *Provider) HeadersByNumberRange(ctx context.Context, fromBlockNumber, toBlockNumber *big.Int) ([]*types.Header, error) {
var blockNumbers []*big.Int
for i := big.NewInt(0).Set(fromBlockNumber); i.Cmp(toBlockNumber) < 0; i.Add(i, big.NewInt(1)) {
blockNumbers = append(blockNumbers, big.NewInt(0).Set(i))
}
return p.HeadersByNumbers(ctx, blockNumbers)
}

func (p *Provider) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, pending bool, err error) {
_, err = p.Do(ctx, TransactionByHash(hash).Into(&tx, &pending))
if err == nil && tx == nil {
Expand Down
31 changes: 31 additions & 0 deletions ethrpc/ethrpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,37 @@ func TestBlockByNumber(t *testing.T) {
}
}

func TestHeadsByNumbers(t *testing.T) {
p, err := ethrpc.NewProvider("https://nodes.sequence.app/polygon")
require.NoError(t, err)

{
headers, err := p.HeadersByNumbers(context.Background(), []*big.Int{big.NewInt(1_000_000), big.NewInt(1_000_001)})
require.NoError(t, err)
require.NotNil(t, headers)
require.Len(t, headers, 2)
require.Equal(t, uint64(1_000_000), headers[0].Number.Uint64())
require.Equal(t, uint64(1_000_001), headers[1].Number.Uint64())
}
}

func TestHeadsByNumberRange(t *testing.T) {
p, err := ethrpc.NewProvider("https://nodes.sequence.app/polygon")
require.NoError(t, err)

{
headers, err := p.HeadersByNumberRange(context.Background(), big.NewInt(1_000_000), big.NewInt(1_000_005))
require.NoError(t, err)
require.NotNil(t, headers)
require.Len(t, headers, 5)
require.Equal(t, uint64(1_000_000), headers[0].Number.Uint64())
require.Equal(t, uint64(1_000_001), headers[1].Number.Uint64())
require.Equal(t, uint64(1_000_002), headers[2].Number.Uint64())
require.Equal(t, uint64(1_000_003), headers[3].Number.Uint64())
require.Equal(t, uint64(1_000_004), headers[4].Number.Uint64())
}
}

func ExampleBatchCall() {
p, err := ethrpc.NewProvider("https://nodes.sequence.app/polygon")
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions ethrpc/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ type Interface interface {
// HeaderByNumber = eth_getBlockByHash (true)
HeaderByNumber(ctx context.Context, blockNum *big.Int) (*types.Header, error)

// HeadersByNumbers = batch of eth_getHeaderByNumber
HeadersByNumbers(ctx context.Context, blockNumbers []*big.Int) ([]*types.Header, error)

// HeadersByNumberRange = batch of eth_getHeaderByNumber
HeadersByNumberRange(ctx context.Context, fromBlockNumber, toBlockNumber *big.Int) ([]*types.Header, error)

// TransactionByHash = eth_getTransactionByHash
TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, pending bool, err error)

Expand Down

0 comments on commit 9f79991

Please sign in to comment.