evm

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2018 License: Apache-2.0 Imports: 22 Imported by: 35

Documentation

Index

Constants

View Source
const (
	GasSha3          uint64 = 1
	GasGetAccount    uint64 = 1
	GasStorageUpdate uint64 = 1
	GasCreateAccount uint64 = 1

	GasBaseOp  uint64 = 0 // TODO: make this 1
	GasStackOp uint64 = 1

	GasEcRecover     uint64 = 1
	GasSha256Word    uint64 = 1
	GasSha256Base    uint64 = 1
	GasRipemd160Word uint64 = 1
	GasRipemd160Base uint64 = 1
	GasIdentityWord  uint64 = 1
	GasIdentityBase  uint64 = 1
)

Variables

This section is empty.

Functions

func DebugOpcodes

func DebugOpcodes(vm *VM)

func DeriveNewAccount

func DeriveNewAccount(creator *acm.MutableAccount, permissions permission.AccountPermissions,
	logger *logging.Logger) *acm.MutableAccount

Create a new account from a parent 'creator' account. The creator account will have its sequence number incremented

func DumpTokens

func DumpTokens(vm *VM)

func ExecuteNativeContract added in v0.19.0

func ExecuteNativeContract(address Word256, state state.ReaderWriter, caller acm.Account, input []byte, gas *uint64,
	logger *logging.Logger) ([]byte, errors.CodedError)

func HasPermission

func HasPermission(stateWriter state.ReaderWriter, acc acm.Account, perm permission.PermFlag) bool

CONTRACT: it is the duty of the contract writer to call known permissions we do not convey if a permission is not set (unlike in state/execution, where we guarantee HasPermission is called on known permissions and panics else) If the perm is not defined in the acc nor set by default in GlobalPermissions, this function returns false.

func Is64BitOverflow

func Is64BitOverflow(word Word256) bool

func IsRegisteredNativeContract added in v0.19.0

func IsRegisteredNativeContract(address Word256) bool

func MemoryProvider

func MemoryProvider(memoryProvider func() Memory) func(*VM)

func RegisterNativeContract

func RegisterNativeContract(addr Word256, fn NativeContract) bool

func SNativeContracts

func SNativeContracts() map[string]*SNativeContractDescription

Returns a map of all SNative contracts defined indexed by name

Types

type EventSink added in v0.20.0

type EventSink interface {
	Call(call *exec.CallEvent, exception *errors.Exception)
	Log(log *exec.LogEvent)
}

type FakeAppState

type FakeAppState struct {
	// contains filtered or unexported fields
}

func (*FakeAppState) GetAccount

func (fas *FakeAppState) GetAccount(addr crypto.Address) (acm.Account, error)

func (*FakeAppState) GetStorage

func (fas *FakeAppState) GetStorage(addr crypto.Address, key Word256) (Word256, error)

func (*FakeAppState) RemoveAccount

func (fas *FakeAppState) RemoveAccount(address crypto.Address) error

func (*FakeAppState) SetStorage

func (fas *FakeAppState) SetStorage(addr crypto.Address, key Word256, value Word256) error

func (*FakeAppState) UpdateAccount

func (fas *FakeAppState) UpdateAccount(account acm.Account) error

type Memory

type Memory interface {
	// Read a value from the memory store starting at offset
	// (index of first byte will equal offset). The value will be returned as a
	// length-bytes byte slice. Returns an error if the memory cannot be read or
	// is not allocated.
	//
	// The value returned should be copy of any underlying memory, not a reference
	// to the underlying store.
	Read(offset, length *big.Int) ([]byte, error)
	// Write a value to the memory starting at offset (the index of the first byte
	// written will equal offset). The value is provided as bytes to be written
	// consecutively to the memory store. Return an error if the memory cannot be
	// written or allocated.
	Write(offset *big.Int, value []byte) error
	// Returns the current capacity of the memory. For dynamically allocating
	// memory this capacity can be used as a write offset that is guaranteed to be
	// unused. Solidity in particular makes this assumption when using MSIZE to
	// get the current allocated memory.
	Capacity() *big.Int
}

Interface for a bounded linear memory indexed by a single *big.Int parameter for each byte in the memory.

func DefaultDynamicMemoryProvider

func DefaultDynamicMemoryProvider() Memory

func NewDynamicMemory

func NewDynamicMemory(initialCapacity, maximumCapacity uint64) Memory

