diff options
author | Péter Szilágyi <peterke@gmail.com> | 2019-04-16 18:20:38 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2019-04-17 19:56:58 +0800 |
commit | d8787230faa07e078a183765271313a7d2c6bdf2 (patch) | |
tree | d31d955dd0cc0b44a7ba5a9ee0097f8e148e0db5 /eth/downloader/downloader.go | |
parent | cdae1c59abc32f85debfa29577fbf1ed036ebf73 (diff) | |
download | go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar.gz go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar.bz2 go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar.lz go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar.xz go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.tar.zst go-tangerine-d8787230faa07e078a183765271313a7d2c6bdf2.zip |
eth, les, light: enforce CHT checkpoints on fast-sync too
Diffstat (limited to 'eth/downloader/downloader.go')
-rw-r--r-- | eth/downloader/downloader.go | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 4db689f73..0ef833bb8 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -75,6 +75,7 @@ var ( errUnknownPeer = errors.New("peer is unknown or unhealthy") errBadPeer = errors.New("action from bad peer ignored") errStallingPeer = errors.New("peer is stalling") + errUnsyncedPeer = errors.New("unsynced peer") errNoPeers = errors.New("no peers to keep download active") errTimeout = errors.New("timeout") errEmptyHeaderSet = errors.New("empty header set by peer") @@ -99,10 +100,11 @@ 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 + checkpoint uint64 // Checkpoint block number to enforce head against (e.g. fast sync) + 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 rttEstimate uint64 // Round trip time to target for download requests rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops) @@ -205,15 +207,15 @@ type BlockChain interface { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(mode SyncMode, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(mode SyncMode, checkpoint uint64, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { if lightchain == nil { lightchain = chain } - dl := &Downloader{ mode: mode, stateDB: stateDb, mux: mux, + checkpoint: checkpoint, queue: newQueue(), peers: newPeerSet(), rttEstimate: uint64(rttMaxEstimate), @@ -326,7 +328,7 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode case nil: case errBusy: - case errTimeout, errBadPeer, errStallingPeer, + case errTimeout, errBadPeer, errStallingPeer, errUnsyncedPeer, errEmptyHeaderSet, errPeersUnavailable, errTooOld, errInvalidAncestor, errInvalidChain: log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err) @@ -577,6 +579,10 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { return nil, errBadPeer } head := headers[0] + if d.mode == FastSync && head.Number.Uint64() < d.checkpoint { + p.log.Warn("Remote head below checkpoint", "number", head.Number, "hash", head.Hash()) + return nil, errUnsyncedPeer + } p.log.Debug("Remote head header identified", "number", head.Number, "hash", head.Hash()) return head, nil |