diff options
Diffstat (limited to 'core/blockchain.go')
-rw-r--r-- | core/blockchain.go | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/core/blockchain.go b/core/blockchain.go index 9ace6d79a..2eb207d39 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -152,9 +152,14 @@ func NewBlockChain(chainDb ethdb.Database, config *params.ChainConfig, pow pow.P // Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain for hash, _ := range BadHashes { if header := bc.GetHeaderByHash(hash); header != nil { - glog.V(logger.Error).Infof("Found bad hash, rewinding chain to block #%d [%x…]", header.Number, header.ParentHash[:4]) - bc.SetHead(header.Number.Uint64() - 1) - glog.V(logger.Error).Infoln("Chain rewind was successful, resuming normal operation") + // get the canonical block corresponding to the offending header's number + headerByNumber := bc.GetHeaderByNumber(header.Number.Uint64()) + // make sure the headerByNumber (if present) is in our current canonical chain + if headerByNumber != nil && headerByNumber.Hash() == header.Hash() { + glog.V(logger.Error).Infof("Found bad hash, rewinding chain to block #%d [%x…]", header.Number, header.ParentHash[:4]) + bc.SetHead(header.Number.Uint64() - 1) + glog.V(logger.Error).Infoln("Chain rewind was successful, resuming normal operation") + } } } // Take ownership of this particular state |