mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 20:56:42 +00:00
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
This commit is contained in:
parent
7cb0e24245
commit
59ff88444a
9 changed files with 20 additions and 17 deletions
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue