diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-05-21 13:07:58 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-05-21 13:07:58 +0800 |
commit | e8b22b9253da400cc350dbc673d07789f93f57bc (patch) | |
tree | 1adbaecbf50945f6bf913ceba8cbee2ad386068e /eth/downloader/downloader.go | |
parent | 79042223dc5f2ae5d4a2ed73d18907440a963093 (diff) | |
download | go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar.gz go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar.bz2 go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar.lz go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar.xz go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.tar.zst go-tangerine-e8b22b9253da400cc350dbc673d07789f93f57bc.zip |
eth/downloader: prevent a peer from dripping bad hashes
Diffstat (limited to 'eth/downloader/downloader.go')
-rw-r--r-- | eth/downloader/downloader.go | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d817b223c..f3a866441 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -28,10 +28,11 @@ var ( ) var ( - errLowTd = errors.New("peer's TD is too low") + errLowTd = errors.New("peers TD is too low") ErrBusy = errors.New("busy") - errUnknownPeer = errors.New("peer's unknown or unhealthy") + errUnknownPeer = errors.New("peer is unknown or unhealthy") ErrBadPeer = errors.New("action from bad peer ignored") + ErrStallingPeer = errors.New("peer is stalling") errNoPeers = errors.New("no peers to keep download active") ErrPendingQueue = errors.New("pending items in queue") ErrTimeout = errors.New("timeout") @@ -283,15 +284,18 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { return ErrBadPeer } if !done { + // Check that the peer is not stalling the sync + if len(inserts) < maxHashFetch { + return ErrStallingPeer + } // Try and fetch a random block to verify the hash batch // Skip the last hash as the cross check races with the next hash fetch - if len(inserts) > 1 { - cross := inserts[rand.Intn(len(inserts)-1)] - glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + cross := inserts[rand.Intn(len(inserts)-1)] + glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + + d.checks[cross] = time.Now().Add(blockTTL) + active.getBlocks([]common.Hash{cross}) - d.checks[cross] = time.Now().Add(blockTTL) - active.getBlocks([]common.Hash{cross}) - } // Also fetch a fresh active.getHashes(head) continue |