| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2015-03-16 18:42:18 +01:00
										 |  |  | 	Address() common.Address | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 23:29:59 +01:00
										 |  |  | // AccountRef implements ContractRef. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Account references are used during EVM initialisation and | 
					
						
							|  |  |  | // it's primary use is to fetch addresses. Removing this object | 
					
						
							|  |  |  | // proves difficult because of the cached jump destinations which | 
					
						
							|  |  |  | // are fetched from the parent contract (i.e. the caller), which | 
					
						
							|  |  |  | // is a ContractRef. | 
					
						
							|  |  |  | type AccountRef common.Address | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Address casts AccountRef to a Address | 
					
						
							|  |  |  | func (ar AccountRef) Address() common.Address { return (common.Address)(ar) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | 	Gas   uint64 | 
					
						
							|  |  |  | 	value *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. | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | func NewContract(caller ContractRef, object ContractRef, value *big.Int, gas uint64) *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 | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | 	c.Gas = gas | 
					
						
							| 
									
										
										
										
											2017-02-22 23:29:59 +01:00
										 |  |  | 	// ensures a value is set | 
					
						
							|  |  |  | 	c.value = value | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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. | 
					
						
							| 
									
										
										
										
											2017-02-22 23:29:59 +01:00
										 |  |  | 	parent := c.caller.(*Contract) | 
					
						
							|  |  |  | 	c.CallerAddress = parent.CallerAddress | 
					
						
							|  |  |  | 	c.value = parent.value | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | 	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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // UseGas attempts the use gas and subtracts it and returns true on success | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | func (c *Contract) UseGas(gas uint64) (ok bool) { | 
					
						
							|  |  |  | 	if c.Gas < gas { | 
					
						
							|  |  |  | 		return false | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-04 20:17:24 +01:00
										 |  |  | 	c.Gas -= gas | 
					
						
							|  |  |  | 	return true | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | } |