diff options
author | obscuren <geffobscura@gmail.com> | 2014-09-25 22:57:49 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-09-25 22:57:49 +0800 |
commit | 9ed8dc7384deb932be624699d9f628d3d00ba31e (patch) | |
tree | c20bab9c5c2b9b13be5f261cb72847ffa97654a2 | |
parent | 2458697dad8ceac5fe93182e141c7f2eb7428417 (diff) | |
download | dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar.gz dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar.bz2 dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar.lz dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar.xz dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.tar.zst dexon-9ed8dc7384deb932be624699d9f628d3d00ba31e.zip |
Attempt to catch up from unknown block
-rw-r--r-- | block_pool.go | 5 | ||||
-rw-r--r-- | ethpipe/js_types.go | 12 | ||||
-rw-r--r-- | 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 { @@ -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 } |