Get a new DynamicMemory (note that although we take a maximumCapacity of uint64 we currently limit the maximum to int32 at runtime because we are using a single slice which we cannot guarantee to be indexable above int32 or all validators

type NativeContract

type NativeContract func(state state.ReaderWriter, caller acm.Account, input []byte, gas *uint64,
	logger *logging.Logger) (output []byte, err error)

type Params

type Params struct {
	BlockHeight uint64
	BlockHash   Word256
	BlockTime   int64
	GasLimit    uint64
}

type SNativeContractDescription

type SNativeContractDescription struct {
	// Comment describing purpose of SNative contract and reason for assembling
	// the particular functions
	Comment string
	// Name of the SNative contract
	Name string
	// contains filtered or unexported fields
}

Metadata for SNative contract. Acts as a call target from the EVM. Can be used to generate bindings in a smart contract languages.

func NewSNativeContract

func NewSNativeContract(comment, name string,
	functions ...*SNativeFunctionDescription) *SNativeContractDescription

Create a new SNative contract description object by passing a comment, name and a list of member functions descriptions

func (*SNativeContractDescription) Address

func (contract *SNativeContractDescription) Address() (address crypto.Address)

We define the address of an SNative contact as the last 20 bytes of the sha3 hash of its name

func (*SNativeContractDescription) Dispatch

func (contract *SNativeContractDescription) Dispatch(state state.ReaderWriter, caller acm.Account,
	args []byte, gas *uint64, logger *logging.Logger) (output []byte, err error)

This function is designed to be called from the EVM once a SNative contract has been selected. It is also placed in a registry by registerSNativeContracts So it can be looked up by SNative address

func (*SNativeContractDescription) FunctionByID

Get function by calling identifier FunctionSelector

func (*SNativeContractDescription) FunctionByName

func (contract *SNativeContractDescription) FunctionByName(name string) (*SNativeFunctionDescription, error)

Get function by name

func (*SNativeContractDescription) Functions

func (contract *SNativeContractDescription) Functions() []*SNativeFunctionDescription

Get functions in order of declaration

type SNativeFunctionDescription

type SNativeFunctionDescription struct {
	// Comment describing function's purpose, parameters, and return value
	Comment string
	// Function name (used to form signature)
	Name string
	// Function arguments
	Arguments reflect.Type
	// Function return values
	Returns reflect.Type
	// The abi
	Abi abi.FunctionSpec
	// Permissions required to call function
	PermFlag permission.PermFlag
	// Native function to which calls will be dispatched when a containing
	F func(stateWriter state.ReaderWriter, caller acm.Account, gas *uint64,
		logger *logging.Logger, v interface{}) (interface{}, error)
}

Metadata for SNative functions. Act as call targets for the EVM when collected into an SNativeContractDescription. Can be used to generate bindings in a smart contract languages.

func (*SNativeFunctionDescription) NArgs

func (function *SNativeFunctionDescription) NArgs() int

Get number of function arguments

func (*SNativeFunctionDescription) Signature

func (function *SNativeFunctionDescription) Signature() string

Get function signature

type Stack

type Stack struct {
	// contains filtered or unexported fields
}

Not goroutine safe

func NewStack

func NewStack(capacity int, gas *uint64, err *errors.CodedError) *Stack

func (*Stack) Dup

func (st *Stack) Dup(n int)

func (*Stack) Len

func (st *Stack) Len() int

func (*Stack) Peek

func (st *Stack) Peek() Word256

Not an opcode, costs no gas.

func (*Stack) Pop

func (st *Stack) Pop() Word256

func (*Stack) Pop64

func (st *Stack) Pop64() (int64, errors.CodedError)

func (*Stack) PopBigInt

func (st *Stack) PopBigInt() *big.Int

func (*Stack) PopBigIntSigned

func (st *Stack) PopBigIntSigned() *big.Int

func (*Stack) PopBytes

func (st *Stack) PopBytes() []byte

func (*Stack) PopU64

func (st *Stack) PopU64() (uint64, errors.CodedError)

func (*Stack) Print

func (st *Stack) Print(n int)

func (*Stack) Push

func (st *Stack) Push(d Word256)

func (*Stack) Push64

func (st *Stack) Push64(i int64)

func (*Stack) PushBigInt

func (st *Stack) PushBigInt(bigInt *big.Int) Word256

Pushes the bigInt as a Word256 encoding negative values in 32-byte twos complement and returns the encoded result

func (*Stack) PushBytes

func (st *Stack) PushBytes(bz []byte)

currently only called after sha3.Sha3

func (*Stack) PushU64

func (st *Stack) PushU64(i uint64)

func (*Stack) Swap

func (st *Stack) Swap(n int)

type VM

type VM struct {
	// contains filtered or unexported fields
}

func NewVM

func NewVM(params Params, origin crypto.Address, tx *txs.Tx, logger *logging.Logger, options ...func(*VM)) *VM

func (*VM) Call

func (vm *VM) Call(callState *state.Cache, caller, callee *acm.MutableAccount, code, input []byte, value uint64,
	gas *uint64) (output []byte, err errors.CodedError)

CONTRACT state is aware of caller and callee, so we can just mutate them. CONTRACT code and input are not mutated. CONTRACT returned 'ret' is a new compact slice. value: To be transferred from caller to callee. Refunded upon errors.CodedError. gas: Available gas. No refunds for gas. code: May be nil, since the CALL opcode may be used to send value from contracts to accounts

func (*VM) Debugf

func (vm *VM) Debugf(format string, a ...interface{})

func (*VM) DelegateCall

func (vm *VM) DelegateCall(callState *state.Cache, caller acm.Account, callee *acm.MutableAccount, code, input []byte, value uint64, gas *uint64) (output []byte, err errors.CodedError)

DelegateCall is executed by the DELEGATECALL opcode, introduced as off Ethereum Homestead. The intent of delegate call is to run the code of the callee in the storage context of the caller; while preserving the original caller to the previous callee. Different to the normal CALL or CALLCODE, the value does not need to be transferred to the callee.

func (*VM) SetEventSink added in v0.20.0

func (vm *VM) SetEventSink(em EventSink)

Set EventSink destination for events - can be unset if events generation is not required

Directories

Path Synopsis
asm
bc

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL