From 9ed8dc7384deb932be624699d9f628d3d00ba31e Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 25 Sep 2014 16:57:49 +0200 Subject: [PATCH] Attempt to catch up from unknown block --- block_pool.go | 5 +++++ ethpipe/js_types.go | 12 ++++++++++-- peer.go | 1 - 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/block_pool.go b/block_pool.go index 88d1c3739..f768f0f60 100644 --- a/block_pool.go +++ b/block_pool.go @@ -73,6 +73,10 @@ func (self *BlockPool) SetBlock(b *ethchain.Block, peer *Peer) { if self.pool[hash] == nil && !self.eth.BlockChain().HasBlock(b.Hash()) { self.hashPool = append(self.hashPool, b.Hash()) self.pool[hash] = &block{peer, peer, b, time.Now(), 0} + + if !self.eth.BlockChain().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil { + peer.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{b.PrevHash, uint32(256)})) + } } else if self.pool[hash] != nil { self.pool[hash].block = b } @@ -218,6 +222,7 @@ out: case <-procTimer.C: // XXX We can optimize this lifting this on to a new goroutine. // We'd need to make sure that the pools are properly protected by a mutex + // XXX This should moved in The Great Refactor(TM) amount := self.ProcessCanonical(func(block *ethchain.Block) { err := self.eth.StateManager().Process(block, false) if err != nil { diff --git a/ethpipe/js_types.go b/ethpipe/js_types.go index ccd585cf0..7266a5be4 100644 --- a/ethpipe/js_types.go +++ b/ethpipe/js_types.go @@ -23,12 +23,13 @@ type JSBlock struct { Name string `json:"name"` GasLimit string `json:"gasLimit"` GasUsed string `json:"gasUsed"` + PrevHash string `json:"prevHash"` } // Creates a new QML Block from a chain block func NewJSBlock(block *ethchain.Block) *JSBlock { if block == nil { - return nil + return &JSBlock{} } var ptxs []JSTransaction @@ -38,7 +39,14 @@ func NewJSBlock(block *ethchain.Block) *JSBlock { list := ethutil.NewList(ptxs) - return &JSBlock{ref: block, Size: block.Size().String(), Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(), GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()), Transactions: list, Time: block.Time, Coinbase: ethutil.Bytes2Hex(block.Coinbase)} + return &JSBlock{ + ref: block, Size: block.Size().String(), + Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(), + GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()), + Transactions: list, Time: block.Time, + Coinbase: ethutil.Bytes2Hex(block.Coinbase), + PrevHash: ethutil.Bytes2Hex(block.PrevHash), + } } func (self *JSBlock) ToString() string { diff --git a/peer.go b/peer.go index ede3ad4e4..6f1ad91e3 100644 --- a/peer.go +++ b/peer.go @@ -221,7 +221,6 @@ func (self *Peer) Connect(addr string) (conn net.Conn, err error) { for attempts := 0; attempts < maxTries; attempts++ { conn, err = net.DialTimeout("tcp", addr, 10*time.Second) if err != nil { - //peerlogger.Debugf("Peer connection failed. Retrying (%d/%d) (%s)\n", attempts+1, maxTries, addr) time.Sleep(time.Duration(attempts*20) * time.Second) continue }