From 59ff88444aea9a8ff92e7f30ccba4e0de0894c76 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Wed, 13 May 2015 17:39:31 +0200 Subject: [PATCH] Improve ethash hash rate update * Add hash rate tracking for each mining thread * Do not use pow.GetHashrate but track it in each agent instead --- core/chain_makers.go | 2 +- miner/agent.go | 16 +++++++++------- miner/miner.go | 3 ++- miner/remote_agent.go | 2 +- miner/worker.go | 6 +++--- pow/dagger/dagger.go | 2 +- pow/ezp/pow.go | 2 +- pow/pow.go | 2 +- xeth/xeth.go | 2 +- 9 files changed, 20 insertions(+), 17 deletions(-) diff --git a/core/chain_makers.go b/core/chain_makers.go index 5cd7ab4abb..385786bc17 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -14,7 +14,7 @@ import ( // So we can generate blocks easily type FakePow struct{} -func (f FakePow) Search(block pow.Block, stop <-chan struct{}) (uint64, []byte) { +func (f FakePow) Search(block pow.Block, stop <-chan struct{}, prevHashRate *uint64) (uint64, []byte) { return 0, nil } func (f FakePow) Verify(block pow.Block) bool { return true } diff --git a/miner/agent.go b/miner/agent.go index 939f63fef0..3aaceacfc0 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -17,14 +17,16 @@ type CpuAgent struct { quitCurrentOp chan struct{} returnCh chan<- *types.Block - index int - pow pow.PoW + index int + prevHashRate *uint64 + pow pow.PoW } func NewCpuAgent(index int, pow pow.PoW) *CpuAgent { miner := &CpuAgent{ - pow: pow, - index: index, + pow: pow, + index: index, + prevHashRate: new(uint64), } return miner @@ -85,7 +87,7 @@ func (self *CpuAgent) mine(block *types.Block) { self.chMu.Unlock() // Mine - nonce, mixDigest := self.pow.Search(block, self.quitCurrentOp) + nonce, mixDigest := self.pow.Search(block, self.quitCurrentOp, self.prevHashRate) if nonce != 0 { block.SetNonce(nonce) block.Header().MixDigest = common.BytesToHash(mixDigest) @@ -95,6 +97,6 @@ func (self *CpuAgent) mine(block *types.Block) { } } -func (self *CpuAgent) GetHashRate() int64 { - return self.pow.GetHashrate() +func (self *CpuAgent) GetHashRate() uint64 { + return *self.prevHashRate } diff --git a/miner/miner.go b/miner/miner.go index 09342e2501..c1bfa86ca7 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -54,6 +54,7 @@ func (self *Miner) Start(coinbase common.Address, threads int) { self.worker.coinbase = coinbase self.worker.start() self.worker.commitNewWork() + } func (self *Miner) Stop() { @@ -69,7 +70,7 @@ func (self *Miner) Register(agent Agent) { self.worker.register(agent) } -func (self *Miner) HashRate() int64 { +func (self *Miner) HashRate() uint64 { return self.worker.HashRate() } diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 80cc9053e1..486bc55a72 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -42,7 +42,7 @@ func (a *RemoteAgent) Stop() { close(a.workCh) } -func (a *RemoteAgent) GetHashRate() int64 { return 0 } +func (a *RemoteAgent) GetHashRate() uint64 { return 0 } func (a *RemoteAgent) run() { out: diff --git a/miner/worker.go b/miner/worker.go index f737be507e..6670ef2074 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -35,7 +35,7 @@ type Agent interface { SetReturnCh(chan<- *types.Block) Stop() Start() - GetHashRate() int64 + GetHashRate() uint64 } // environment is the workers current environment and holds @@ -453,8 +453,8 @@ func (self *worker) commitTransaction(tx *types.Transaction) error { return nil } -func (self *worker) HashRate() int64 { - var tot int64 +func (self *worker) HashRate() uint64 { + var tot uint64 for _, agent := range self.agents { tot += agent.GetHashRate() } diff --git a/pow/dagger/dagger.go b/pow/dagger/dagger.go index b941c0eeb5..c5834cae2e 100644 --- a/pow/dagger/dagger.go +++ b/pow/dagger/dagger.go @@ -44,7 +44,7 @@ func (dag *Dagger) Find(obj *big.Int, resChan chan int64) { resChan <- 0 } -func (dag *Dagger) Search(hash, diff *big.Int) (uint64, []byte) { +func (dag *Dagger) Search(hash, diff *big.Int, prevHashRate *uint64) (uint64, []byte) { // TODO fix multi threading. Somehow it results in the wrong nonce amountOfRoutines := 1 diff --git a/pow/ezp/pow.go b/pow/ezp/pow.go index c838dd5ecc..8f1ebc219b 100644 --- a/pow/ezp/pow.go +++ b/pow/ezp/pow.go @@ -32,7 +32,7 @@ func (pow *EasyPow) Turbo(on bool) { pow.turbo = on } -func (pow *EasyPow) Search(block pow.Block, stop <-chan struct{}) (uint64, []byte) { +func (pow *EasyPow) Search(block pow.Block, stop <-chan struct{}, prevHashRate *uint64) (uint64, []byte) { r := rand.New(rand.NewSource(time.Now().UnixNano())) hash := block.HashNoNonce() diff := block.Difficulty() diff --git a/pow/pow.go b/pow/pow.go index 73984a4aee..e9217adb9d 100644 --- a/pow/pow.go +++ b/pow/pow.go @@ -1,7 +1,7 @@ package pow type PoW interface { - Search(block Block, stop <-chan struct{}) (uint64, []byte) + Search(block Block, stop <-chan struct{}, prevHashRate *uint64) (uint64, []byte) Verify(block Block) bool GetHashrate() int64 Turbo(bool) diff --git a/xeth/xeth.go b/xeth/xeth.go index 0fe68d1753..163ec25b6a 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -405,7 +405,7 @@ func (self *XEth) IsMining() bool { return self.backend.IsMining() } -func (self *XEth) HashRate() int64 { +func (self *XEth) HashRate() uint64 { return self.backend.Miner().HashRate() }