diff options
Diffstat (limited to 'miner/worker.go')
-rw-r--r-- | miner/worker.go | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/miner/worker.go b/miner/worker.go index d0d085861..cd1c6e28f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -41,16 +41,21 @@ func env(block *types.Block, eth *eth.Ethereum) *environment { return env } +type Work struct { + Number uint64 + Nonce []byte +} + type Agent interface { Work() chan<- *types.Block - SetNonceCh(chan<- []byte) + SetNonceCh(chan<- Work) Stop() Pow() pow.PoW } type worker struct { agents []Agent - recv chan []byte + recv chan Work mux *event.TypeMux quit chan struct{} pow pow.PoW @@ -61,13 +66,15 @@ type worker struct { coinbase []byte current *environment + + mining bool } func newWorker(coinbase []byte, eth *eth.Ethereum) *worker { return &worker{ eth: eth, mux: eth.EventMux(), - recv: make(chan []byte), + recv: make(chan Work), chain: eth.ChainManager(), proc: eth.BlockProcessor(), coinbase: coinbase, @@ -75,11 +82,17 @@ func newWorker(coinbase []byte, eth *eth.Ethereum) *worker { } func (self *worker) start() { + self.mining = true + + self.quit = make(chan struct{}) + go self.update() go self.wait() } func (self *worker) stop() { + self.mining = false + close(self.quit) } @@ -107,26 +120,31 @@ out: break out } } + + events.Unsubscribe() } func (self *worker) wait() { for { - for nonce := range self.recv { - self.current.block.Header().Nonce = nonce - fmt.Println(self.current.block) + for work := range self.recv { + if self.current.block.Number().Uint64() == work.Number { + self.current.block.Header().Nonce = work.Nonce - self.chain.InsertChain(types.Blocks{self.current.block}) + self.chain.InsertChain(types.Blocks{self.current.block}) + } break } } } func (self *worker) push() { - self.current.state.Update(ethutil.Big0) - self.current.block.SetRoot(self.current.state.Root()) + if self.mining { + self.current.state.Update(ethutil.Big0) + self.current.block.SetRoot(self.current.state.Root()) - for _, agent := range self.agents { - agent.Work() <- self.current.block + for _, agent := range self.agents { + agent.Work() <- self.current.block + } } } |