2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  miner  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"math/big" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"sort" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 16:16:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"sync" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"sync/atomic" 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 11:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-10 23:12:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/accounts" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/common" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/core" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/core/state" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/core/types" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/event" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-01 16:09:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/logger" 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 23:04:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/logger/glog" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/pow" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"gopkg.in/fatih/set.v0" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-01 16:09:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								var  jsonlogger  =  logger . NewJsonLogger ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Work holds the current work  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Work  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Number     uint64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Nonce      uint64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MixDigest  [ ] byte 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SeedHash   [ ] byte 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Agent can register themself with the worker  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Agent  interface  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Work ( )  chan <-  * types . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SetReturnCh ( chan <-  * types . Block ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Stop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Start ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetHashRate ( )  int64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:00:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  miningLogAtDepth  =  5  
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:04:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  uint64RingBuffer  struct  {  
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ints  [ ] uint64  //array of all integers in buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									next  int       //where is the next insertion? assert 0 <= next < len(ints) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// environment is the workers current environment and holds  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// all of the current state information  
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								type  environment  struct  {  
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									totalUsedGas        * big . Int            // total gas usage in the cycle 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									state               * state . StateDB      // apply state changes here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									coinbase            * state . StateObject  // the miner's account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block               * types . Block        // the new block 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ancestors           * set . Set            // ancestor set (used for checking uncle parent validity) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									family              * set . Set            // family set (used for checking uncle invalidity) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uncles              * set . Set            // uncle set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									remove              * set . Set            // tx which will be removed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcount              int                 // tx count in cycle 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ignoredTransactors  * set . Set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lowGasTransactors   * set . Set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ownedAccounts       * set . Set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lowGasTxs           types . Transactions 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:04:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									localMinedBlocks    * uint64RingBuffer  // the most recent block numbers that were mined locally (used to check block inclusion) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// env returns a new environment for the current cycle  
						 
					
						
							
								
									
										
										
										
											2015-02-17 12:24:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  env ( block  * types . Block ,  eth  core . Backend )  * environment  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state  :=  state . New ( block . Root ( ) ,  eth . StateDb ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									env  :=  & environment { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										totalUsedGas :  new ( big . Int ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										state :         state , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block :         block , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ancestors :     set . New ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										family :        set . New ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										uncles :        set . New ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										coinbase :      state . GetOrNewStateObject ( block . Coinbase ( ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  env 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// worker is the main object which takes care of applying messages to the new state  
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								type  worker  struct  {  
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mu  sync . Mutex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									agents  [ ] Agent 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									recv    chan  * types . Block 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									mux     * event . TypeMux 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									quit    chan  struct { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pow     pow . PoW 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-05 18:57:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eth    core . Backend 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chain  * core . ChainManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									proc   * core . BlockProcessor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									coinbase  common . Address 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:04:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gasPrice  * big . Int 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-05 18:57:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									extra     [ ] byte 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									currentMu  sync . Mutex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current    * environment 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uncleMu         sync . Mutex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									possibleUncles  map [ common . Hash ] * types . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									txQueueMu  sync . Mutex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									txQueue    map [ common . Hash ] * types . Transaction 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// atomic status counters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mining  int32 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									atWork  int32 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  newWorker ( coinbase  common . Address ,  eth  core . Backend )  * worker  {  
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									worker  :=  & worker { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										eth :             eth , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										mux :             eth . EventMux ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										recv :            make ( chan  * types . Block ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:04:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										gasPrice :        new ( big . Int ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										chain :           eth . ChainManager ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										proc :            eth . BlockProcessor ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										possibleUncles :  make ( map [ common . Hash ] * types . Block ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										coinbase :        coinbase , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										txQueue :         make ( map [ common . Hash ] * types . Transaction ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 00:30:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										quit :            make ( chan  struct { } ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									go  worker . update ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									go  worker . wait ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									worker . commitNewWork ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  worker 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  pendingState ( )  * state . StateDB  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . current . state 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  pendingBlock ( )  * types . Block  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  self . current . block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  start ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:32:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									atomic . StoreInt32 ( & self . mining ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 16:52:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// spin up agents 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										agent . Start ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  stop ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:32:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  1  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 15:43:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										var  keep  [ ] Agent 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 00:30:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// stop all agents 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  _ ,  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											agent . Stop ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 15:43:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// keep all that's not a cpu agent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  _ ,  ok  :=  agent . ( * CpuAgent ) ;  ! ok  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												keep  =  append ( keep ,  agent ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 00:30:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 15:43:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . agents  =  keep 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 00:30:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									atomic . StoreInt32 ( & self . mining ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									atomic . StoreInt32 ( & self . atWork ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  register ( agent  Agent )  {  
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:32:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									self . agents  =  append ( self . agents ,  agent ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									agent . SetReturnCh ( self . recv ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  update ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									events  :=  self . mux . Subscribe ( core . ChainHeadEvent { } ,  core . ChainSideEvent { } ,  core . TxPreEvent { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  event  :=  <- events . Chan ( ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 22:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											switch  ev  :=  event . ( type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  core . ChainHeadEvent : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 16:52:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . commitNewWork ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:14:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  core . ChainSideEvent : 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . uncleMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . possibleUncles [ ev . Block . Hash ( ) ]  =  ev . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . uncleMu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											case  core . TxPreEvent : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// Apply transaction to the pending state if we're not mining 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  atomic . LoadInt32 ( & self . mining )  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													self . commitTransactions ( types . Transactions { ev . Tx } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													self . mu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . quit : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break  out 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									events . Unsubscribe ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:04:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  newLocalMinedBlock ( blockNumber  uint64 ,  prevMinedBlocks  * uint64RingBuffer )  ( minedBlocks  * uint64RingBuffer )  {  
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  prevMinedBlocks  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:16:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										minedBlocks  =  & uint64RingBuffer { next :  0 ,  ints :  make ( [ ] uint64 ,  miningLogAtDepth + 1 ) } 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										minedBlocks  =  prevMinedBlocks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									minedBlocks . ints [ minedBlocks . next ]  =  blockNumber 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									minedBlocks . next  =  ( minedBlocks . next  +  1 )  %  len ( minedBlocks . ints ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  minedBlocks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  wait ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  block  :=  range  self . recv  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											atomic . AddInt32 ( & self . atWork ,  - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  block  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-29 14:00:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  _ ,  err  :=  self . chain . InsertChain ( types . Blocks { block } ) ;  err  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  _ ,  uncle  :=  range  block . Uncles ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													delete ( self . possibleUncles ,  uncle . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 16:52:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . mux . Post ( core . NewMinedBlockEvent { block } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-25 13:51:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:16:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												var  stale ,  confirm  string 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 17:51:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												canonBlock  :=  self . chain . GetBlockByNumber ( block . NumberU64 ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  canonBlock  !=  nil  &&  canonBlock . Hash ( )  !=  block . Hash ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:16:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													stale  =  "stale " 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-26 18:54:56 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:16:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													confirm  =  "Wait 5 blocks for confirmation" 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-26 18:54:56 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													self . current . localMinedBlocks  =  newLocalMinedBlock ( block . Number ( ) . Uint64 ( ) ,  self . current . localMinedBlocks ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-17 17:51:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:16:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												glog . V ( logger . Info ) . Infof ( "🔨  Mined %sblock (#%v / %x). %s" ,  stale ,  block . Number ( ) ,  block . Hash ( ) . Bytes ( ) [ : 4 ] ,  confirm ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-02 12:58:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-25 13:51:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												jsonlogger . LogJson ( & logger . EthMinerNewBlock { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockHash :      block . Hash ( ) . Hex ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockNumber :    block . Number ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ChainHeadHash :  block . ParentHeaderHash . Hex ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockPrevHash :  block . ParentHeaderHash . Hex ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . commitNewWork ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  push ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  1  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . current . block . SetRoot ( self . current . state . Root ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 16:52:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// push new work to agents 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  _ ,  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											atomic . AddInt32 ( & self . atWork ,  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 17:04:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  agent . Work ( )  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												agent . Work ( )  <-  self . current . block . Copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												common . Report ( fmt . Sprintf ( "%v %T\n" ,  agent ,  agent ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  makeCurrent ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-03-05 09:14:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  :=  self . chain . NewBlock ( self . coinbase ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:08:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parent  :=  self . chain . GetBlock ( block . ParentHash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-28 17:18:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// TMP fix for build server ... 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  parent  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-27 13:08:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  block . Time ( )  <=  parent . Time ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block . Header ( ) . Time  =  parent . Header ( ) . Time  +  1 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 13:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-05 18:57:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block . Header ( ) . Extra  =  self . extra 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-05 09:14:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-18 15:31:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// when 08 is processed ancestors contain 07 (quick block) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current  :=  env ( block ,  self . eth ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  ancestor  :=  range  self . chain . GetAncestors ( block ,  7 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  _ ,  uncle  :=  range  ancestor . Uncles ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current . family . Add ( uncle . Hash ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current . family . Add ( ancestor . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-14 05:02:15 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current . ancestors . Add ( ancestor . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									accounts ,  _  :=  self . eth . AccountManager ( ) . Accounts ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Keep track of transactions which return errors so they can be removed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . remove  =  set . New ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . tcount  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . ignoredTransactors  =  set . New ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . lowGasTransactors  =  set . New ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . ownedAccounts  =  accountAddressesSet ( accounts ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  self . current  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										current . localMinedBlocks  =  self . current . localMinedBlocks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current . coinbase . SetGasPool ( core . CalcGasLimit ( parent ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . current  =  current 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:04:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( w  * worker )  setGasPrice ( p  * big . Int )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  w . mu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-10 23:12:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// calculate the minimal gas price the miner accepts when sorting out transactions. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  pct  =  int64 ( 90 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w . gasPrice  =  gasprice ( p ,  pct ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w . mux . Post ( core . GasPriceChanged { w . gasPrice } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:04:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  isBlockLocallyMined ( deepBlockNum  uint64 )  bool  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//Did this instance mine a block at {deepBlockNum} ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  isLocal  =  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  idx ,  blockNum  :=  range  self . current . localMinedBlocks . ints  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  deepBlockNum  ==  blockNum  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											isLocal  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . localMinedBlocks . ints [ idx ]  =  0  //prevent showing duplicate logs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//Short-circuit on false, because the previous and following tests must both be true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ! isLocal  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//Does the block at {deepBlockNum} send earnings to my coinbase? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  block  =  self . chain . GetBlockByNumber ( deepBlockNum ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-08 11:49:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  block  !=  nil  &&  block . Header ( ) . Coinbase  ==  self . coinbase 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  logLocalMinedBlocks ( previous  * environment )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  previous  !=  nil  &&  self . current . localMinedBlocks  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nextBlockNum  :=  self . current . block . Number ( ) . Uint64 ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  checkBlockNum  :=  previous . block . Number ( ) . Uint64 ( ) ;  checkBlockNum  <  nextBlockNum ;  checkBlockNum ++  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:00:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											inspectBlockNum  :=  checkBlockNum  -  miningLogAtDepth 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  self . isBlockLocallyMined ( inspectBlockNum )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-23 12:00:18 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												glog . V ( logger . Info ) . Infof ( "🔨 🔗  Mined %d blocks back: block #%v" ,  miningLogAtDepth ,  inspectBlockNum ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  commitNewWork ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . uncleMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . uncleMu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 11:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tstart  :=  time . Now ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									previous  :=  self . current 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . makeCurrent ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current  :=  self . current 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									transactions  :=  self . eth . TxPool ( ) . GetTransactions ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sort . Sort ( types . TxByNonce { transactions } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// commit transactions for this run 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . commitTransactions ( transactions ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . eth . TxPool ( ) . RemoveTransactions ( current . lowGasTxs ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uncles     [ ] * types . Header 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										badUncles  [ ] common . Hash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  hash ,  uncle  :=  range  self . possibleUncles  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:14:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  len ( uncles )  ==  2  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  :=  self . commitUncle ( uncle . Header ( ) ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-15 12:12:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  glog . V ( logger . Ridiculousness )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												glog . V ( logger . Detail ) . Infof ( "Bad uncle found and will be removed (%x)\n" ,  hash [ : 4 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												glog . V ( logger . Detail ) . Infoln ( uncle ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											badUncles  =  append ( badUncles ,  hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 14:57:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											glog . V ( logger . Debug ) . Infof ( "commiting %x as uncle\n" ,  hash [ : 4 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:14:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uncles  =  append ( uncles ,  uncle . Header ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 14:57:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// We only care about logging if we're actually mining 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  1  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 11:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										glog . V ( logger . Info ) . Infof ( "commit new work on block %v with %d txs & %d uncles. Took %v\n" ,  current . block . Number ( ) ,  current . tcount ,  len ( uncles ) ,  time . Since ( tstart ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-21 08:50:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . logLocalMinedBlocks ( previous ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 14:57:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  hash  :=  range  badUncles  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										delete ( self . possibleUncles ,  hash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:35:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:14:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . current . block . SetUncles ( uncles ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-01 21:18:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									core . AccumulateRewards ( self . current . state ,  self . current . block ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-01 23:58:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . current . state . Update ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . push ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									inclusionReward  =  new ( big . Int ) . Div ( core . BlockReward ,  big . NewInt ( 32 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_uncleReward     =  new ( big . Int ) . Mul ( core . BlockReward ,  big . NewInt ( 15 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uncleReward      =  new ( big . Int ) . Div ( _uncleReward ,  big . NewInt ( 16 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  commitUncle ( uncle  * types . Header )  error  {  
						 
					
						
							
								
									
										
										
										
											2015-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  self . current . uncles . Has ( uncle . Hash ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										// Error not unique 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  core . UncleError ( "Uncle not unique" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! self . current . ancestors . Has ( uncle . ParentHash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  core . UncleError ( fmt . Sprintf ( "Uncle's parent unknown (%x)" ,  uncle . ParentHash [ 0 : 4 ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  self . current . family . Has ( uncle . Hash ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  core . UncleError ( fmt . Sprintf ( "Uncle already in family (%x)" ,  uncle . Hash ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-15 11:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . current . uncles . Add ( uncle . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  commitTransactions ( transactions  types . Transactions )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current  :=  self . current 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  tx  :=  range  transactions  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// We can skip err. It has already been validated in the tx pool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										from ,  _  :=  tx . From ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Check if it falls within margin. Txs from owned accounts are always processed. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  tx . GasPrice ( ) . Cmp ( self . gasPrice )  <  0  &&  ! current . ownedAccounts . Has ( from )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// ignore the transaction and transactor. We ignore the transactor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// because nonce will fail after ignoring this transaction so there's 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// no point 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current . lowGasTransactors . Add ( from ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											glog . V ( logger . Info ) . Infof ( "transaction(%x) below gas price (tx=%v ask=%v). All sequential txs from this address(%x) will be ignored\n" ,  tx . Hash ( ) . Bytes ( ) [ : 4 ] ,  common . CurrencyToString ( tx . GasPrice ( ) ) ,  common . CurrencyToString ( self . gasPrice ) ,  from [ : 4 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Continue with the next transaction if the transaction sender is included in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the low gas tx set. This will also remove the tx and all sequential transaction 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// from this transactor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  current . lowGasTransactors . Has ( from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// add tx to the low gas set. This will be removed at the end of the run 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// owned accounts are ignored 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ! current . ownedAccounts . Has ( from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												current . lowGasTxs  =  append ( current . lowGasTxs ,  tx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Move on to the next transaction when the transactor is in ignored transactions set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This may occur when a transaction hits the gas limit. When a gas limit is hit and 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the transaction is processed (that could potentially be included in the block) it 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// will throw a nonce error because the previous transaction hasn't been processed. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Therefor we need to ignore any transaction after the ignored one. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  current . ignoredTransactors . Has ( from )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										self . current . state . StartRecord ( tx . Hash ( ) ,  common . Hash { } ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  :=  self . commitTransaction ( tx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  core . IsNonceErr ( err )  ||  core . IsInvalidTxErr ( err ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current . remove . Add ( tx . Hash ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  glog . V ( logger . Detail )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												glog . Infof ( "TX (%x) failed, will be removed: %v\n" ,  tx . Hash ( ) . Bytes ( ) [ : 4 ] ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  state . IsGasLimitErr ( err ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											from ,  _  :=  tx . From ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// ignore the transactor so no nonce errors will be thrown for this account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// next time the worker is run, they'll be picked up again. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current . ignoredTransactors . Add ( from ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											glog . V ( logger . Detail ) . Infof ( "Gas limit reached for (%x) in this block. Continue to try smaller txs\n" ,  from [ : 4 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current . tcount ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-10 13:52:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . current . block . Header ( ) . GasUsed  =  self . current . totalUsedGas 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  commitTransaction ( tx  * types . Transaction )  error  {  
						 
					
						
							
								
									
										
										
										
											2015-03-11 16:32:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									snap  :=  self . current . state . Copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 16:16:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receipt ,  _ ,  err  :=  self . proc . ApplyTransaction ( self . current . coinbase ,  self . current . state ,  self . current . block ,  tx ,  self . current . totalUsedGas ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-11 16:32:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  !=  nil  &&  ( core . IsNonceErr ( err )  ||  state . IsGasLimitErr ( err )  ||  core . IsInvalidTxErr ( err ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										self . current . state . Set ( snap ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . current . block . AddTransaction ( tx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . current . block . AddReceipt ( receipt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-02-28 23:09:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-14 03:39:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// TODO: remove or use  
						 
					
						
							
								
									
										
										
										
											2015-02-28 23:09:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  HashRate ( )  int64  {  
						 
					
						
							
								
									
										
										
										
											2015-05-14 03:39:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  0 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-28 23:09:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-05-09 12:13:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// gasprice calculates a reduced gas price based on the pct  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// XXX Use big.Rat?  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  gasprice ( price  * big . Int ,  pct  int64 )  * big . Int  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p  :=  new ( big . Int ) . Set ( price ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p . Div ( p ,  big . NewInt ( 100 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p . Mul ( p ,  big . NewInt ( pct ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  p 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-05-10 23:12:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  accountAddressesSet ( accounts  [ ] accounts . Account )  * set . Set  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									accountSet  :=  set . New ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  account  :=  range  accounts  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-10 20:30:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										accountSet . Add ( account . Address ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-10 23:12:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  accountSet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}