2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Copyright 2015 The go-ethereum Authors  
						 
					
						
							
								
									
										
										
										
											2015-07-22 18:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// This file is part of the go-ethereum library.  
						 
					
						
							
								
									
										
										
										
											2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
									
										
										
										
											2015-07-23 18:35:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// The go-ethereum library is free software: you can redistribute it and/or modify  
						 
					
						
							
								
									
										
										
										
											2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// it under the terms of the GNU Lesser General Public License as published by  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// the Free Software Foundation, either version 3 of the License, or  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// (at your option) any later version.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
									
										
										
										
											2015-07-22 18:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// The go-ethereum library is distributed in the hope that it will be useful,  
						 
					
						
							
								
									
										
										
										
											2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of  
						 
					
						
							
								
									
										
										
										
											2015-07-22 18:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
						 
					
						
							
								
									
										
										
										
											2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// GNU Lesser General Public License for more details.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You should have received a copy of the GNU Lesser General Public License  
						 
					
						
							
								
									
										
										
										
											2015-07-22 18:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.  
						 
					
						
							
								
									
										
										
										
											2015-07-07 02:54:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  miner  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2016-07-08 18:48:17 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"bytes" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"math/big" 
							 
						 
					
						
							
								
									
										
										
										
											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-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/common" 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/consensus" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/consensus/misc" 
							 
						 
					
						
							
								
									
										
										
										
											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" 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-30 10:19:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/core/vm" 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 09:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/ethdb" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/event" 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 14:10:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/log" 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 13:00:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/params" 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"gopkg.in/fatih/set.v0" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									resultQueueSize   =  10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									miningLogAtDepth  =  5 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// txChanSize is the size of channel listening to TxPreEvent. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The number is referenced from the size of tx pool. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									txChanSize  =  4096 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// chainHeadChanSize is the size of channel listening to ChainHeadEvent. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainHeadChanSize  =  10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// chainSideChanSize is the size of channel listening to ChainSideEvent. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainSideChanSize  =  10 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Agent can register themself with the worker  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Agent  interface  {  
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Work ( )  chan <-  * Work 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SetReturnCh ( chan <-  * Result ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Stop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Start ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetHashRate ( )  int64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 20:14:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Work is the workers current environment and holds  
						 
					
						
							
								
									
										
										
										
											2015-05-11 21:47:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// all of the current state information  
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  Work  struct  {  
						 
					
						
							
								
									
										
										
										
											2016-11-02 13:44:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config  * params . ChainConfig 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									signer  types . Signer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 22:07:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state      * state . StateDB  // apply state changes here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ancestors  * set . Set        // ancestor set (used for checking uncle parent validity) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									family     * set . Set        // family set (used for checking uncle invalidity) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uncles     * set . Set        // uncle set 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tcount     int             // tx count in cycle 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Block  * types . Block  // the new block 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									header    * types . Header 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									txs       [ ] * types . Transaction 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									receipts  [ ] * types . Receipt 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									createdAt  time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Result  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Work   * Work 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Block  * types . Block 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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  {  
						 
					
						
							
								
									
										
										
										
											2016-10-20 13:36:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									config  * params . ChainConfig 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  consensus . Engine 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 23:32:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mu  sync . Mutex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// update loop 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mux           * event . TypeMux 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									txCh          chan  core . TxPreEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									txSub         event . Subscription 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainHeadCh   chan  core . ChainHeadEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainHeadSub  event . Subscription 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainSideCh   chan  core . ChainSideEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainSideSub  event . Subscription 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									wg            sync . WaitGroup 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									agents  map [ Agent ] struct { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									recv    chan  * Result 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 20:14:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eth      Backend 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-31 17:09:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									chain    * core . BlockChain 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-19 16:08:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									proc     core . Validator 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-14 09:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									chainDb  ethdb . Database 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-05 18:57:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-18 13:00:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									coinbase  common . Address 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									current    * Work 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 15:10:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unconfirmed  * unconfirmedBlocks  // set of locally mined blocks pending canonicalness confirmations 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 13:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// atomic status counters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									mining  int32 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									atWork  int32 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  newWorker ( config  * params . ChainConfig ,  engine  consensus . Engine ,  coinbase  common . Address ,  eth  Backend ,  mux  * event . TypeMux )  * worker  {  
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									worker  :=  & worker { 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 23:32:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										config :          config , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										engine :          engine , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										eth :             eth , 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 20:14:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mux :             mux , 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										txCh :            make ( chan  core . TxPreEvent ,  txChanSize ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										chainHeadCh :     make ( chan  core . ChainHeadEvent ,  chainHeadChanSize ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										chainSideCh :     make ( chan  core . ChainSideEvent ,  chainSideChanSize ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-06 19:57:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										chainDb :         eth . ChainDb ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										recv :            make ( chan  * Result ,  resultQueueSize ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-31 17:09:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										chain :           eth . BlockChain ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-19 16:08:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										proc :            eth . BlockChain ( ) . Validator ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										possibleUncles :  make ( map [ common . Hash ] * types . Block ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										coinbase :        coinbase , 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										agents :          make ( map [ Agent ] struct { } ) , 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-06 19:40:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unconfirmed :     newUnconfirmedBlocks ( eth . BlockChain ( ) ,  miningLogAtDepth ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Subscribe TxPreEvent for tx pool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									worker . txSub  =  eth . TxPool ( ) . SubscribeTxPreEvent ( worker . txCh ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Subscribe events for blockchain 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									worker . chainHeadSub  =  eth . BlockChain ( ) . SubscribeChainHeadEvent ( worker . chainHeadCh ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									worker . chainSideSub  =  eth . BlockChain ( ) . SubscribeChainSideEvent ( worker . chainSideCh ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									go  worker . update ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									go  worker . wait ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									worker . commitNewWork ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  worker 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-07 10:58:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  setEtherbase ( addr  common . Address )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . coinbase  =  addr 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 14:03:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  setExtra ( extra  [ ] byte )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . extra  =  extra 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-16 11:20:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  pending ( )  ( * types . Block ,  * state . StateDB )  {  
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-20 14:37:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  types . NewBlock ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . header , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . txs , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . receipts , 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-18 21:34:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										) ,  self . current . state . Copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-04 12:36:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  self . current . Block ,  self . current . state . Copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-30 10:48:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  pendingBlock ( )  * types . Block  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  types . NewBlock ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . header , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . txs , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . current . receipts , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . current . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-07 12:32:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								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 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-14 16:52:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										agent . Start ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  stop ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . wg . Wait ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-08 00:30:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											agent . Stop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											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-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . agents [ agent ]  =  struct { } { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-24 10:34:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									agent . SetReturnCh ( self . recv ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-29 13:28:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  unregister ( agent  Agent )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									delete ( self . agents ,  agent ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									agent . Stop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  ( self  * worker )  update ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									defer  self . txSub . Unsubscribe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . chainHeadSub . Unsubscribe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . chainSideSub . Unsubscribe ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// A real event arrived, process interesting content 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Handle ChainHeadEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . chainHeadCh : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											self . commitNewWork ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Handle ChainSideEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ev  :=  <- self . chainSideCh : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											self . uncleMu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . possibleUncles [ ev . Block . Hash ( ) ]  =  ev . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . uncleMu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Handle TxPreEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ev  :=  <- self . txCh : 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Apply transaction to the pending state if we're not mining 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  atomic . LoadInt32 ( & self . mining )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . currentMu . Lock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-02 13:44:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												acc ,  _  :=  types . Sender ( self . current . signer ,  ev . Tx ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-06 15:52:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												txs  :=  map [ common . Address ] types . Transactions { acc :  { ev . Tx } } 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-07 16:22:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												txset  :=  types . NewTransactionsByPriceAndNonce ( self . current . signer ,  txs ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 22:07:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . current . commitTransactions ( self . mux ,  txset ,  self . chain ,  self . coinbase ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-29 03:08:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . currentMu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-24 13:40:42 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// If we're mining, but nothing is being processed, wake on new transactions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  self . config . Clique  !=  nil  &&  self . config . Clique . Period  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													self . commitNewWork ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-18 18:58:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// System stopped 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . txSub . Err ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . chainHeadSub . Err ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . chainSideSub . Err ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  wait ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mustCommitNewWork  :=  true 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  result  :=  range  self . recv  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-22 10:58:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											atomic . AddInt32 ( & self . atWork ,  - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  result  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											block  :=  result . Block 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											work  :=  result . Work 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-26 17:45:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-11 13:13:05 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Update the block hash in all logs since it is now available and not when the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// receipt/log of individual transactions were created. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  _ ,  r  :=  range  work . receipts  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  _ ,  l  :=  range  r . Logs  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													l . BlockHash  =  block . Hash ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-03 11:24:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-11 13:13:05 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  _ ,  log  :=  range  work . state . Logs ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												log . BlockHash  =  block . Hash ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											stat ,  err  :=  self . chain . WriteBlockAndState ( block ,  work . receipts ,  work . state ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												log . Error ( "Failed writing block to chain" ,  "err" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// check if canon block and write transactions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  stat  ==  core . CanonStatTy  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												// implicit by posting ChainHeadEvent 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mustCommitNewWork  =  false 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Broadcast the block and announce chain insertion event 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . mux . Post ( core . NewMinedBlockEvent { Block :  block } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												events  [ ] interface { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												logs    =  work . state . Logs ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											events  =  append ( events ,  core . ChainEvent { Block :  block ,  Hash :  block . Hash ( ) ,  Logs :  logs } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  stat  ==  core . CanonStatTy  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												events  =  append ( events ,  core . ChainHeadEvent { Block :  block } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											self . chain . PostChainEvents ( events ,  logs ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 13:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Insert the block into the set of pending ones to wait for confirmations 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 15:10:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											self . unconfirmed . Insert ( block . NumberU64 ( ) ,  block . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 12:12:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  mustCommitNewWork  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . commitNewWork ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-04-04 13:18:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// push sends a new work task to currently live miner agents.  
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  push ( work  * Work )  {  
						 
					
						
							
								
									
										
										
										
											2016-04-04 13:18:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  !=  1  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  agent  :=  range  self . agents  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										atomic . AddInt32 ( & self . atWork ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ch  :=  agent . Work ( ) ;  ch  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ch  <-  work 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-13 17:23:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// makeCurrent creates a new environment for the current cycle.  
						 
					
						
							
								
									
										
										
										
											2015-10-06 16:35:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  makeCurrent ( parent  * types . Block ,  header  * types . Header )  error  {  
						 
					
						
							
								
									
										
										
										
											2016-09-27 13:13:13 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state ,  err  :=  self . chain . StateAt ( parent . Root ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 16:35:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									work  :=  & Work { 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-01 23:32:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										config :     self . config , 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-02 13:44:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										signer :     types . NewEIP155Signer ( self . config . ChainId ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										state :      state , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ancestors :  set . New ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										family :     set . New ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uncles :     set . New ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										header :     header , 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 20:45:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										createdAt :  time . Now ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-04 13:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											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-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  ancestor  :=  range  self . chain . GetBlocksFromHash ( parent . Hash ( ) ,  7 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  _ ,  uncle  :=  range  ancestor . Uncles ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											work . family . Add ( uncle . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-13 20:46:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										work . family . Add ( ancestor . Hash ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										work . ancestors . Add ( ancestor . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-06 19:40:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Keep track of transactions which return errors so they can be removed 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									work . tcount  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . current  =  work 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 16:35:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											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-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parent  :=  self . chain . CurrentBlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tstamp  :=  tstart . Unix ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-02 23:24:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  parent . Time ( ) . Cmp ( new ( big . Int ) . SetInt64 ( tstamp ) )  >=  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-24 02:52:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										tstamp  =  parent . Time ( ) . Int64 ( )  +  1 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 18:55:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// this will ensure we're not going off too far in the future 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  now  :=  time . Now ( ) . Unix ( ) ;  tstamp  >  now + 1  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 18:55:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										wait  :=  time . Duration ( tstamp - now )  *  time . Second 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										log . Info ( "Mining too far in the future" ,  "wait" ,  common . PrettyDuration ( wait ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 18:55:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										time . Sleep ( wait ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									num  :=  parent . Number ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									header  :=  & types . Header { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ParentHash :  parent . Hash ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Number :      num . Add ( num ,  common . Big1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GasLimit :    core . CalcGasLimit ( parent ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GasUsed :     new ( big . Int ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Extra :       self . extra , 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-24 02:52:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Time :        big . NewInt ( tstamp ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Only set the coinbase if we are mining (avoid spurious block rewards) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  1  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										header . Coinbase  =  self . coinbase 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  :=  self . engine . Prepare ( self . chain ,  header ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										log . Error ( "Failed to prepare header for mining" ,  "err" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 18:48:17 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If we are care about TheDAO hard-fork check whether to override the extra-data or not 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 13:00:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  daoBlock  :=  self . config . DAOForkBlock ;  daoBlock  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check whether the block is among the fork extra-override range 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										limit  :=  new ( big . Int ) . Add ( daoBlock ,  params . DAOForkExtraRange ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-14 11:22:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  header . Number . Cmp ( daoBlock )  >=  0  &&  header . Number . Cmp ( limit )  <  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 18:48:17 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Depending whether we support or oppose the fork, override differently 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  self . config . DAOForkSupport  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												header . Extra  =  common . CopyBytes ( params . DAOForkBlockExtra ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-06 16:44:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  if  bytes . Equal ( header . Extra ,  params . DAOForkBlockExtra )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 18:48:17 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												header . Extra  =  [ ] byte { }  // If miner opposes, don't let it use the reserved extra-data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-08 13:00:37 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 16:35:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Could potentially happen if starting to mine in an odd state. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  :=  self . makeCurrent ( parent ,  header ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										log . Error ( "Failed to create mining context" ,  "err" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-06 16:35:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-11 13:55:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Create the current work task and check any fork transitions needed 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									work  :=  self . current 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-11 13:55:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  self . config . DAOForkSupport  &&  self . config . DAOForkBlock  !=  nil  &&  self . config . DAOForkBlock . Cmp ( header . Number )  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										misc . ApplyDAOHardFork ( work . state ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-11 13:55:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-10 23:54:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pending ,  err  :=  self . eth . TxPool ( ) . Pending ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										log . Error ( "Failed to fetch pending transactions" ,  "err" ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-10 23:54:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-07 16:22:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									txs  :=  types . NewTransactionsByPriceAndNonce ( self . current . signer ,  pending ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 22:07:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									work . commitTransactions ( self . mux ,  txs ,  self . chain ,  self . coinbase ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-27 18:28:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// compute uncles for the new block. 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  :=  self . commitUncle ( work ,  uncle . Header ( ) ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log . Trace ( "Bad uncle found and will be removed" ,  "hash" ,  hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 14:10:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log . Trace ( fmt . Sprint ( uncle ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											badUncles  =  append ( badUncles ,  hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log . Debug ( "Committing new uncle to block" ,  "hash" ,  hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 16:14:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uncles  =  append ( uncles ,  uncle . Header ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 12:12:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-23 18:27:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  hash  :=  range  badUncles  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										delete ( self . possibleUncles ,  hash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Create the new block to seal with the consensus engine 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  work . Block ,  err  =  self . engine . Finalize ( self . chain ,  header ,  work . state ,  work . txs ,  uncles ,  work . receipts ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										log . Error ( "Failed to finalize block for sealing" ,  "err" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 15:17:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// We only care about logging if we're actually mining. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  atomic . LoadInt32 ( & self . mining )  ==  1  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										log . Info ( "Commit new mining work" ,  "number" ,  work . Block . Number ( ) ,  "txs" ,  work . tcount ,  "uncles" ,  len ( uncles ) ,  "elapsed" ,  common . PrettyDuration ( time . Since ( tstart ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-13 15:10:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . unconfirmed . Shift ( work . Block . NumberU64 ( )  -  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . push ( work ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * worker )  commitUncle ( work  * Work ,  uncle  * types . Header )  error  {  
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hash  :=  uncle . Hash ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  work . uncles . Has ( hash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "uncle not unique" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! work . ancestors . Has ( uncle . ParentHash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "uncle's parent unknown (%x)" ,  uncle . ParentHash [ 0 : 4 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  work . family . Has ( hash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "uncle already in family (%x)" ,  hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-04 20:38:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									work . uncles . Add ( uncle . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 22:07:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( env  * Work )  commitTransactions ( mux  * event . TypeMux ,  txs  * types . TransactionsByPriceAndNonce ,  bc  * core . BlockChain ,  coinbase  common . Address )  {  
						 
					
						
							
								
									
										
										
										
											2015-09-02 12:55:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									gp  :=  new ( core . GasPool ) . AddGas ( env . header . GasLimit ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 01:40:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 14:03:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  coalescedLogs  [ ] * types . Log 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-08 10:44:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Retrieve the next transaction and abort if all done 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tx  :=  txs . Peek ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  tx  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-19 23:50:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Error may be ignored here. The error has already been checked 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// during transaction acceptance is the transaction pool. 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-02 13:44:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// We use the eip155 signer regardless of the current hf. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										from ,  _  :=  types . Sender ( env . signer ,  tx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check whether the tx is replay protected. If we're not in the EIP155 hf 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// phase, start ignoring the sender until we do. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  tx . Protected ( )  &&  ! env . config . IsEIP155 ( env . header . Number )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log . Trace ( "Ignoring reply protected transaction" ,  "hash" ,  tx . Hash ( ) ,  "eip155" ,  env . config . EIP155Block ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-02 13:44:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txs . Pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Start executing the transaction 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-01 22:36:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										env . state . Prepare ( tx . Hash ( ) ,  common . Hash { } ,  env . tcount ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-12 16:38:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										err ,  logs  :=  env . commitTransaction ( tx ,  bc ,  coinbase ,  gp ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										switch  err  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  core . ErrGasLimitReached : 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Pop the current out-of-gas transaction without shifting in the next from the account 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-05 01:16:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											log . Trace ( "Gas limit exceeded for current block" ,  "sender" ,  from ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											txs . Pop ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-06 11:54:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-04 22:35:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  core . ErrNonceTooLow : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// New head notification data race between the transaction pool and miner, shift 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											log . Trace ( "Skipping transaction with low nonce" ,  "sender" ,  from ,  "nonce" ,  tx . Nonce ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txs . Shift ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  core . ErrNonceTooHigh : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Reorg notification data race between the transaction pool and miner, skip account = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											log . Trace ( "Skipping account with hight nonce" ,  "sender" ,  from ,  "nonce" ,  tx . Nonce ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txs . Pop ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  nil : 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Everything ok, collect the logs and shift in the next transaction from the same account 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 01:40:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											coalescedLogs  =  append ( coalescedLogs ,  logs ... ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-09 14:54:36 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											env . tcount ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txs . Shift ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-06 14:58:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-04 22:35:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Strange error, discard the transaction and get the next in line (note, the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// nonce-too-high clause will prevent us from executing in vain). 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											log . Debug ( "Transaction failed, account skipped" ,  "hash" ,  tx . Hash ( ) ,  "err" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											txs . Shift ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 18:48:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( coalescedLogs )  >  0  ||  env . tcount  >  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// make a copy, the state caches the logs and these logs get "upgraded" from pending to mined 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// logs by filling in the block hash when the block was mined by the local miner. This can 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// cause a race condition if a log was "upgraded" before the PendingLogsEvent is processed. 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 14:03:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cpy  :=  make ( [ ] * types . Log ,  len ( coalescedLogs ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  i ,  l  :=  range  coalescedLogs  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 14:03:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cpy [ i ]  =  new ( types . Log ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											* cpy [ i ]  =  * l 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 14:03:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										go  func ( logs  [ ] * types . Log ,  tcount  int )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-26 18:48:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  len ( logs )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mux . Post ( core . PendingLogsEvent { Logs :  logs } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  tcount  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mux . Post ( core . PendingStateEvent { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-28 14:59:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ( cpy ,  env . tcount ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 01:40:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-11 01:28:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-12 16:38:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( env  * Work )  commitTransaction ( tx  * types . Transaction ,  bc  * core . BlockChain ,  coinbase  common . Address ,  gp  * core . GasPool )  ( error ,  [ ] * types . Log )  {  
						 
					
						
							
								
									
										
										
										
											2016-10-04 12:36:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									snap  :=  env . state . Snapshot ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-24 13:06:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-12 16:38:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									receipt ,  _ ,  err  :=  core . ApplyTransaction ( env . config ,  bc ,  & coinbase ,  gp ,  env . state ,  env . header ,  tx ,  env . header . GasUsed ,  vm . Config { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-06 11:54:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-10-04 12:36:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										env . state . RevertToSnapshot ( snap ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 01:40:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  err ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-16 12:41:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									env . txs  =  append ( env . txs ,  tx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									env . receipts  =  append ( env . receipts ,  receipt ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-13 01:40:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 11:52:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil ,  receipt . Logs 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 05:52:59 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}