Browse Source

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
obscuren 10 years ago
parent
commit
8a0f23915e
5 changed files with 66 additions and 29 deletions
  1. 3 1
      cmd/mist/assets/qml/main.qml
  2. 24 0
      cmd/mist/assets/qml/views/miner.qml
  3. 6 7
      miner/agent.go
  4. 4 10
      miner/miner.go
  5. 29 11
      miner/worker.go

+ 3 - 1
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
              }
          }
-     }
+     }

+ 24 - 0
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

+ 6 - 7
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}
 	}
 }

+ 4 - 10
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()
 }
 

+ 29 - 11
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
+		}
 	}
 }