Commit 9ed8dc73 authored by obscuren's avatar obscuren

Attempt to catch up from unknown block

parent 2458697d
...@@ -73,6 +73,10 @@ func (self *BlockPool) SetBlock(b *ethchain.Block, peer *Peer) { ...@@ -73,6 +73,10 @@ func (self *BlockPool) SetBlock(b *ethchain.Block, peer *Peer) {
if self.pool[hash] == nil && !self.eth.BlockChain().HasBlock(b.Hash()) { if self.pool[hash] == nil && !self.eth.BlockChain().HasBlock(b.Hash()) {
self.hashPool = append(self.hashPool, b.Hash()) self.hashPool = append(self.hashPool, b.Hash())
self.pool[hash] = &block{peer, peer, b, time.Now(), 0} 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 { } else if self.pool[hash] != nil {
self.pool[hash].block = b self.pool[hash].block = b
} }
...@@ -218,6 +222,7 @@ out: ...@@ -218,6 +222,7 @@ out:
case <-procTimer.C: case <-procTimer.C:
// XXX We can optimize this lifting this on to a new goroutine. // 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 // 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) { amount := self.ProcessCanonical(func(block *ethchain.Block) {
err := self.eth.StateManager().Process(block, false) err := self.eth.StateManager().Process(block, false)
if err != nil { if err != nil {
......
...@@ -23,12 +23,13 @@ type JSBlock struct { ...@@ -23,12 +23,13 @@ type JSBlock struct {
Name string `json:"name"` Name string `json:"name"`
GasLimit string `json:"gasLimit"` GasLimit string `json:"gasLimit"`
GasUsed string `json:"gasUsed"` GasUsed string `json:"gasUsed"`
PrevHash string `json:"prevHash"`
} }
// Creates a new QML Block from a chain block // Creates a new QML Block from a chain block
func NewJSBlock(block *ethchain.Block) *JSBlock { func NewJSBlock(block *ethchain.Block) *JSBlock {
if block == nil { if block == nil {
return nil return &JSBlock{}
} }
var ptxs []JSTransaction var ptxs []JSTransaction
...@@ -38,7 +39,14 @@ func NewJSBlock(block *ethchain.Block) *JSBlock { ...@@ -38,7 +39,14 @@ func NewJSBlock(block *ethchain.Block) *JSBlock {
list := ethutil.NewList(ptxs) 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 { func (self *JSBlock) ToString() string {
......
...@@ -221,7 +221,6 @@ func (self *Peer) Connect(addr string) (conn net.Conn, err error) { ...@@ -221,7 +221,6 @@ func (self *Peer) Connect(addr string) (conn net.Conn, err error) {
for attempts := 0; attempts < maxTries; attempts++ { for attempts := 0; attempts < maxTries; attempts++ {
conn, err = net.DialTimeout("tcp", addr, 10*time.Second) conn, err = net.DialTimeout("tcp", addr, 10*time.Second)
if err != nil { 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) time.Sleep(time.Duration(attempts*20) * time.Second)
continue continue
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment