| 
									
										
										
										
											2016-04-14 18:18:24 +02:00
										 |  |  | // Copyright 2015 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-18 13:31:20 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-08-11 16:23:38 +02:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // ContractRef is a reference to the contract's backing object | 
					
						
							|  |  |  | type ContractRef interface { | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	ReturnGas(*big.Int, *big.Int) | 
					
						
							| 
									
										
										
										
											2015-03-16 18:42:18 +01:00
										 |  |  | 	Address() common.Address | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 	Value() *big.Int | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | 	SetCode(common.Hash, []byte) | 
					
						
							| 
									
										
										
										
											2016-02-03 23:46:27 +01:00
										 |  |  | 	ForEachStorage(callback func(key, value common.Hash) bool) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // Contract represents an ethereum contract in the state database. It contains | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | // the the contract code, calling arguments. Contract implements ContractRef | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | type Contract struct { | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | 	// CallerAddress is the result of the caller which initialised this | 
					
						
							|  |  |  | 	// contract. However when the "call method" is delegated this value | 
					
						
							|  |  |  | 	// needs to be initialised to that of the caller's caller. | 
					
						
							|  |  |  | 	CallerAddress common.Address | 
					
						
							|  |  |  | 	caller        ContractRef | 
					
						
							|  |  |  | 	self          ContractRef | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-29 14:40:45 +02:00
										 |  |  | 	jumpdests destinations // result of JUMPDEST analysis. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 	Code     []byte | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | 	CodeHash common.Hash | 
					
						
							| 
									
										
										
										
											2015-03-17 11:19:23 +01:00
										 |  |  | 	CodeAddr *common.Address | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | 	Input    []byte | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	value, Gas, UsedGas, Price *big.Int | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Args []byte | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	DelegateCall bool | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | // NewContract returns a new contract environment for the execution of EVM. | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | func NewContract(caller ContractRef, object ContractRef, value, gas, price *big.Int) *Contract { | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | 	c := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil} | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | 	if parent, ok := caller.(*Contract); ok { | 
					
						
							| 
									
										
										
										
											2015-05-29 14:40:45 +02:00
										 |  |  | 		// Reuse JUMPDEST analysis from parent context if available. | 
					
						
							|  |  |  | 		c.jumpdests = parent.jumpdests | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		c.jumpdests = make(destinations) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// Gas should be a pointer so it can safely be reduced through the run | 
					
						
							|  |  |  | 	// This pointer will be off the state transition | 
					
						
							|  |  |  | 	c.Gas = gas //new(big.Int).Set(gas) | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 	c.value = new(big.Int).Set(value) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// In most cases price and value are pointers to transaction objects | 
					
						
							|  |  |  | 	// and we don't want the transaction's values to change. | 
					
						
							|  |  |  | 	c.Price = new(big.Int).Set(price) | 
					
						
							|  |  |  | 	c.UsedGas = new(big.Int) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | // AsDelegate sets the contract to be a delegate call and returns the current | 
					
						
							|  |  |  | // contract (for chaining calls) | 
					
						
							|  |  |  | func (c *Contract) AsDelegate() *Contract { | 
					
						
							|  |  |  | 	c.DelegateCall = true | 
					
						
							|  |  |  | 	// NOTE: caller must, at all times be a contract. It should never happen | 
					
						
							|  |  |  | 	// that caller is something other than a Contract. | 
					
						
							|  |  |  | 	c.CallerAddress = c.caller.(*Contract).CallerAddress | 
					
						
							|  |  |  | 	return c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // GetOp returns the n'th element in the contract's byte array | 
					
						
							|  |  |  | func (c *Contract) GetOp(n uint64) OpCode { | 
					
						
							| 
									
										
										
										
											2015-01-04 14:20:16 +01:00
										 |  |  | 	return OpCode(c.GetByte(n)) | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // GetByte returns the n'th byte in the contract's byte array | 
					
						
							|  |  |  | func (c *Contract) GetByte(n uint64) byte { | 
					
						
							| 
									
										
										
										
											2015-06-10 10:44:46 +02:00
										 |  |  | 	if n < uint64(len(c.Code)) { | 
					
						
							|  |  |  | 		return c.Code[n] | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | // Caller returns the caller of the contract. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Caller will recursively call caller when the contract is a delegate | 
					
						
							|  |  |  | // call, including that of caller's caller. | 
					
						
							|  |  |  | func (c *Contract) Caller() common.Address { | 
					
						
							|  |  |  | 	return c.CallerAddress | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Finalise finalises the contract and returning any remaining gas to the original | 
					
						
							|  |  |  | // caller. | 
					
						
							|  |  |  | func (c *Contract) Finalise() { | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// Return the remaining gas to the caller | 
					
						
							|  |  |  | 	c.caller.ReturnGas(c.Gas, c.Price) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // UseGas attempts the use gas and subtracts it and returns true on success | 
					
						
							|  |  |  | func (c *Contract) UseGas(gas *big.Int) (ok bool) { | 
					
						
							|  |  |  | 	ok = useGas(c.Gas, gas) | 
					
						
							| 
									
										
										
										
											2015-03-28 20:03:25 +01:00
										 |  |  | 	if ok { | 
					
						
							|  |  |  | 		c.UsedGas.Add(c.UsedGas, gas) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-03-28 20:03:25 +01:00
										 |  |  | 	return | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // ReturnGas adds the given gas back to itself. | 
					
						
							|  |  |  | func (c *Contract) ReturnGas(gas, price *big.Int) { | 
					
						
							| 
									
										
										
										
											2015-01-02 16:14:12 +01:00
										 |  |  | 	// Return the gas to the context | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	c.Gas.Add(c.Gas, gas) | 
					
						
							|  |  |  | 	c.UsedGas.Sub(c.UsedGas, gas) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // Address returns the contracts address | 
					
						
							|  |  |  | func (c *Contract) Address() common.Address { | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 	return c.self.Address() | 
					
						
							| 
									
										
										
										
											2014-12-03 17:35:57 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | // Value returns the contracts value (sent to it from it's caller) | 
					
						
							|  |  |  | func (c *Contract) Value() *big.Int { | 
					
						
							|  |  |  | 	return c.value | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // SetCode sets the code to the contract | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | func (self *Contract) SetCode(hash common.Hash, code []byte) { | 
					
						
							| 
									
										
										
										
											2014-12-03 17:35:57 +01:00
										 |  |  | 	self.Code = code | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | 	self.CodeHash = hash | 
					
						
							| 
									
										
										
										
											2014-12-03 17:35:57 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-31 17:09:50 +02:00
										 |  |  | // SetCallCode sets the code of the contract and address of the backing data | 
					
						
							|  |  |  | // object | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | func (self *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) { | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 	self.Code = code | 
					
						
							| 
									
										
										
										
											2016-10-01 15:44:53 +03:00
										 |  |  | 	self.CodeHash = hash | 
					
						
							| 
									
										
										
										
											2015-03-13 13:44:15 +01:00
										 |  |  | 	self.CodeAddr = addr | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-01-11 18:20:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // EachStorage iterates the contract's storage and calls a method for every key | 
					
						
							|  |  |  | // value pair. | 
					
						
							| 
									
										
										
										
											2016-02-03 23:46:27 +01:00
										 |  |  | func (self *Contract) ForEachStorage(cb func(key, value common.Hash) bool) { | 
					
						
							|  |  |  | 	self.caller.ForEachStorage(cb) | 
					
						
							| 
									
										
										
										
											2016-01-11 18:20:31 +02:00
										 |  |  | } |