浏览代码

Kick off bad peers on bad chains and improved catch up on diverted chain

obscuren 11 年之前
父节点
当前提交
677836cbee
共有 2 个文件被更改,包括 19 次插入10 次删除
  1. 12 2
      block_pool.go
  2. 7 8
      peer.go

+ 12 - 2
block_pool.go

@@ -56,6 +56,11 @@ func (self *BlockPool) Len() int {
 	return len(self.hashPool)
 }
 
+func (self *BlockPool) Reset() {
+	self.pool = make(map[string]*block)
+	self.hashPool = nil
+}
+
 func (self *BlockPool) HasLatestHash() bool {
 	self.mut.Lock()
 	defer self.mut.Unlock()
@@ -77,7 +82,7 @@ func (self *BlockPool) Blocks() (blocks ethchain.Blocks) {
 	return
 }
 
-func (self *BlockPool) FetchHashes(peer *Peer) {
+func (self *BlockPool) FetchHashes(peer *Peer) bool {
 	highestTd := self.eth.HighestTDPeer()
 
 	if (self.peer == nil && peer.td.Cmp(highestTd) >= 0) || (self.peer != nil && peer.td.Cmp(self.peer.td) >= 0) || self.peer == peer {
@@ -95,7 +100,11 @@ func (self *BlockPool) FetchHashes(peer *Peer) {
 			peerlogger.Debugf("Fetching hashes (%d)\n", amount)
 			peer.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{peer.lastReceivedHash, uint32(amount)}))
 		}
+
+		return true
 	}
+
+	return false
 }
 
 func (self *BlockPool) AddHash(hash []byte, peer *Peer) {
@@ -122,7 +131,7 @@ func (self *BlockPool) Add(b *ethchain.Block, peer *Peer) {
 		self.pool[hash] = &block{peer, peer, b, time.Now(), 0}
 
 		if !self.eth.BlockChain().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes {
-			poollogger.Infof("Unknown block, requesting parent (%x...)\n", b.PrevHash[0:4])
+			poollogger.Infof("Unknown chain, requesting (%x...)\n", b.PrevHash[0:4])
 			peer.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{b.Hash(), uint32(256)}))
 		}
 	} else if self.pool[hash] != nil {
@@ -308,6 +317,7 @@ out:
 			}
 
 			if err != nil {
+				self.Reset()
 				// Remove this bad chain
 				for _, block := range blocks {
 					self.Remove(block.Hash())

+ 7 - 8
peer.go

@@ -202,7 +202,7 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
 	go func() {
 		conn, err := p.Connect(addr)
 		if err != nil {
-			peerlogger.Debugln("Connection to peer failed. Giving up.", err)
+			//peerlogger.Debugln("Connection to peer failed. Giving up.", err)
 			p.Stop()
 			return
 		}
@@ -517,7 +517,9 @@ func (p *Peer) HandleInbound() {
 					}
 
 					if !foundCommonHash && msg.Data.Len() != 0 {
-						p.FetchHashes()
+						if !p.FetchHashes() {
+							p.doneFetchingHashes = true
+						}
 					} else {
 						peerlogger.Infof("Found common hash (%x...)\n", p.lastReceivedHash[0:4])
 						p.doneFetchingHashes = true
@@ -553,9 +555,9 @@ func (self *Peer) FetchBlocks(hashes [][]byte) {
 	}
 }
 
-func (self *Peer) FetchHashes() {
+func (self *Peer) FetchHashes() bool {
 	blockPool := self.ethereum.blockPool
-	blockPool.FetchHashes(self)
+	return blockPool.FetchHashes(self)
 
 	/*
 		if self.td.Cmp(self.ethereum.HighestTDPeer()) >= 0 {
@@ -718,10 +720,7 @@ func (self *Peer) handleStatus(msg *ethwire.Msg) {
 
 	// Compare the total TD with the blockchain TD. If remote is higher
 	// fetch hashes from highest TD node.
-	if self.td.Cmp(self.ethereum.BlockChain().TD) > 0 {
-		self.ethereum.blockPool.AddHash(self.lastReceivedHash, self)
-		self.FetchHashes()
-	}
+	self.FetchHashes()
 
 	ethlogger.Infof("Peer is [eth] capable. (TD = %v ~ %x) %d / %d", self.td, self.bestHash, protoVersion, netVersion)