| 
									
										
										
										
											2015-03-23 11:21:41 +01:00
										 |  |  | package miner | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-04-20 00:41:50 +02:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2015-04-19 17:42:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:09:48 +01:00
										 |  |  | 	"github.com/ethereum/ethash" | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | type RemoteAgent struct { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	work        *types.Block | 
					
						
							|  |  |  | 	currentWork *types.Block | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	quit     chan struct{} | 
					
						
							|  |  |  | 	workCh   chan *types.Block | 
					
						
							| 
									
										
										
										
											2015-03-24 10:34:06 +01:00
										 |  |  | 	returnCh chan<- *types.Block | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func NewRemoteAgent() *RemoteAgent { | 
					
						
							|  |  |  | 	agent := &RemoteAgent{} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return agent | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) Work() chan<- *types.Block { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	return a.workCh | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:34:06 +01:00
										 |  |  | func (a *RemoteAgent) SetReturnCh(returnCh chan<- *types.Block) { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	a.returnCh = returnCh | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) Start() { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	a.quit = make(chan struct{}) | 
					
						
							|  |  |  | 	a.workCh = make(chan *types.Block, 1) | 
					
						
							| 
									
										
										
										
											2015-03-23 16:35:44 +01:00
										 |  |  | 	go a.run() | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) Stop() { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	close(a.quit) | 
					
						
							|  |  |  | 	close(a.workCh) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) GetHashRate() int64 { return 0 } | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) run() { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | out: | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							|  |  |  | 		case <-a.quit: | 
					
						
							|  |  |  | 			break out | 
					
						
							|  |  |  | 		case work := <-a.workCh: | 
					
						
							|  |  |  | 			a.work = work | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) GetWork() [3]string { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	var res [3]string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if a.work != nil { | 
					
						
							| 
									
										
										
										
											2015-04-19 21:58:58 +02:00
										 |  |  | 		a.currentWork = a.work | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:09:48 +01:00
										 |  |  | 		res[0] = a.work.HashNoNonce().Hex() | 
					
						
							|  |  |  | 		seedHash, _ := ethash.GetSeedHash(a.currentWork.NumberU64()) | 
					
						
							| 
									
										
										
										
											2015-05-11 10:11:33 -04:00
										 |  |  | 		res[1] = common.BytesToHash(seedHash).Hex() | 
					
						
							| 
									
										
										
										
											2015-04-20 00:41:50 +02:00
										 |  |  | 		// Calculate the "target" to be returned to the external miner | 
					
						
							|  |  |  | 		n := big.NewInt(1) | 
					
						
							|  |  |  | 		n.Lsh(n, 255) | 
					
						
							|  |  |  | 		n.Div(n, a.work.Difficulty()) | 
					
						
							|  |  |  | 		n.Lsh(n, 1) | 
					
						
							| 
									
										
										
										
											2015-05-11 10:11:33 -04:00
										 |  |  | 		res[2] = common.BytesToHash(n.Bytes()).Hex() | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:14:42 +01:00
										 |  |  | func (a *RemoteAgent) SubmitWork(nonce uint64, mixDigest, seedHash common.Hash) bool { | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 	// Return true or false, but does not indicate if the PoW was correct | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Make sure the external miner was working on the right hash | 
					
						
							| 
									
										
										
										
											2015-03-24 10:34:06 +01:00
										 |  |  | 	if a.currentWork != nil && a.work != nil { | 
					
						
							|  |  |  | 		a.currentWork.SetNonce(nonce) | 
					
						
							|  |  |  | 		a.currentWork.Header().MixDigest = mixDigest | 
					
						
							|  |  |  | 		a.returnCh <- a.currentWork | 
					
						
							|  |  |  | 		//a.returnCh <- Work{a.currentWork.Number().Uint64(), nonce, mixDigest.Bytes(), seedHash.Bytes()} | 
					
						
							| 
									
										
										
										
											2015-03-23 09:35:42 +01:00
										 |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } |