Browse Source

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)

zelig 10 năm trước cách đây
mục cha
commit
262714fc6c
3 tập tin đã thay đổi với 7 bổ sung1 xóa
  1. 2 1
      blockpool/blockpool.go
  2. 1 0
      core/chain_manager.go
  3. 4 0
      core/types/block.go

+ 2 - 1
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)

+ 1 - 0
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

+ 4 - 0
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) }