aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-09-25 22:57:49 +0800
committerobscuren <geffobscura@gmail.com>2014-09-25 22:57:49 +0800
commit9ed8dc7384deb932be624699d9f628d3d00ba31e (patch)
treec20bab9c5c2b9b13be5f261cb72847ffa97654a2
parent2458697dad8ceac5fe93182e141c7f2eb7428417 (diff)
downloaddexon-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.go5
-rw-r--r--ethpipe/js_types.go12
-rw-r--r--peer.go1
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
}