mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
core/vm: fix merge issue
This commit is contained in:
parent
d870b94e47
commit
78d789cd28
1 changed files with 55 additions and 1 deletions
|
|
@ -177,7 +177,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine, config.MinerRecommit, config.MinerGasFloor, config.MinerGasCeil)
|
eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine, config.MinerRecommit, config.MinerGasFloor, config.MinerGasCeil, eth.isLocalBlock)
|
||||||
eth.miner.SetExtra(makeExtraData(config.MinerExtraData))
|
eth.miner.SetExtra(makeExtraData(config.MinerExtraData))
|
||||||
|
|
||||||
eth.APIBackend = &EthAPIBackend{eth, nil}
|
eth.APIBackend = &EthAPIBackend{eth, nil}
|
||||||
|
|
@ -334,6 +334,60 @@ func (s *Ethereum) Etherbase() (eb common.Address, err error) {
|
||||||
return common.Address{}, fmt.Errorf("etherbase must be explicitly specified")
|
return common.Address{}, fmt.Errorf("etherbase must be explicitly specified")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isLocalBlock checks whether the specified block is mined
|
||||||
|
// by local miner accounts.
|
||||||
|
//
|
||||||
|
// We regard two types of accounts as local miner account: etherbase
|
||||||
|
// and accounts specified via `txpool.locals` flag.
|
||||||
|
func (s *Ethereum) isLocalBlock(block *types.Block) bool {
|
||||||
|
author, err := s.engine.Author(block.Header())
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("Failed to retrieve block author", "number", block.NumberU64(), "hash", block.Hash(), "err", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// Check whether the given address is etherbase.
|
||||||
|
s.lock.RLock()
|
||||||
|
etherbase := s.etherbase
|
||||||
|
s.lock.RUnlock()
|
||||||
|
if author == etherbase {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// Check whether the given address is specified by `txpool.local`
|
||||||
|
// CLI flag.
|
||||||
|
for _, account := range s.config.TxPool.Locals {
|
||||||
|
if account == author {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// shouldPreserve checks whether we should preserve the given block
|
||||||
|
// during the chain reorg depending on whether the author of block
|
||||||
|
// is a local account.
|
||||||
|
func (s *Ethereum) shouldPreserve(block *types.Block) bool {
|
||||||
|
// 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.
|
||||||
|
if _, ok := s.engine.(*clique.Clique); ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return s.isLocalBlock(block)
|
||||||
|
}
|
||||||
|
|
||||||
// SetEtherbase sets the mining reward address.
|
// SetEtherbase sets the mining reward address.
|
||||||
func (s *Ethereum) SetEtherbase(etherbase common.Address) {
|
func (s *Ethereum) SetEtherbase(etherbase common.Address) {
|
||||||
s.lock.Lock()
|
s.lock.Lock()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue