github.com/karalabe/go-ethereum@v0.8.5/miner/agent.go (about) 1 package miner 2 3 import ( 4 "github.com/ethereum/go-ethereum/core/types" 5 "github.com/ethereum/go-ethereum/pow" 6 ) 7 8 type CpuMiner struct { 9 c chan *types.Block 10 quit chan struct{} 11 quitCurrentOp chan struct{} 12 returnCh chan<- Work 13 14 index int 15 pow pow.PoW 16 } 17 18 func NewCpuMiner(index int, pow pow.PoW) *CpuMiner { 19 miner := &CpuMiner{ 20 pow: pow, 21 index: index, 22 } 23 24 return miner 25 } 26 27 func (self *CpuMiner) Work() chan<- *types.Block { return self.c } 28 func (self *CpuMiner) Pow() pow.PoW { return self.pow } 29 func (self *CpuMiner) SetWorkCh(ch chan<- Work) { self.returnCh = ch } 30 31 func (self *CpuMiner) Stop() { 32 close(self.quit) 33 close(self.quitCurrentOp) 34 } 35 36 func (self *CpuMiner) Start() { 37 self.quit = make(chan struct{}) 38 self.quitCurrentOp = make(chan struct{}, 1) 39 self.c = make(chan *types.Block, 1) 40 41 go self.update() 42 } 43 44 func (self *CpuMiner) update() { 45 out: 46 for { 47 select { 48 case block := <-self.c: 49 self.quitCurrentOp <- struct{}{} 50 51 go self.mine(block) 52 case <-self.quit: 53 break out 54 } 55 } 56 57 done: 58 // Empty channel 59 for { 60 select { 61 case <-self.c: 62 default: 63 close(self.c) 64 65 break done 66 } 67 } 68 } 69 70 func (self *CpuMiner) mine(block *types.Block) { 71 minerlogger.Infof("(re)started agent[%d]. mining...\n", self.index) 72 nonce := self.pow.Search(block, self.quitCurrentOp) 73 if nonce != nil { 74 self.returnCh <- Work{block.Number().Uint64(), nonce} 75 } 76 }