Documentation
¶
Index ¶
- Variables
- func IsCallType(typ CallType) bool
- func IsCreateType(typ CallType) bool
- type CallType
- type Contract
- func NewContract(depth int, origin types.Address, from types.Address, to types.Address, ...) *Contract
- func NewContractCall(depth int, origin types.Address, from types.Address, to types.Address, ...) *Contract
- func NewContractCreation(depth int, origin types.Address, from types.Address, to types.Address, ...) *Contract
- type DummyLogger
- func (d *DummyLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error)
- func (d *DummyLogger) CaptureEnter(opCode int, from, to types.Address, input []byte, gas uint64, value *big.Int)
- func (d *DummyLogger) CaptureExit(output []byte, gasUsed uint64, err error)
- func (d *DummyLogger) CaptureFault(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, depth int, ...)
- func (d *DummyLogger) CaptureStart(txn Txn, from, to types.Address, create bool, input []byte, gas uint64, ...)
- func (d *DummyLogger) CaptureState(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, rData []byte, ...)
- type EVMLogger
- type ExecutionResult
- type Host
- type Runtime
- type ScopeContext
- type StorageStatus
- type TxContext
- type Txn
Constants ¶
This section is empty.
Variables ¶
var ( ErrOutOfGas = errors.New("out of gas") ErrStackOverflow = errors.New("stack overflow") ErrStackUnderflow = errors.New("stack underflow") ErrNotEnoughFunds = errors.New("not enough funds") ErrInsufficientBalance = errors.New("insufficient balance for transfer") ErrMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") ErrContractAddressCollision = errors.New("contract address collision") ErrDepth = errors.New("max call depth exceeded") ErrExecutionReverted = errors.New("execution was reverted") ErrCodeStoreOutOfGas = errors.New("contract creation code storage out of gas") ErrCodeEmpty = errors.New("contract code empty") )
Functions ¶
func IsCallType ¶
func IsCreateType ¶
Types ¶
type Contract ¶
type Contract struct {
Code []byte
Type CallType
CodeAddress types.Address
Address types.Address
Origin types.Address
Caller types.Address
Depth int
Value *big.Int
Input []byte
Gas uint64
Static bool
}
Contract is the instance being called
func NewContract ¶
func NewContractCall ¶
type DummyLogger ¶
type DummyLogger struct{}
DummyLogger does nothing in state logging
func (*DummyLogger) CaptureEnd ¶
func (*DummyLogger) CaptureEnter ¶
func (*DummyLogger) CaptureExit ¶
func (d *DummyLogger) CaptureExit(output []byte, gasUsed uint64, err error)
func (*DummyLogger) CaptureFault ¶
func (d *DummyLogger) CaptureFault(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, depth int, err error)
func (*DummyLogger) CaptureStart ¶
func (*DummyLogger) CaptureState ¶
func (d *DummyLogger) CaptureState(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, rData []byte, depth int, err error)
type EVMLogger ¶
type EVMLogger interface {
CaptureStart(txn Txn, from, to types.Address, create bool, input []byte, gas uint64, value *big.Int)
CaptureState(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, rData []byte, depth int, err error)
CaptureEnter(opCode int, from, to types.Address, input []byte, gas uint64, value *big.Int)
CaptureExit(output []byte, gasUsed uint64, err error)
CaptureFault(ctx *ScopeContext, pc uint64, opCode int, gas, cost uint64, depth int, err error)
CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error)
}
EVMLogger is used to collect execution traces from an EVM transaction execution. CaptureState is called for each step of the VM with the current VM state. Note that reference types are actual VM data structures; make copies if you need to retain them beyond the current call.
func NewDummyLogger ¶
func NewDummyLogger() EVMLogger
type ExecutionResult ¶
type ExecutionResult struct {
ReturnValue []byte // Returned data from the runtime (function result or data supplied with revert opcode)
GasLeft uint64 // Total gas left as result of execution
GasUsed uint64 // Total gas used as result of execution
Err error // Any error encountered during the execution, listed below
}
ExecutionResult includes all output after executing given evm message no matter the execution itself is successful or not.
func (*ExecutionResult) Failed ¶
func (r *ExecutionResult) Failed() bool
func (*ExecutionResult) Return ¶
func (r *ExecutionResult) Return() []byte
Return is a helper function to help caller distinguish between revert reason and function return. Return returns the data after execution if no error occurs.
func (*ExecutionResult) Revert ¶
func (r *ExecutionResult) Revert() []byte
Revert returns the concrete revert reason if the execution is aborted by `REVERT` opcode. Note the reason can be nil if no data supplied with revert opcode.
func (*ExecutionResult) Reverted ¶
func (r *ExecutionResult) Reverted() bool
func (*ExecutionResult) Succeeded ¶
func (r *ExecutionResult) Succeeded() bool
func (*ExecutionResult) UpdateGasUsed ¶
func (r *ExecutionResult) UpdateGasUsed(gasLimit uint64, refund uint64)
type Host ¶
type Host interface {
AccountExists(addr types.Address) bool
GetStorage(addr types.Address, key types.Hash) types.Hash
SetStorage(addr types.Address, key types.Hash, value types.Hash, config *chain.ForksInTime) StorageStatus
GetBalance(addr types.Address) *big.Int
GetCodeSize(addr types.Address) int
GetCodeHash(addr types.Address) types.Hash
GetCode(addr types.Address) []byte
Selfdestruct(addr types.Address, beneficiary types.Address)
GetTxContext() TxContext
GetBlockHash(number int64) types.Hash
EmitLog(addr types.Address, topics []types.Hash, data []byte)
Callx(*Contract, Host) *ExecutionResult
Empty(addr types.Address) bool
GetNonce(addr types.Address) uint64
GetEVMLogger() EVMLogger
}
Host is the execution host
type Runtime ¶
type Runtime interface {
Run(c *Contract, host Host, config *chain.ForksInTime) *ExecutionResult
CanRun(c *Contract, host Host, config *chain.ForksInTime) bool
Name() string
}
Runtime can process contracts
type ScopeContext ¶
ScopeContext contains the things that are per-call, such as stack and memory, but not transients like pc and gas
type StorageStatus ¶
type StorageStatus int
StorageStatus is the status of the storage access
const ( // StorageUnchanged if the data has not changed StorageUnchanged StorageStatus = iota // StorageModified if the value has been modified StorageModified // StorageModifiedAgain if the value has been modified before in the txn StorageModifiedAgain // StorageAdded if this is a new entry in the storage StorageAdded // StorageDeleted if the storage was deleted StorageDeleted )
func (StorageStatus) String ¶
func (s StorageStatus) String() string