98 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // Copyright 2014 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" | ||
|  | 
 | ||
|  | 	"github.com/ethereum/go-ethereum/common" | ||
|  | ) | ||
|  | 
 | ||
|  | // Vm is the basic interface for an implementation of the EVM. | ||
|  | type Vm interface { | ||
|  | 	// Run should execute the given contract with the input given in in | ||
|  | 	// and return the contract execution return bytes or an error if it | ||
|  | 	// failed. | ||
|  | 	Run(c *Contract, in []byte) ([]byte, error) | ||
|  | } | ||
|  | 
 | ||
|  | // StateDB is an EVM database for full state querying. | ||
|  | type StateDB interface { | ||
|  | 	GetAccount(common.Address) Account | ||
|  | 	CreateAccount(common.Address) Account | ||
|  | 
 | ||
|  | 	SubBalance(common.Address, *big.Int) | ||
|  | 	AddBalance(common.Address, *big.Int) | ||
|  | 	GetBalance(common.Address) *big.Int | ||
|  | 
 | ||
|  | 	GetNonce(common.Address) uint64 | ||
|  | 	SetNonce(common.Address, uint64) | ||
|  | 
 | ||
|  | 	GetCodeHash(common.Address) common.Hash | ||
|  | 	GetCode(common.Address) []byte | ||
|  | 	SetCode(common.Address, []byte) | ||
|  | 	GetCodeSize(common.Address) int | ||
|  | 
 | ||
|  | 	AddRefund(*big.Int) | ||
|  | 	GetRefund() *big.Int | ||
|  | 
 | ||
|  | 	GetState(common.Address, common.Hash) common.Hash | ||
|  | 	SetState(common.Address, common.Hash, common.Hash) | ||
|  | 
 | ||
|  | 	Suicide(common.Address) bool | ||
|  | 	HasSuicided(common.Address) bool | ||
|  | 
 | ||
|  | 	// Exist reports whether the given account exists in state. | ||
|  | 	// Notably this should also return true for suicided accounts. | ||
|  | 	Exist(common.Address) bool | ||
|  | 	// Empty returns whether the given account is empty. Empty | ||
|  | 	// is defined according to EIP161 (balance = nonce = code = 0). | ||
|  | 	Empty(common.Address) bool | ||
|  | 
 | ||
|  | 	RevertToSnapshot(int) | ||
|  | 	Snapshot() int | ||
|  | 
 | ||
|  | 	AddLog(*Log) | ||
|  | } | ||
|  | 
 | ||
|  | // Account represents a contract or basic ethereum account. | ||
|  | type Account interface { | ||
|  | 	SubBalance(amount *big.Int) | ||
|  | 	AddBalance(amount *big.Int) | ||
|  | 	SetBalance(*big.Int) | ||
|  | 	SetNonce(uint64) | ||
|  | 	Balance() *big.Int | ||
|  | 	Address() common.Address | ||
|  | 	ReturnGas(*big.Int) | ||
|  | 	SetCode(common.Hash, []byte) | ||
|  | 	ForEachStorage(cb func(key, value common.Hash) bool) | ||
|  | 	Value() *big.Int | ||
|  | } | ||
|  | 
 | ||
|  | // CallContext provides a basic interface for the EVM calling conventions. The EVM Environment | ||
|  | // depends on this context being implemented for doing subcalls and initialising new EVM contracts. | ||
|  | type CallContext interface { | ||
|  | 	// Call another contract | ||
|  | 	Call(env *Environment, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) | ||
|  | 	// Take another's contract code and execute within our own context | ||
|  | 	CallCode(env *Environment, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) | ||
|  | 	// Same as CallCode except sender and value is propagated from parent to child scope | ||
|  | 	DelegateCall(env *Environment, me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) | ||
|  | 	// Create a new contract | ||
|  | 	Create(env *Environment, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) | ||
|  | } |