From ec3432bccbb058567c0ea3f1e6537460f1f0aa29 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 4 Feb 2019 13:30:19 +0100 Subject: [PATCH] core: fix error in block iterator (#18986) --- core/blockchain.go | 6 +++--- core/blockchain_insert.go | 8 -------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 156efe303..93caf9f36 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1143,7 +1143,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] switch { // First block is pruned, insert as sidechain and reorg only if TD grows enough case err == consensus.ErrPrunedAncestor: - return bc.insertSidechain(it) + return bc.insertSidechain(block, it) // First block is future, shove it (and all children) to the future queue (unknown ancestor) case err == consensus.ErrFutureBlock || (err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(it.first().ParentHash())): @@ -1285,7 +1285,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] // // The method writes all (header-and-body-valid) blocks to disk, then tries to // switch over to the new chain if the TD exceeded the current chain. -func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, []*types.Log, error) { +func (bc *BlockChain) insertSidechain(block *types.Block, it *insertIterator) (int, []interface{}, []*types.Log, error) { var ( externTd *big.Int current = bc.CurrentBlock() @@ -1294,7 +1294,7 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ // Since we don't import them here, we expect ErrUnknownAncestor for the remaining // ones. Any other errors means that the block is invalid, and should not be written // to disk. - block, err := it.current(), consensus.ErrPrunedAncestor + err := consensus.ErrPrunedAncestor for ; block != nil && (err == consensus.ErrPrunedAncestor); block, err = it.next() { // Check the canonical state root for that number if number := block.NumberU64(); current.NumberU64() >= number { diff --git a/core/blockchain_insert.go b/core/blockchain_insert.go index 70bea3544..cfa32c5aa 100644 --- a/core/blockchain_insert.go +++ b/core/blockchain_insert.go @@ -111,14 +111,6 @@ func (it *insertIterator) next() (*types.Block, error) { return it.chain[it.index], it.validator.ValidateBody(it.chain[it.index]) } -// current returns the current block that's being processed. -func (it *insertIterator) current() *types.Block { - if it.index < 0 || it.index+1 >= len(it.chain) { - return nil - } - return it.chain[it.index] -} - // previous returns the previous block was being processed, or nil func (it *insertIterator) previous() *types.Block { if it.index < 1 {