2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Copyright 2016 The go-ethereum Authors  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This file is part of the go-ethereum library.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// The go-ethereum library is free software: you can redistribute it and/or modify  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// it under the terms of the GNU Lesser General Public License as published by  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// the Free Software Foundation, either version 3 of the License, or  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// (at your option) any later version.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// The go-ethereum library is distributed in the hope that it will be useful,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU Lesser General Public License for more details.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You should have received a copy of the GNU Lesser General Public License  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  vm  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"math/big" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/common" 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-06 02:16:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ethereum/go-ethereum/params" 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  dummyContractRef  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									calledForEach  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-06 02:16:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( dummyContractRef )  ReturnGas ( * big . Int )           { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( dummyContractRef )  Address ( )  common . Address      {  return  common . Address { }  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( dummyContractRef )  Value ( )  * big . Int              {  return  new ( big . Int )  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( dummyContractRef )  SetCode ( common . Hash ,  [ ] byte )  { }  
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  ForEachStorage ( callback  func ( key ,  value  common . Hash )  bool )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									d . calledForEach  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  SubBalance ( amount  * big . Int )  { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  AddBalance ( amount  * big . Int )  { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  SetBalance ( * big . Int )         { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  SetNonce ( uint64 )             { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( d  * dummyContractRef )  Balance ( )  * big . Int           {  return  new ( big . Int )  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-06 02:16:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  dummyStateDB  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NoopStateDB 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ref  * dummyContractRef 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestStoreCapture ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  ( 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 11:52:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										env       =  NewEVM ( Context { } ,  nil ,  params . TestChainConfig ,  Config { EnableJit :  false ,  ForceJit :  false } ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-19 15:19:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										logger    =  NewStructLogger ( nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										mem       =  NewMemory ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										stack     =  newstack ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 20:17:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										contract  =  NewContract ( & dummyContractRef { } ,  & dummyContractRef { } ,  new ( big . Int ) ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									stack . push ( big . NewInt ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									stack . push ( big . NewInt ( 0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  index  common . Hash 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-22 15:32:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logger . CaptureState ( env ,  0 ,  SSTORE ,  0 ,  0 ,  mem ,  stack ,  contract ,  0 ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  len ( logger . changedValues [ contract . Address ( ) ] )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Fatalf ( "expected exactly 1 changed value on address %x, got %d" ,  contract . Address ( ) ,  len ( logger . changedValues [ contract . Address ( ) ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									exp  :=  common . BigToHash ( big . NewInt ( 1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  logger . changedValues [ contract . Address ( ) ] [ index ]  !=  exp  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Errorf ( "expected %x, got %x" ,  exp ,  logger . changedValues [ contract . Address ( ) ] [ index ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestStorageCapture ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Skip ( "implementing this function is difficult. it requires all sort of interfaces to be implemented which isn't trivial. The value (the actual test) isn't worth it" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ref       =  & dummyContractRef { } 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 20:17:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										contract  =  NewContract ( ref ,  ref ,  new ( big . Int ) ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-05 11:52:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										env       =  NewEVM ( Context { } ,  dummyStateDB { ref :  ref } ,  params . TestChainConfig ,  Config { EnableJit :  false ,  ForceJit :  false } ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-19 15:19:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										logger    =  NewStructLogger ( nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										mem       =  NewMemory ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										stack     =  newstack ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-22 15:32:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logger . CaptureState ( env ,  0 ,  STOP ,  0 ,  0 ,  mem ,  stack ,  contract ,  0 ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ref . calledForEach  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Error ( "didn't expect for each to be called" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-19 15:19:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logger  =  NewStructLogger ( & LogConfig { FullStorage :  true } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-22 15:32:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logger . CaptureState ( env ,  0 ,  STOP ,  0 ,  0 ,  mem ,  stack ,  contract ,  0 ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-03 23:46:27 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ! ref . calledForEach  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Error ( "expected for each to be called" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}