aboutsummaryrefslogtreecommitdiffstats
path: root/block_pool.go
diff options
context:
space:
mode:
Diffstat (limited to 'block_pool.go')
-rw-r--r--block_pool.go24
1 files changed, 17 insertions, 7 deletions
diff --git a/block_pool.go b/block_pool.go
index 3225bdff2..25627eb5c 100644
--- a/block_pool.go
+++ b/block_pool.go
@@ -49,11 +49,11 @@ func (self *BlockPool) AddHash(hash []byte) {
}
}
-func (self *BlockPool) SetBlock(b *ethchain.Block) {
+func (self *BlockPool) SetBlock(b *ethchain.Block, peer *Peer) {
hash := string(b.Hash())
- if self.pool[string(hash)] == nil {
- self.pool[hash] = &block{nil, nil}
+ if self.pool[hash] == nil {
+ self.pool[hash] = &block{peer, nil}
}
self.pool[hash].block = b
@@ -65,6 +65,10 @@ func (self *BlockPool) CheckLinkAndProcess(f func(block *ethchain.Block)) bool {
if self.IsLinked() {
for i, hash := range self.hashPool {
+ if self.pool[string(hash)] == nil {
+ continue
+ }
+
block := self.pool[string(hash)].block
if block != nil {
f(block)
@@ -88,9 +92,15 @@ func (self *BlockPool) IsLinked() bool {
return false
}
- block := self.pool[string(self.hashPool[0])].block
- if block != nil {
- return self.eth.BlockChain().HasBlock(block.PrevHash)
+ for i := 0; i < len(self.hashPool); i++ {
+ item := self.pool[string(self.hashPool[i])]
+ if item != nil && item.block != nil {
+ if self.eth.BlockChain().HasBlock(item.block.PrevHash) {
+ self.hashPool = self.hashPool[i:]
+
+ return true
+ }
+ }
}
return false
@@ -104,7 +114,7 @@ func (self *BlockPool) Take(amount int, peer *Peer) (hashes [][]byte) {
j := 0
for i := 0; i < len(self.hashPool) && j < num; i++ {
hash := string(self.hashPool[i])
- if self.pool[hash].peer == nil || self.pool[hash].peer == peer {
+ if self.pool[hash] != nil && (self.pool[hash].peer == nil || self.pool[hash].peer == peer) && self.pool[hash].block == nil {
self.pool[hash].peer = peer
hashes = append(hashes, self.hashPool[i])