From 8a0f23915e4feb9aabe21bd075416bc0f32bbc43 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 13 Feb 2015 17:23:09 +0100 Subject: [PATCH] Fixed a few issues in the miner and updated hash rate title * Sometimes old nonces were set by "old" agents * Added the hash rate to the miner --- cmd/mist/assets/qml/main.qml | 4 ++- cmd/mist/assets/qml/views/miner.qml | 24 +++++++++++++++++ miner/agent.go | 13 +++++----- miner/miner.go | 14 +++------- miner/worker.go | 40 +++++++++++++++++++++-------- 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/cmd/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml index 2b56b72361..dce279518f 100644 --- a/cmd/mist/assets/qml/main.qml +++ b/cmd/mist/assets/qml/main.qml @@ -289,6 +289,7 @@ ApplicationWindow { styleColor: "#797979" } + /* Label { //y: 6 objectName: "miningLabel" @@ -307,6 +308,7 @@ ApplicationWindow { anchors.right: peerGroup.left anchors.rightMargin: 5 } + */ ProgressBar { visible: false @@ -1101,4 +1103,4 @@ ApplicationWindow { addrField.focus = true } } - } \ No newline at end of file + } diff --git a/cmd/mist/assets/qml/views/miner.qml b/cmd/mist/assets/qml/views/miner.qml index 193ce37bea..0938644b9e 100644 --- a/cmd/mist/assets/qml/views/miner.qml +++ b/cmd/mist/assets/qml/views/miner.qml @@ -14,6 +14,30 @@ Rectangle { color: "#00000000" + Label { + visible: false + id: lastBlockLabel + objectName: "lastBlockLabel" + text: "---" + font.pixelSize: 10 + anchors.right: peerGroup.left + anchors.rightMargin: 5 + onTextChanged: { + //menuItem.secondaryTitle = text + } + } + + Label { + objectName: "miningLabel" + visible: false + font.pixelSize: 10 + anchors.right: lastBlockLabel.left + anchors.rightMargin: 5 + onTextChanged: { + menuItem.secondaryTitle = text + } + } + ColumnLayout { spacing: 10 anchors.fill: parent diff --git a/miner/agent.go b/miner/agent.go index b12b9da4d4..ddd8e66756 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -9,7 +9,7 @@ type CpuMiner struct { c chan *types.Block quit chan struct{} quitCurrentOp chan struct{} - returnCh chan<- []byte + returnCh chan<- Work index int pow pow.PoW @@ -28,9 +28,9 @@ func NewCpuMiner(index int, pow pow.PoW) *CpuMiner { return miner } -func (self *CpuMiner) Work() chan<- *types.Block { return self.c } -func (self *CpuMiner) Pow() pow.PoW { return self.pow } -func (self *CpuMiner) SetNonceCh(ch chan<- []byte) { self.returnCh = ch } +func (self *CpuMiner) Work() chan<- *types.Block { return self.c } +func (self *CpuMiner) Pow() pow.PoW { return self.pow } +func (self *CpuMiner) SetNonceCh(ch chan<- Work) { self.returnCh = ch } func (self *CpuMiner) Stop() { close(self.quit) @@ -42,7 +42,6 @@ out: for { select { case block := <-self.c: - minerlogger.Infof("miner[%d] got block\n", self.index) // make sure it's open self.quitCurrentOp <- struct{}{} @@ -66,9 +65,9 @@ done: } func (self *CpuMiner) mine(block *types.Block) { - minerlogger.Infof("started agent[%d]. mining...\n", self.index) + minerlogger.Infof("(re)started agent[%d]. mining...\n", self.index) nonce := self.pow.Search(block, self.quitCurrentOp) if nonce != nil { - self.returnCh <- nonce + self.returnCh <- Work{block.Number().Uint64(), nonce} } } diff --git a/miner/miner.go b/miner/miner.go index f184042dc5..e3e7bead26 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -38,22 +38,16 @@ func (self *Miner) Mining() bool { } func (self *Miner) Start() { + self.mining = true + self.worker.start() self.worker.commitNewWork() - - /* - timer := time.NewTicker(time.Second) - for { - select { - case <-timer.C: - fmt.Printf("%d workers. %d/Khash\n", len(self.worker.agents), self.HashRate()) - } - } - */ } func (self *Miner) Stop() { + self.mining = false + self.worker.stop() } diff --git a/miner/worker.go b/miner/worker.go index d0d085861f..cd1c6e28f9 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 + } } }