|
|
|
@ -78,11 +78,12 @@ type ChainManager struct { |
|
|
|
|
eventMux *event.TypeMux |
|
|
|
|
genesisBlock *types.Block |
|
|
|
|
// Last known total difficulty
|
|
|
|
|
mu sync.RWMutex |
|
|
|
|
tsmu sync.RWMutex |
|
|
|
|
td *big.Int |
|
|
|
|
currentBlock *types.Block |
|
|
|
|
lastBlockHash common.Hash |
|
|
|
|
mu sync.RWMutex |
|
|
|
|
tsmu sync.RWMutex |
|
|
|
|
td *big.Int |
|
|
|
|
currentBlock *types.Block |
|
|
|
|
lastBlockHash common.Hash |
|
|
|
|
currentGasLimit *big.Int |
|
|
|
|
|
|
|
|
|
transState *state.StateDB |
|
|
|
|
txState *state.ManagedState |
|
|
|
@ -95,12 +96,13 @@ type ChainManager struct { |
|
|
|
|
|
|
|
|
|
func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *ChainManager { |
|
|
|
|
bc := &ChainManager{ |
|
|
|
|
blockDb: blockDb, |
|
|
|
|
stateDb: stateDb, |
|
|
|
|
genesisBlock: GenesisBlock(stateDb), |
|
|
|
|
eventMux: mux, |
|
|
|
|
quit: make(chan struct{}), |
|
|
|
|
cache: NewBlockCache(blockCacheLimit), |
|
|
|
|
blockDb: blockDb, |
|
|
|
|
stateDb: stateDb, |
|
|
|
|
genesisBlock: GenesisBlock(stateDb), |
|
|
|
|
eventMux: mux, |
|
|
|
|
quit: make(chan struct{}), |
|
|
|
|
cache: NewBlockCache(blockCacheLimit), |
|
|
|
|
currentGasLimit: new(big.Int), |
|
|
|
|
} |
|
|
|
|
bc.setLastBlock() |
|
|
|
|
|
|
|
|
@ -157,6 +159,10 @@ func (self *ChainManager) Td() *big.Int { |
|
|
|
|
return self.td |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *ChainManager) GasLimit() *big.Int { |
|
|
|
|
return self.currentGasLimit |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *ChainManager) LastBlockHash() common.Hash { |
|
|
|
|
self.mu.RLock() |
|
|
|
|
defer self.mu.RUnlock() |
|
|
|
@ -652,6 +658,7 @@ out: |
|
|
|
|
// We need some control over the mining operation. Acquiring locks and waiting for the miner to create new block takes too long
|
|
|
|
|
// and in most cases isn't even necessary.
|
|
|
|
|
if i+1 == ev.canonicalCount { |
|
|
|
|
self.currentGasLimit = CalcGasLimit(self.GetBlock(event.Block.ParentHash()), event.Block) |
|
|
|
|
self.eventMux.Post(ChainHeadEvent{event.Block}) |
|
|
|
|
} |
|
|
|
|
case ChainSplitEvent: |
|
|
|
|