diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-05-28 18:06:10 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-05-28 19:03:10 +0800 |
commit | 29b0480cfb2f2bd6c350fdce0063312ad691d7b8 (patch) | |
tree | acffafea6ff39c6e1cad36120bc00d7378565f4c /eth/downloader/downloader.go | |
parent | 27e0d2a97325edc9a870a747412d0b9a2abd1ed1 (diff) | |
download | dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar.gz dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar.bz2 dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar.lz dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar.xz dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.tar.zst dexon-29b0480cfb2f2bd6c350fdce0063312ad691d7b8.zip |
core, eth/downloader: expose the bad hashes, check in downloader
Diffstat (limited to 'eth/downloader/downloader.go')
-rw-r--r-- | eth/downloader/downloader.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 421c336f2..85531ce15 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -7,7 +7,10 @@ import ( "sync/atomic" "time" + "gopkg.in/fatih/set.v0" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" @@ -75,6 +78,7 @@ type Downloader struct { queue *queue // Scheduler for selecting the hashes to download peers *peerSet // Set of active peers from which download can proceed checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain + banned *set.SetNonTS // Set of hashes we've received and banned // Callbacks hasBlock hashCheckFn @@ -100,6 +104,7 @@ type Block struct { } func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock getBlockFn) *Downloader { + // Create the base downloader downloader := &Downloader{ mux: mux, queue: newQueue(), @@ -110,6 +115,11 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock getBlockFn) *Downloa hashCh: make(chan hashPack, 1), blockCh: make(chan blockPack, 1), } + // Inject all the known bad hashes + downloader.banned = set.NewNonTS() + for hash, _ := range core.BadHashes { + downloader.banned.Add(hash) + } return downloader } @@ -280,6 +290,12 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { glog.V(logger.Debug).Infof("Peer (%s) responded with empty hash set\n", active.id) return errEmptyHashSet } + for _, hash := range hashPack.hashes { + if d.banned.Has(hash) { + glog.V(logger.Debug).Infof("Peer (%s) sent a known invalid chain\n", active.id) + return ErrInvalidChain + } + } // Determine if we're done fetching hashes (queue up all pending), and continue if not done done, index := false, 0 for index, head = range hashPack.hashes { |