From dba64ca903617ec5c1ed6be91f63b719dd9a8cd3 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 17 Oct 2018 19:47:10 +0200 Subject: [PATCH] core/blockchain, downloader: abort early on sidechain import with bad blocks --- core/blockchain.go | 8 ++++++++ eth/downloader/downloader.go | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index f4a818f4c0..7ad13cb388 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1144,12 +1144,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty for !bc.HasState(parent.Root()) { winner = append(winner, parent) parent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1) + if bc.isBadHash(parent.Hash()) { + log.Info("Found bad hash in competing sidechain, aborting import", "hash", parent.Hash(), "number", parent.Number()) + return i, events, coalescedLogs, ErrBlacklistedHash + } } for j := 0; j < len(winner)/2; j++ { winner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j] } // Import all the pruned blocks to make the state available bc.chainmu.Unlock() + log.Info("Importing competing sidechain", "len", len(winner), "from", winner[0].Number(), "to", winner[len(winner)-1].Number()) _, evs, logs, err := bc.insertChain(winner) bc.chainmu.Lock() events, coalescedLogs = evs, logs @@ -1442,6 +1447,9 @@ func (bc *BlockChain) BadBlocks() []*types.Block { } return blocks } +func (bc *BlockChain) isBadHash(hash common.Hash) bool { + return bc.badBlocks.Contains(hash) +} // addBadBlock adds a bad block to the bad-block LRU cache func (bc *BlockChain) addBadBlock(block *types.Block) { diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 9cfc8a978d..606c1bc81e 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -1400,7 +1400,7 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) } if index, err := d.blockchain.InsertChain(blocks); err != nil { - log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) + log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "blocks", len(blocks), "err", err) return errInvalidChain } return nil @@ -1621,7 +1621,7 @@ func (d *Downloader) qosTuner() { atomic.StoreUint64(&d.rttConfidence, conf) // Log the new QoS values and sleep until the next RTT - log.Debug("Recalculated downloader QoS values", "rtt", rtt, "confidence", float64(conf)/1000000.0, "ttl", d.requestTTL()) + //log.Debug("Recalculated downloader QoS values", "rtt", rtt, "confidence", float64(conf)/1000000.0, "ttl", d.requestTTL()) select { case <-d.quitCh: return