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  }