diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-11-28 20:40:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-28 20:40:32 +0800 |
commit | 8fdbbef72d3bedc245f004ae0d475f9ea228cd55 (patch) | |
tree | 549ca92dc8c5680f013a22d85d53ef2649633fdd | |
parent | 8696986547a859b7a3e9f406dea911b35f0bcd62 (diff) | |
parent | 174083c3ae0b6217dff0ced98ec7f73e53e24b04 (diff) | |
download | go-tangerine-8fdbbef72d3bedc245f004ae0d475f9ea228cd55.tar.gz go-tangerine-8fdbbef72d3bedc245f004ae0d475f9ea228cd55.tar.zst go-tangerine-8fdbbef72d3bedc245f004ae0d475f9ea228cd55.zip |
Merge pull request #18196 from karalabe/downloader-cht-fix
eth/downloader: fix light client cht binary search issue
-rw-r--r-- | eth/downloader/downloader.go | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f81a5cbac..3a177ab9d 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -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) |