diff options
author | gary rong <garyrong0905@gmail.com> | 2018-09-21 01:02:15 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-09-21 01:02:15 +0800 |
commit | ba0a8b7887cbaea861dca3f1408e59b88c174815 (patch) | |
tree | ca0ab2dd87ea511bf9ad57646fee4a4a44846865 /core/blockchain.go | |
parent | f55c26ae6d0f25b4aa6b1bd103720067d1fec9fe (diff) | |
download | dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar.gz dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar.bz2 dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar.lz dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar.xz dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.tar.zst dexon-ba0a8b7887cbaea861dca3f1408e59b88c174815.zip |
core, eth: fix dependency cycle (#17720)
Diffstat (limited to 'core/blockchain.go')
-rw-r--r-- | core/blockchain.go | 71 |
1 files changed, 21 insertions, 50 deletions
diff --git a/core/blockchain.go b/core/blockchain.go index 2f12ca62b..fe961e0c4 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/common/mclock" "github.com/ethereum/go-ethereum/common/prque" "github.com/ethereum/go-ethereum/consensus" - "github.com/ethereum/go-ethereum/consensus/clique" "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" @@ -129,14 +128,14 @@ type BlockChain struct { validator Validator // block and state validator interface vmConfig vm.Config - badBlocks *lru.Cache // Bad block cache - isLocalFn func(common.Address) bool // Function used to determine whether the block author is a local miner account. + badBlocks *lru.Cache // Bad block cache + shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. } // NewBlockChain returns a fully initialised block chain using information // available in the database. It initialises the default Ethereum Validator and // Processor. -func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, isLocalFn func(common.Address) bool) (*BlockChain, error) { +func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, shouldPreserve func(block *types.Block) bool) (*BlockChain, error) { if cacheConfig == nil { cacheConfig = &CacheConfig{ TrieNodeLimit: 256 * 1024 * 1024, @@ -150,20 +149,20 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par badBlocks, _ := lru.New(badBlockLimit) bc := &BlockChain{ - chainConfig: chainConfig, - cacheConfig: cacheConfig, - db: db, - triegc: prque.New(nil), - stateCache: state.NewDatabase(db), - quit: make(chan struct{}), - isLocalFn: isLocalFn, - bodyCache: bodyCache, - bodyRLPCache: bodyRLPCache, - blockCache: blockCache, - futureBlocks: futureBlocks, - engine: engine, - vmConfig: vmConfig, - badBlocks: badBlocks, + chainConfig: chainConfig, + cacheConfig: cacheConfig, + db: db, + triegc: prque.New(nil), + stateCache: state.NewDatabase(db), + quit: make(chan struct{}), + shouldPreserve: shouldPreserve, + bodyCache: bodyCache, + bodyRLPCache: bodyRLPCache, + blockCache: blockCache, + futureBlocks: futureBlocks, + engine: engine, + vmConfig: vmConfig, + badBlocks: badBlocks, } bc.SetValidator(NewBlockValidator(chainConfig, bc, engine)) bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine)) @@ -975,39 +974,11 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. if block.NumberU64() < currentBlock.NumberU64() { reorg = true } else if block.NumberU64() == currentBlock.NumberU64() { - if _, ok := bc.engine.(*clique.Clique); ok { - // The reason we need to disable the self-reorg preserving for clique - // is it can be probable to introduce a deadlock. - // - // e.g. If there are 7 available signers - // - // r1 A - // r2 B - // r3 C - // r4 D - // r5 A [X] F G - // r6 [X] - // - // In the round5, the inturn signer E is offline, so the worst case - // is A, F and G sign the block of round5 and reject the block of opponents - // and in the round6, the last available signer B is offline, the whole - // network is stuck. - reorg = mrand.Float64() < 0.5 - } else { - currentAuthor, err := bc.engine.Author(currentBlock.Header()) - if err != nil { - return NonStatTy, err - } - blockAuthor, err := bc.engine.Author(block.Header()) - if err != nil { - return NonStatTy, err - } - var currentLocal, blockLocal bool - if bc.isLocalFn != nil { - currentLocal, blockLocal = bc.isLocalFn(currentAuthor), bc.isLocalFn(blockAuthor) - } - reorg = !currentLocal && (blockLocal || mrand.Float64() < 0.5) + var currentPreserve, blockPreserve bool + if bc.shouldPreserve != nil { + currentPreserve, blockPreserve = bc.shouldPreserve(currentBlock), bc.shouldPreserve(block) } + reorg = !currentPreserve && (blockPreserve || mrand.Float64() < 0.5) } } if reorg { |