2014-12-04 10:28:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								package  core  
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"bytes" 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-24 11:39:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-30 00:31:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"math/big" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"sync" 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-30 00:31:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 10:28:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/core/types" 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-23 15:01:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/ethutil" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 14:05:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/event" 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-31 12:56:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/logger" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/rlp" 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 19:59:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/state" 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 15:44:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								var  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chainlogger  =  logger . NewLogger ( "CHAIN" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									jsonlogger   =  logger . NewJsonLogger ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									blockHashPre  =  [ ] byte ( "block-hash-" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									blockNumPre   =  [ ] byte ( "block-num-" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 15:44:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2014-06-23 12:54:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-02 12:07:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  StateQuery  interface  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetAccount ( addr  [ ] byte )  * state . StateObject 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 10:49:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  CalcDifficulty ( block ,  parent  * types . Header )  * big . Int  {  
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									diff  :=  new ( big . Int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-05 09:14:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									min  :=  big . NewInt ( 2048 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									adjust  :=  new ( big . Int ) . Div ( parent . Difficulty ,  min ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 10:49:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( block . Time  -  parent . Time )  <  8  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diff . Add ( parent . Difficulty ,  adjust ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-02 16:32:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 10:49:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										diff . Sub ( parent . Difficulty ,  adjust ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-05 09:14:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  diff . Cmp ( GenesisDiff )  <  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  GenesisDiff 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  diff 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 22:42:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  CalculateTD ( block ,  parent  * types . Block )  * big . Int  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uncleDiff  :=  new ( big . Int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  uncle  :=  range  block . Uncles ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uncleDiff  =  uncleDiff . Add ( uncleDiff ,  uncle . Difficulty ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// TD(genesis_block) = 0 and TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									td  :=  new ( big . Int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									td  =  td . Add ( parent . Td ,  uncleDiff ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									td  =  td . Add ( td ,  block . Header ( ) . Difficulty ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  td 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  CalcGasLimit ( parent ,  block  * types . Block )  * big . Int  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  block . Number ( ) . Cmp ( big . NewInt ( 0 ) )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  ethutil . BigPow ( 10 ,  6 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// ((1024-1) * parent.gasLimit + (gasUsed * 6 / 5)) / 1024 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									previous  :=  new ( big . Int ) . Mul ( big . NewInt ( 1024 - 1 ) ,  parent . GasLimit ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									current  :=  new ( big . Rat ) . Mul ( new ( big . Rat ) . SetInt ( parent . GasUsed ( ) ) ,  big . NewRat ( 6 ,  5 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									curInt  :=  new ( big . Int ) . Div ( current . Num ( ) ,  current . Denom ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									result  :=  new ( big . Int ) . Add ( previous ,  curInt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									result . Div ( result ,  big . NewInt ( 1024 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 13:52:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ethutil . BigMax ( GenesisGasLimit ,  result ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-20 11:53:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  ChainManager  struct  {  
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//eth          EthManager 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									blockDb       ethutil . Database 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									stateDb       ethutil . Database 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									processor     types . BlockProcessor 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 14:05:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									eventMux      * event . TypeMux 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									genesisBlock  * types . Block 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// Last known total difficulty 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 12:03:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mu             sync . RWMutex 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 16:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tsmu           sync . RWMutex 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 12:03:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									td             * big . Int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									currentBlock   * types . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lastBlockHash  [ ] byte 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									transState  * state . StateDB 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 14:37:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									txState     * state . ManagedState 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									quit  chan  struct { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  NewChainManager ( blockDb ,  stateDb  ethutil . Database ,  mux  * event . TypeMux )  * ChainManager  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc  :=  & ChainManager { blockDb :  blockDb ,  stateDb :  stateDb ,  genesisBlock :  GenesisBlock ( stateDb ) ,  eventMux :  mux ,  quit :  make ( chan  struct { } ) } 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 13:14:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . setLastBlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . transState  =  bc . State ( ) . Copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 14:37:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Take ownership of this particular state 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . txState  =  state . ManageState ( bc . State ( ) . Copy ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									go  bc . update ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-18 13:14:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  bc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  Td ( )  * big . Int  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 19:59:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  self . td 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:17:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  LastBlockHash ( )  [ ] byte  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . lastBlockHash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  CurrentBlock ( )  * types . Block  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . currentBlock 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-14 18:20:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  Status ( )  ( td  * big . Int ,  currentBlock  [ ] byte ,  genesisBlock  [ ] byte )  {  
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:22:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 15:44:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  self . td ,  self . currentBlock . Hash ( ) ,  self . genesisBlock . Hash ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-14 18:20:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  SetProcessor ( proc  types . BlockProcessor )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . processor  =  proc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 19:59:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  State ( )  * state . StateDB  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  state . New ( self . CurrentBlock ( ) . Root ( ) ,  self . stateDb ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 19:59:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  TransState ( )  * state . StateDB  {  
						 
					
						
							
								
									
										
										
										
											2015-02-17 16:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . tsmu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . tsmu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-10 19:59:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  self . transState 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 14:37:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  TxState ( )  * state . ManagedState  {  
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . tsmu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . tsmu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . txState 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 14:37:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  setTxState ( statedb  * state . StateDB )  {  
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . tsmu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . tsmu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 14:37:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . txState  =  state . ManageState ( statedb ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-17 16:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  setTransState ( statedb  * state . StateDB )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . transState  =  statedb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  setLastBlock ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  _  :=  bc . blockDb . Get ( [ ] byte ( "LastBlock" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( data )  !=  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										block  :=  bc . GetBlock ( data ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bc . currentBlock  =  block 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bc . lastBlockHash  =  block . Hash ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Set the last know difficulty (might be 0x0 as initial value, Genesis) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bc . td  =  ethutil . BigD ( bc . blockDb . LastKnownTD ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										bc . Reset ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-16 12:03:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									chainlogger . Infof ( "Last block (#%v) %x TD=%v\n" ,  bc . currentBlock . Number ( ) ,  bc . currentBlock . Hash ( ) ,  bc . td ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Block creation & chain handling  
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  NewBlock ( coinbase  [ ] byte )  * types . Block  {  
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  bc . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  root  [ ] byte 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									parentHash  :=  ZeroHash256 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 02:09:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  bc . currentBlock  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										root  =  bc . currentBlock . Header ( ) . Root 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										parentHash  =  bc . lastBlockHash 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-23 15:53:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  :=  types . NewBlock ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										parentHash , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										coinbase , 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										root , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										ethutil . BigPow ( 2 ,  32 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 21:04:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										0 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-22 17:35:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block . SetUncles ( nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block . SetTransactions ( nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block . SetReceipts ( nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parent  :=  bc . currentBlock 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-15 15:42:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  parent  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										header  :=  block . Header ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-04 10:49:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										header . Difficulty  =  CalcDifficulty ( block . Header ( ) ,  parent . Header ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										header . Number  =  new ( big . Int ) . Add ( parent . Header ( ) . Number ,  ethutil . Big1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										header . GasLimit  =  CalcGasLimit ( parent ,  block ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-15 15:42:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-20 11:53:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  Reset ( )  {  
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  bc . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 14:50:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  block  :=  bc . currentBlock ;  block  !=  nil ;  block  =  bc . GetBlock ( block . Header ( ) . ParentHash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bc . removeBlock ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 14:50:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-08 11:59:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Prepare the genesis block 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-05 16:26:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . write ( bc . genesisBlock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . insert ( bc . genesisBlock ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . currentBlock  =  bc . genesisBlock 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-08 11:59:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . setTotalDifficulty ( ethutil . Big ( "0" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-08 11:59:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  removeBlock ( block  * types . Block )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . blockDb . Delete ( append ( blockHashPre ,  block . Hash ( ) ... ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 18:41:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  ResetWithGenesisBlock ( gb  * types . Block )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . mu . Lock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  bc . mu . Unlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  block  :=  bc . currentBlock ;  block  !=  nil ;  block  =  bc . GetBlock ( block . Header ( ) . ParentHash )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bc . removeBlock ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 18:41:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Prepare the genesis block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . genesisBlock  =  gb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . write ( bc . genesisBlock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . insert ( bc . genesisBlock ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . currentBlock  =  bc . genesisBlock 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 12:57:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  Export ( )  [ ] byte  {  
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									chainlogger . Infof ( "exporting %v blocks...\n" ,  self . currentBlock . Header ( ) . Number ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 12:57:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									blocks  :=  make ( [ ] * types . Block ,  int ( self . currentBlock . NumberU64 ( ) ) + 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  block  :=  self . currentBlock ;  block  !=  nil ;  block  =  self . GetBlock ( block . Header ( ) . ParentHash )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										blocks [ block . NumberU64 ( ) ]  =  block 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 12:57:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-17 12:57:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ethutil . Encode ( blocks ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-05 16:26:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  insert ( block  * types . Block )  {  
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//encodedBlock := ethutil.Encode(block) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . blockDb . Put ( [ ] byte ( "LastBlock" ) ,  block . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . currentBlock  =  block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . lastBlockHash  =  block . Hash ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									key  :=  append ( blockNumPre ,  block . Number ( ) . Bytes ( ) ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . blockDb . Put ( key ,  bc . lastBlockHash ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-05 16:26:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  write ( block  * types . Block )  {  
						 
					
						
							
								
									
										
										
										
											2015-01-08 16:37:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									encodedBlock  :=  ethutil . Encode ( block . RlpDataForStorage ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									key  :=  append ( blockHashPre ,  block . Hash ( ) ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bc . blockDb . Put ( key ,  encodedBlock ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-21 15:06:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Accessors  
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  Genesis ( )  * types . Block  {  
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  bc . genesisBlock 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Block fetching methods  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  HasBlock ( hash  [ ] byte )  bool  {  
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  _  :=  bc . blockDb . Get ( append ( blockHashPre ,  hash ... ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  len ( data )  !=  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-14 18:20:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetBlockHashesFromHash ( hash  [ ] byte ,  max  uint64 )  ( chain  [ ] [ ] byte )  {  
						 
					
						
							
								
									
										
										
										
											2014-08-21 14:47:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  :=  self . GetBlock ( hash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  block  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// XXX Could be optimised by using a different database which only holds hashes (i.e., linked list) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i  :=  uint64 ( 0 ) ;  i  <  max ;  i ++  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-28 21:12:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										parentHash  :=  block . Header ( ) . ParentHash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  =  self . GetBlock ( parentHash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  block  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											chainlogger . Infof ( "GetBlockHashesFromHash Parent UNKNOWN %x\n" ,  parentHash ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-08-21 14:47:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										chain  =  append ( chain ,  block . Hash ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  block . Header ( ) . Number . Cmp ( ethutil . Big0 )  <=  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-21 14:47:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetBlock ( hash  [ ] byte )  * types . Block  {  
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									data ,  _  :=  self . blockDb . Get ( append ( blockHashPre ,  hash ... ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-21 13:05:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( data )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  block  types . Block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  :=  rlp . Decode ( bytes . NewReader ( data ) ,  & block ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										fmt . Println ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  & block 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 18:29:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetBlockByNumber ( num  uint64 )  * types . Block  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									self . mu . RLock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  self . mu . RUnlock ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									key ,  _  :=  self . blockDb . Get ( append ( blockNumPre ,  big . NewInt ( int64 ( num ) ) . Bytes ( ) ... ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  len ( key )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . GetBlock ( key ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 17:38:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetUnclesInChain ( block  * types . Block ,  length  int )  ( uncles  [ ] * types . Header )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i  :=  0 ;  block  !=  nil  &&  i  <  length ;  i ++  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uncles  =  append ( uncles ,  block . Uncles ( ) ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  =  self . GetBlock ( block . ParentHash ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetAncestors ( block  * types . Block ,  length  int )  ( blocks  [ ] * types . Block )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i  :=  0 ;  i  <  length ;  i ++  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										block  =  self . GetBlock ( block . ParentHash ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  block  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										blocks  =  append ( blocks ,  block ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  setTotalDifficulty ( td  * big . Int )  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . blockDb . Put ( [ ] byte ( "LTD" ) ,  td . Bytes ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bc . td  =  td 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-09-26 13:32:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-18 16:58:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  CalcTotalDiff ( block  * types . Block )  ( * big . Int ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parent  :=  self . GetBlock ( block . Header ( ) . ParentHash ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  parent  ==  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil ,  fmt . Errorf ( "Unable to calculate total diff without known parent %x" ,  block . Header ( ) . ParentHash ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-26 13:32:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parentTd  :=  parent . Td 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-26 13:32:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uncleDiff  :=  new ( big . Int ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  uncle  :=  range  block . Uncles ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uncleDiff  =  uncleDiff . Add ( uncleDiff ,  uncle . Difficulty ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									td  :=  new ( big . Int ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									td  =  td . Add ( parentTd ,  uncleDiff ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									td  =  td . Add ( td ,  block . Header ( ) . Difficulty ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  td ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-20 11:53:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( bc  * ChainManager )  Stop ( )  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									close ( bc . quit ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  queueEvent  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queue           [ ] interface { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									canonicalCount  int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sideCount       int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									splitCount      int 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-14 23:56:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 14:05:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  InsertChain ( chain  types . Blocks )  error  {  
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//self.tsmu.Lock() 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//defer self.tsmu.Unlock() 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 22:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  queue  =  make ( [ ] interface { } ,  len ( chain ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  queueEvent  =  queueEvent { queue :  queue } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i ,  block  :=  range  chain  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Call in to the block processor and check for errors. It's likely that if one block fails 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// all others will fail too (unless a known block is returned). 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-04 15:05:47 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										td ,  err  :=  self . processor . Process ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-02 11:37:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  IsKnownBlockErr ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											h  :=  block . Header ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-14 12:43:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											chainlogger . Infof ( "INVALID block #%v (%x)\n" ,  h . Number ,  h . Hash ( ) [ : 4 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-02 17:22:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											chainlogger . Infoln ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-14 13:21:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											chainlogger . Debugln ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-01 20:18:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  err 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-02 11:16:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										block . Td  =  td 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . mu . Lock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-03 15:44:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cblock  :=  self . currentBlock 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Write block to database. Eventually we'll have to improve on this and throw away blocks that are 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// not in the canonical chain. 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											self . write ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-23 15:43:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Compare the TD of the last known block in the canonical chain to make sure it's greater. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// At this point it's possible that a different chain (fork) becomes the new canonical chain. 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  td . Cmp ( self . td )  >  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-23 13:48:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  block . Header ( ) . Number . Cmp ( new ( big . Int ) . Add ( cblock . Header ( ) . Number ,  ethutil . Big1 ) )  <  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-09 22:42:36 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													chainlogger . Infof ( "Split detected. New head #%v (%x) TD=%v, was #%v (%x) TD=%v\n" ,  block . Header ( ) . Number ,  block . Hash ( ) [ : 4 ] ,  td ,  cblock . Header ( ) . Number ,  cblock . Hash ( ) [ : 4 ] ,  self . td ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													queue [ i ]  =  ChainSplitEvent { block } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													queueEvent . splitCount ++ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . setTotalDifficulty ( td ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												self . insert ( block ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-05 16:26:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 20:28:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												/ *  XXX  crashes 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-08 01:09:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												jsonlogger . LogJson ( & logger . EthChainNewHead { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockHash :      ethutil . Bytes2Hex ( block . Hash ( ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockNumber :    block . Number ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ChainHeadHash :  ethutil . Bytes2Hex ( cblock . Hash ( ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													BlockPrevHash :  ethutil . Bytes2Hex ( block . ParentHash ( ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-10 20:28:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* / 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . setTransState ( state . New ( block . Root ( ) ,  self . stateDb ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-13 17:47:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self . setTxState ( state . New ( block . Root ( ) ,  self . stateDb ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												queue [ i ]  =  ChainEvent { block } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												queueEvent . canonicalCount ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												queue [ i ]  =  ChainSideEvent { block } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												queueEvent . sideCount ++ 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-09 16:20:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 15:35:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-18 13:12:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										self . mu . Unlock ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-19 22:33:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 12:46:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// XXX put this in a goroutine? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									go  self . eventMux . Post ( queueEvent ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-01 20:18:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-17 12:12:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-01-02 12:07:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  update ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									events  :=  self . eventMux . Subscribe ( queueEvent { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								out :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ev  :=  <- events . Chan ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											switch  ev  :=  ev . ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  queueEvent : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  i ,  event  :=  range  ev . queue  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													switch  event  :=  event . ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  ChainEvent : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// We need some control over the mining operation. Acquiring locks and waiting for the miner to create new block takes too long 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// and in most cases isn't even necessary. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  i  ==  ev . canonicalCount  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															self . eventMux . Post ( ChainHeadEvent { event . Block } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  ChainSplitEvent : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// On chain splits we need to reset the transaction state. We can't be sure whether the actual 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														// state of the accounts are still valid. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  i  ==  ev . splitCount  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 18:26:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															self . setTxState ( state . New ( event . Block . Root ( ) ,  self . stateDb ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-06 15:50:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													self . eventMux . Post ( event ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- self . quit : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break  out 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-02 12:07:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Satisfy state query interface  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( self  * ChainManager )  GetAccount ( addr  [ ] byte )  * state . StateObject  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  self . State ( ) . GetAccount ( addr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}