From 262714fc6c269e0a3aa39892954b03db9418e649 Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 8 Apr 2015 12:43:55 +0100 Subject: [PATCH] future queued block support - queued bool // flag for blockpool to skip TD check - set to true when future block queued - in checkTD: skip check if queued - TODO: add test (insertchain sets future block) --- blockpool/blockpool.go | 3 ++- core/chain_manager.go | 1 + core/types/block.go | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/blockpool/blockpool.go b/blockpool/blockpool.go index d823d9898f..e1891f5f49 100644 --- a/blockpool/blockpool.go +++ b/blockpool/blockpool.go @@ -782,7 +782,8 @@ LOOP: // check if block's actual TD (calculated after successful insertChain) is identical to TD advertised for peer's head block. func (self *BlockPool) checkTD(nodes ...*node) { for _, n := range nodes { - if n.td != nil { + // skip check if queued future block + if n.td != nil && !n.block.Queued() { plog.DebugDetailf("peer td %v =?= block td %v", n.td, n.block.Td) if n.td.Cmp(n.block.Td) != 0 { self.peers.peerError(n.blockBy, ErrIncorrectTD, "on block %x", n.hash) diff --git a/core/chain_manager.go b/core/chain_manager.go index 3ab95d272b..f05a6bd727 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -471,6 +471,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error { // Do not penelise on future block. We'll need a block queue eventually that will queue // future block for future use if err == BlockFutureErr { + block.SetQueued(true) self.futureBlocks.Push(block) stats.queued++ continue diff --git a/core/types/block.go b/core/types/block.go index 116acbf792..c47b555ede 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -97,6 +97,7 @@ type Block struct { uncles []*Header transactions Transactions Td *big.Int + queued bool // flag for blockpool to skip TD check receipts Receipts } @@ -268,6 +269,9 @@ func (self *Block) SetNonce(nonce uint64) { self.header.SetNonce(nonce) } +func (self *Block) Queued() bool { return self.queued } +func (self *Block) SetQueued(q bool) { self.queued = q } + func (self *Block) Bloom() Bloom { return self.header.Bloom } func (self *Block) Coinbase() common.Address { return self.header.Coinbase } func (self *Block) Time() int64 { return int64(self.header.Time) }