Documentation ¶
Index ¶
- Constants
- Variables
- func HasPermission(appState AppState, acc *Account, perm ptypes.PermFlag) bool
- func RegisterNativeContract(addr Word256, fn NativeContract) bool
- func RegisteredNativeContract(addr Word256) bool
- func S256(x *big.Int) *big.Int
- func SetDebug(d bool)
- func U256(x *big.Int) *big.Int
- func ValidPermN(n ptypes.PermFlag) bool
- type Account
- type AppState
- type Debug
- type ErrInvalidPermission
- type ErrPermission
- type NativeContract
- type Params
- type SNativeFuncDescription
- type Stack
- func (st *Stack) Dup(n int)
- func (st *Stack) Len() int
- func (st *Stack) Peek() Word256
- func (st *Stack) Pop() Word256
- func (st *Stack) Pop64() int64
- func (st *Stack) PopBytes() []byte
- func (st *Stack) Print(n int)
- func (st *Stack) Push(d Word256)
- func (st *Stack) Push64(i int64)
- func (st *Stack) PushBytes(bz []byte)
- func (st *Stack) Swap(n int)
- type VM
Constants ¶
const ( GasSha3 int64 = 1 GasGetAccount int64 = 1 GasStorageUpdate int64 = 1 GasBaseOp int64 = 0 // TODO: make this 1 GasStackOp int64 = 1 GasEcRecover int64 = 1 GasSha256Word int64 = 1 GasSha256Base int64 = 1 GasRipemd160Word int64 = 1 GasRipemd160Base int64 = 1 GasIdentityWord int64 = 1 GasIdentityBase int64 = 1 )
Variables ¶
var ( ErrUnknownAddress = errors.New("Unknown address") ErrInsufficientBalance = errors.New("Insufficient balance") ErrInvalidJumpDest = errors.New("Invalid jump dest") ErrInsufficientGas = errors.New("Insufficient gas") ErrMemoryOutOfBounds = errors.New("Memory out of bounds") ErrCodeOutOfBounds = errors.New("Code out of bounds") ErrInputOutOfBounds = errors.New("Input out of bounds") ErrCallStackOverflow = errors.New("Call stack overflow") ErrCallStackUnderflow = errors.New("Call stack underflow") ErrDataStackOverflow = errors.New("Data stack overflow") ErrDataStackUnderflow = errors.New("Data stack underflow") ErrInvalidContract = errors.New("Invalid contract") )
var PermissionsContract = "permissions_contract"
var PermsMap = map[string]SNativeFuncDescription{ "e8145855": SNativeFuncDescription{"has_role", 2, ptypes.HasRole, has_role}, "180d26f2": SNativeFuncDescription{"unset_base", 2, ptypes.UnsetBase, unset_base}, "3a3fcc59": SNativeFuncDescription{"set_global", 2, ptypes.SetGlobal, set_global}, "3fbf7da5": SNativeFuncDescription{"add_role", 2, ptypes.AddRole, add_role}, "9ea53314": SNativeFuncDescription{"set_base", 3, ptypes.SetBase, set_base}, "bb37737a": SNativeFuncDescription{"has_base", 2, ptypes.HasBase, has_base}, "28fd0194": SNativeFuncDescription{"rm_role", 2, ptypes.RmRole, rm_role}, }
function identifiers from the solidity abi
Functions ¶
func HasPermission ¶
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, prints a log warning and returns false.
func RegisterNativeContract ¶
func RegisterNativeContract(addr Word256, fn NativeContract) bool
func RegisteredNativeContract ¶
func RegisteredNativeContract(addr Word256) bool
func ValidPermN ¶
Checks if a permission flag is valid (a known base chain or snative permission)
Types ¶
type Account ¶
type Account struct { Address Word256 Balance int64 Code []byte Nonce int64 Other interface{} // For holding all other data. Permissions ptypes.AccountPermissions }
type ErrInvalidPermission ¶
type ErrInvalidPermission struct { Address Word256 SNative string }
func (ErrInvalidPermission) Error ¶
func (e ErrInvalidPermission) Error() string
type ErrPermission ¶
type ErrPermission struct {
// contains filtered or unexported fields
}
func (ErrPermission) Error ¶
func (err ErrPermission) Error() string
type NativeContract ¶
type SNativeFuncDescription ¶
type SNativeFuncDescription struct { Name string NArgs int PermFlag ptypes.PermFlag F NativeContract }
type VM ¶
type VM struct {
// contains filtered or unexported fields
}
func (*VM) Call ¶
func (vm *VM) Call(caller, callee *Account, code, input []byte, value int64, gas *int64) (output []byte, err error)
CONTRACT appState 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 error. 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) DelegateCall ¶
func (vm *VM) DelegateCall(caller, callee *Account, code, input []byte, value int64, gas *int64) (output []byte, err error)
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.