Skip to content

Commit 4ea9eea

Browse files
eth/catalyst: fetch header on forkchoiceUpdated (#31928)
closes #31254 --------- Co-authored-by: Gary Rong <[email protected]>
1 parent fa8f391 commit 4ea9eea

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

eth/catalyst/api.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,14 @@ func (api *ConsensusAPI) forkchoiceUpdated(update engine.ForkchoiceStateV1, payl
283283
// that should be fixed, not papered over.
284284
header := api.remoteBlocks.get(update.HeadBlockHash)
285285
if header == nil {
286-
log.Warn("Forkchoice requested unknown head", "hash", update.HeadBlockHash)
287-
return engine.STATUS_SYNCING, nil
286+
log.Warn("Fetching the unknown forkchoice head from network", "hash", update.HeadBlockHash)
287+
retrievedHead, err := api.eth.Downloader().GetHeader(update.HeadBlockHash)
288+
if err != nil {
289+
log.Warn("Could not retrieve unknown head from peers")
290+
return engine.STATUS_SYNCING, nil
291+
}
292+
api.remoteBlocks.put(retrievedHead.Hash(), retrievedHead)
293+
header = retrievedHead
288294
}
289295
// If the finalized hash is known, we can direct the downloader to move
290296
// potentially more data to the freezer from the get go.

eth/downloader/beacondevsync.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"time"
2222

2323
"github.com/ethereum/go-ethereum/common"
24+
"github.com/ethereum/go-ethereum/core/types"
2425
"github.com/ethereum/go-ethereum/log"
2526
)
2627

@@ -48,34 +49,39 @@ func (d *Downloader) BeaconDevSync(mode SyncMode, hash common.Hash, stop chan st
4849
return errors.New("stop requested")
4950
default:
5051
}
51-
// Pick a random peer to sync from and keep retrying if none are yet
52-
// available due to fresh startup
53-
d.peers.lock.RLock()
54-
var peer *peerConnection
55-
for _, peer = range d.peers.peers {
56-
break
52+
header, err := d.GetHeader(hash)
53+
if err != nil {
54+
time.Sleep(time.Second)
55+
continue
5756
}
58-
d.peers.lock.RUnlock()
57+
return d.BeaconSync(mode, header, header)
58+
}
59+
}
60+
61+
// GetHeader tries to retrieve the header with a given hash from a random peer.
62+
func (d *Downloader) GetHeader(hash common.Hash) (*types.Header, error) {
63+
// Pick a random peer to sync from and keep retrying if none are yet
64+
// available due to fresh startup
65+
d.peers.lock.RLock()
66+
defer d.peers.lock.RUnlock()
5967

68+
for _, peer := range d.peers.peers {
6069
if peer == nil {
61-
time.Sleep(time.Second)
62-
continue
70+
return nil, errors.New("could not find peer")
6371
}
6472
// Found a peer, attempt to retrieve the header whilst blocking and
6573
// retry if it fails for whatever reason
66-
log.Info("Attempting to retrieve sync target", "peer", peer.id)
74+
log.Debug("Attempting to retrieve sync target", "peer", peer.id, "hash", hash)
6775
headers, metas, err := d.fetchHeadersByHash(peer, hash, 1, 0, false)
6876
if err != nil || len(headers) != 1 {
69-
log.Warn("Failed to fetch sync target", "headers", len(headers), "err", err)
70-
time.Sleep(time.Second)
7177
continue
7278
}
7379
// Head header retrieved, if the hash matches, start the actual sync
7480
if metas[0] != hash {
75-
log.Error("Received invalid sync target", "want", hash, "have", metas[0])
76-
time.Sleep(time.Second)
81+
log.Warn("Received invalid sync target", "peer", peer.id, "want", hash, "have", metas[0])
7782
continue
7883
}
79-
return d.BeaconSync(mode, headers[0], headers[0])
84+
return headers[0], nil
8085
}
86+
return nil, errors.New("failed to fetch sync target")
8187
}

0 commit comments

Comments
 (0)