Skip to content

Commit abbd103

Browse files
committed
fix el client readiness checks
1 parent 6a2224a commit abbd103

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

clients/execution/clientlogic.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -270,20 +270,16 @@ func (client *Client) pollClientHead() error {
270270
ctx, cancel := context.WithTimeout(client.clientCtx, 10*time.Second)
271271
defer cancel()
272272

273-
latestHeader, err := client.rpcClient.GetLatestHeader(ctx)
273+
headNumber, headHash, err := client.rpcClient.GetLatestHead(ctx)
274274
if err != nil {
275-
return fmt.Errorf("could not get latest header: %v", err)
276-
}
277-
278-
if latestHeader == nil {
279-
return fmt.Errorf("could not find latest header")
275+
return fmt.Errorf("could not get latest head: %v", err)
280276
}
281277

282278
client.headMutex.Lock()
283279
defer client.headMutex.Unlock()
284280

285-
client.headNumber = latestHeader.Number.Uint64()
286-
client.headHash = latestHeader.Hash()
281+
client.headNumber = headNumber
282+
client.headHash = headHash
287283

288284
return nil
289285
}

clients/execution/rpc/executionapi.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strconv"
99

1010
"github.com/ethereum/go-ethereum/common"
11+
"github.com/ethereum/go-ethereum/common/hexutil"
1112
"github.com/ethereum/go-ethereum/core/types"
1213
"github.com/ethereum/go-ethereum/ethclient"
1314
"github.com/ethereum/go-ethereum/p2p"
@@ -192,13 +193,26 @@ func (ec *ExecutionClient) UninstallBlockFilter(ctx context.Context, filterId Bl
192193
return result, err
193194
}
194195

195-
func (ec *ExecutionClient) GetLatestHeader(ctx context.Context) (*types.Header, error) {
196-
header, err := ec.ethClient.HeaderByNumber(ctx, nil)
196+
// GetLatestHead returns the latest block's number and hash as reported by the
197+
// execution node. The hash is read from the node's response rather than
198+
// recomputed from the header locally, which would be wrong whenever the header
199+
// carries fields the local go-ethereum types do not know about.
200+
func (ec *ExecutionClient) GetLatestHead(ctx context.Context) (uint64, common.Hash, error) {
201+
var head struct {
202+
Number *hexutil.Big `json:"number"`
203+
Hash common.Hash `json:"hash"`
204+
}
205+
206+
err := ec.rpcClient.CallContext(ctx, &head, "eth_getBlockByNumber", "latest", false)
197207
if err != nil {
198-
return nil, err
208+
return 0, common.Hash{}, err
199209
}
200210

201-
return header, nil
211+
if head.Number == nil {
212+
return 0, common.Hash{}, fmt.Errorf("no latest block returned")
213+
}
214+
215+
return head.Number.ToInt().Uint64(), head.Hash, nil
202216
}
203217

204218
func (ec *ExecutionClient) GetLatestBlock(ctx context.Context) (*types.Block, error) {

0 commit comments

Comments
 (0)