eth/downloader: resolve local header by hash for beacon sync (#24691)
* eth/downlaoder: resolve local header by hash for beacon sync * eth/downloader: fix error message * eth/downloader: cap the reverse header resolving * eth/downloader: re-enable tests * eth/downloader: add warning logs
This commit is contained in:
@ -263,10 +263,23 @@ func (d *Downloader) findBeaconAncestor() (uint64, error) {
|
||||
// fetchBeaconHeaders feeds skeleton headers to the downloader queue for scheduling
|
||||
// until sync errors or is finished.
|
||||
func (d *Downloader) fetchBeaconHeaders(from uint64) error {
|
||||
head, _, err := d.skeleton.Bounds()
|
||||
head, tail, err := d.skeleton.Bounds()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// A part of headers are not in the skeleton space, try to resolve
|
||||
// them from the local chain. Note the range should be very short
|
||||
// and it should only happen when there are less than 64 post-merge
|
||||
// blocks in the network.
|
||||
var localHeaders []*types.Header
|
||||
if from < tail.Number.Uint64() {
|
||||
count := tail.Number.Uint64() - from
|
||||
if count > uint64(fsMinFullBlocks) {
|
||||
return fmt.Errorf("invalid origin (%d) of beacon sync (%d)", from, tail.Number)
|
||||
}
|
||||
localHeaders = d.readHeaderRange(tail, int(count))
|
||||
log.Warn("Retrieved beacon headers from local", "from", from, "count", count)
|
||||
}
|
||||
for {
|
||||
// Retrieve a batch of headers and feed it to the header processor
|
||||
var (
|
||||
@ -275,8 +288,18 @@ func (d *Downloader) fetchBeaconHeaders(from uint64) error {
|
||||
)
|
||||
for i := 0; i < maxHeadersProcess && from <= head.Number.Uint64(); i++ {
|
||||
header := d.skeleton.Header(from)
|
||||
|
||||
// The header is not found in skeleton space, try to find it in local chain.
|
||||
if header == nil && from < tail.Number.Uint64() {
|
||||
dist := tail.Number.Uint64() - from
|
||||
if len(localHeaders) >= int(dist) {
|
||||
header = localHeaders[dist-1]
|
||||
}
|
||||
}
|
||||
// The header is still missing, the beacon sync is corrupted and bail out
|
||||
// the error here.
|
||||
if header == nil {
|
||||
header = d.lightchain.GetHeaderByNumber(from)
|
||||
return fmt.Errorf("missing beacon header %d", from)
|
||||
}
|
||||
headers = append(headers, header)
|
||||
hashes = append(hashes, headers[i].Hash())
|
||||
|
Reference in New Issue
Block a user