|
|
|
@ -1501,18 +1501,20 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er |
|
|
|
|
rollbackErr = err |
|
|
|
|
|
|
|
|
|
// If some headers were inserted, track them as uncertain
|
|
|
|
|
if n > 0 && rollback == 0 { |
|
|
|
|
if (mode == FastSync || frequency > 1) && n > 0 && rollback == 0 { |
|
|
|
|
rollback = chunk[0].Number.Uint64() |
|
|
|
|
} |
|
|
|
|
log.Debug("Invalid header encountered", "number", chunk[n].Number, "hash", chunk[n].Hash(), "parent", chunk[n].ParentHash, "err", err) |
|
|
|
|
log.Warn("Invalid header encountered", "number", chunk[n].Number, "hash", chunk[n].Hash(), "parent", chunk[n].ParentHash, "err", err) |
|
|
|
|
return fmt.Errorf("%w: %v", errInvalidChain, err) |
|
|
|
|
} |
|
|
|
|
// All verifications passed, track all headers within the alloted limits
|
|
|
|
|
head := chunk[len(chunk)-1].Number.Uint64() |
|
|
|
|
if head-rollback > uint64(fsHeaderSafetyNet) { |
|
|
|
|
rollback = head - uint64(fsHeaderSafetyNet) |
|
|
|
|
} else { |
|
|
|
|
rollback = 1 |
|
|
|
|
if mode == FastSync { |
|
|
|
|
head := chunk[len(chunk)-1].Number.Uint64() |
|
|
|
|
if head-rollback > uint64(fsHeaderSafetyNet) { |
|
|
|
|
rollback = head - uint64(fsHeaderSafetyNet) |
|
|
|
|
} else { |
|
|
|
|
rollback = 1 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Unless we're doing light chains, schedule the headers for associated content retrieval
|
|
|
|
|