|
|
|
@ -99,6 +99,7 @@ type Downloader struct { |
|
|
|
|
mode SyncMode // Synchronisation mode defining the strategy used (per sync cycle)
|
|
|
|
|
mux *event.TypeMux // Event multiplexer to announce sync operation events
|
|
|
|
|
|
|
|
|
|
genesis uint64 // Genesis block number to limit sync to (e.g. light client CHT)
|
|
|
|
|
queue *queue // Scheduler for selecting the hashes to download
|
|
|
|
|
peers *peerSet // Set of active peers from which download can proceed
|
|
|
|
|
stateDB ethdb.Database |
|
|
|
@ -664,7 +665,28 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) |
|
|
|
|
} |
|
|
|
|
p.log.Debug("Looking for common ancestor", "local", localHeight, "remote", remoteHeight) |
|
|
|
|
if localHeight >= MaxForkAncestry { |
|
|
|
|
// We're above the max reorg threshold, find the earliest fork point
|
|
|
|
|
floor = int64(localHeight - MaxForkAncestry) |
|
|
|
|
|
|
|
|
|
// If we're doing a light sync, ensure the floor doesn't go below the CHT, as
|
|
|
|
|
// all headers before that point will be missing.
|
|
|
|
|
if d.mode == LightSync { |
|
|
|
|
// If we dont know the current CHT position, find it
|
|
|
|
|
if d.genesis == 0 { |
|
|
|
|
header := d.lightchain.CurrentHeader() |
|
|
|
|
for header != nil { |
|
|
|
|
d.genesis = header.Number.Uint64() |
|
|
|
|
if floor >= int64(d.genesis)-1 { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
header = d.lightchain.GetHeaderByHash(header.ParentHash) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// We already know the "genesis" block number, cap floor to that
|
|
|
|
|
if floor < int64(d.genesis)-1 { |
|
|
|
|
floor = int64(d.genesis) - 1 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
from, count, skip, max := calculateRequestSpan(remoteHeight, localHeight) |
|
|
|
|
|
|
|
|
|