From da2fae0e437f9467a943acfe0571a8a24e8e76fd Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 9 Feb 2015 16:20:34 +0100 Subject: Basic structure miner --- miner/agent.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 miner/agent.go (limited to 'miner/agent.go') diff --git a/miner/agent.go b/miner/agent.go new file mode 100644 index 000000000..b12b9da4d --- /dev/null +++ b/miner/agent.go @@ -0,0 +1,74 @@ +package miner + +import ( + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/pow" +) + +type CpuMiner struct { + c chan *types.Block + quit chan struct{} + quitCurrentOp chan struct{} + returnCh chan<- []byte + + index int + pow pow.PoW +} + +func NewCpuMiner(index int, pow pow.PoW) *CpuMiner { + miner := &CpuMiner{ + c: make(chan *types.Block, 1), + quit: make(chan struct{}), + quitCurrentOp: make(chan struct{}, 1), + pow: pow, + index: index, + } + go miner.update() + + 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) Stop() { + close(self.quit) + close(self.quitCurrentOp) +} + +func (self *CpuMiner) update() { +out: + for { + select { + case block := <-self.c: + minerlogger.Infof("miner[%d] got block\n", self.index) + // make sure it's open + self.quitCurrentOp <- struct{}{} + + go self.mine(block) + case <-self.quit: + break out + } + } + +done: + // Empty channel + for { + select { + case <-self.c: + default: + close(self.c) + + break done + } + } +} + +func (self *CpuMiner) mine(block *types.Block) { + minerlogger.Infof("started agent[%d]. mining...\n", self.index) + nonce := self.pow.Search(block, self.quitCurrentOp) + if nonce != nil { + self.returnCh <- nonce + } +} -- cgit From 8a0f23915e4feb9aabe21bd075416bc0f32bbc43 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 13 Feb 2015 17:23:09 +0100 Subject: 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 --- miner/agent.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'miner/agent.go') diff --git a/miner/agent.go b/miner/agent.go index b12b9da4d..ddd8e6675 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} } } -- cgit From 32c7ebc51dcb31f21efe1b9c75f2b86cd216f510 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 14 Feb 2015 16:52:14 +0100 Subject: Fixed mining & limited hash power --- miner/agent.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'miner/agent.go') diff --git a/miner/agent.go b/miner/agent.go index ddd8e6675..9046f5d5a 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -17,32 +17,35 @@ type CpuMiner struct { func NewCpuMiner(index int, pow pow.PoW) *CpuMiner { miner := &CpuMiner{ - c: make(chan *types.Block, 1), - quit: make(chan struct{}), - quitCurrentOp: make(chan struct{}, 1), - pow: pow, - index: index, + pow: pow, + index: index, } - go miner.update() 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<- Work) { self.returnCh = ch } +func (self *CpuMiner) SetWorkCh(ch chan<- Work) { self.returnCh = ch } func (self *CpuMiner) Stop() { close(self.quit) close(self.quitCurrentOp) } +func (self *CpuMiner) Start() { + self.quit = make(chan struct{}) + self.quitCurrentOp = make(chan struct{}, 1) + self.c = make(chan *types.Block, 1) + + go self.update() +} + func (self *CpuMiner) update() { out: for { select { case block := <-self.c: - // make sure it's open self.quitCurrentOp <- struct{}{} go self.mine(block) -- cgit