manually rewrite op-codes
why: activate NIM comments needed re-write. as there is no advantage in using the macro replacing a few missing op-codes by "Nop##" name symbols, the macro wrapper has been removed. details: when explicitly accessed by numeric value ##, missing Op enum entries result in a symbol name something like "Op ##". rather than implicitly using a macro to fix the op-codes list, missing entries are detected at compile time when a fatal exception is thrown. the static compile time check verifies that all op-codes 0 .. 255 are defined op code name/mnemonic has at least 2 chars and starts with a capital op code name/mnemonic is not NIM auto-generated (i.e. has a space) also, original '#' comments are exposed as doc comments '##'
This commit is contained in:
parent
e03c483afa
commit
579fed5010
|
@ -0,0 +1,250 @@
|
||||||
|
# Nimbus
|
||||||
|
# Copyright (c) 2018 Status Research & Development GmbH
|
||||||
|
# Licensed under either of
|
||||||
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
||||||
|
# http://opensource.org/licenses/MIT)
|
||||||
|
# at your option. This file may not be copied, modified, or
|
||||||
|
# distributed except according to those terms.
|
||||||
|
|
||||||
|
## Yellow Paper Appendix H -
|
||||||
|
## https://ethereum.github.io/yellowpaper/paper.pdf
|
||||||
|
##
|
||||||
|
## Special notes from Yellow Paper:
|
||||||
|
## - Signed values are treated as two’s complement signed 256-bit
|
||||||
|
## integers.
|
||||||
|
## - When −2^255 is negated, there is an overflow
|
||||||
|
## - For addmod and mulmod, intermediate computations are not subject to
|
||||||
|
## the 2^256 modulo.
|
||||||
|
##
|
||||||
|
## Nimbus authors note:
|
||||||
|
## - This means that we can't naively do (Uint256 + Uint256) mod uint256,
|
||||||
|
## because the intermediate sum (or multiplication) might roll over if
|
||||||
|
## intermediate result is greater or equal 2^256
|
||||||
|
|
||||||
|
type
|
||||||
|
Op* = enum
|
||||||
|
# 0s: Stop and Arithmetic Operations
|
||||||
|
Stop = 0x00, ## Halts execution.
|
||||||
|
Add = 0x01, ## Addition operation.
|
||||||
|
Mul = 0x02, ## Multiplication operation.
|
||||||
|
Sub = 0x03, ## Subtraction operation.
|
||||||
|
Div = 0x04, ## Integer division operation.
|
||||||
|
Sdiv = 0x05, ## Signed integer division operation (truncated).
|
||||||
|
Mod = 0x06, ## Modulo remainder operation.
|
||||||
|
Smod = 0x07, ## Signed modulo remainder operation.
|
||||||
|
Addmod = 0x08, ## Modulo addition operation.
|
||||||
|
Mulmod = 0x09, ## Modulo multiplication operation.
|
||||||
|
Exp = 0x0A, ## Exponentiation operation
|
||||||
|
SignExtend = 0x0B, ## Extend length of two’s complement signed
|
||||||
|
## integer.
|
||||||
|
|
||||||
|
Nop0x0C, Nop0x0D, Nop0x0E, Nop0x0F, ## ..
|
||||||
|
|
||||||
|
# 10s: Comparison & Bitwise Logic Operations
|
||||||
|
Lt = 0x10, ## Less-than comparison.
|
||||||
|
Gt = 0x11, ## Greater-than comparison.
|
||||||
|
Slt = 0x12, ## Signed less-than comparison.
|
||||||
|
Sgt = 0x13, ## Signed greater-than comparison.
|
||||||
|
Eq = 0x14, ## Equality comparison.
|
||||||
|
IsZero = 0x15, ## Simple not operator. (Note: real Yellow Paper
|
||||||
|
## description)
|
||||||
|
And = 0x16, ## Bitwise AND operation.
|
||||||
|
Or = 0x17, ## Bitwise OR operation.
|
||||||
|
Xor = 0x18, ## Bitwise XOR operation.
|
||||||
|
Not = 0x19, ## Bitwise NOT operation.
|
||||||
|
Byte = 0x1A, ## Retrieve single byte from word.
|
||||||
|
Shl = 0x1B, ## Shift left
|
||||||
|
Shr = 0x1C, ## Logical shift right
|
||||||
|
Sar = 0x1D, ## Arithmetic shift right
|
||||||
|
|
||||||
|
Nop0x1E, Nop0x1F, ## ..
|
||||||
|
|
||||||
|
# 20s: SHA3
|
||||||
|
Sha3 = 0x20, ## Compute Keccak-256 hash.
|
||||||
|
|
||||||
|
Nop0x21, Nop0x22, Nop0x23, Nop0x24, Nop0x25, Nop0x26,
|
||||||
|
Nop0x27, Nop0x28, Nop0x29, Nop0x2A, Nop0x2B, Nop0x2C,
|
||||||
|
Nop0x2D, Nop0x2E, Nop0x2F, ## ..
|
||||||
|
|
||||||
|
# 30s: Environmental Information
|
||||||
|
Address = 0x30, ## Get address of currently executing account.
|
||||||
|
Balance = 0x31, ## Get balance of the given account.
|
||||||
|
Origin = 0x32, ## Get execution origination address.
|
||||||
|
Caller = 0x33, ## Get caller address.
|
||||||
|
CallValue = 0x34, ## Get deposited value by the
|
||||||
|
## instruction/transaction responsible for this
|
||||||
|
## execution.
|
||||||
|
CallDataLoad = 0x35, ## Get input data of current environment.
|
||||||
|
CallDataSize = 0x36, ## Get size of input data in current environment.
|
||||||
|
CallDataCopy = 0x37, ## Copy input data in current environment to
|
||||||
|
## memory.
|
||||||
|
CodeSize = 0x38, ## Get size of code running in current environment.
|
||||||
|
CodeCopy = 0x39, ## Copy code running in current environment to
|
||||||
|
## memory.
|
||||||
|
GasPrice = 0x3a, ## Get price of gas in current environment.
|
||||||
|
ExtCodeSize = 0x3b, ## Get size of an account's code
|
||||||
|
ExtCodeCopy = 0x3c, ## Copy an account's code to memory.
|
||||||
|
ReturnDataSize = 0x3d, ## Get size of output data from the previous call
|
||||||
|
## from the current environment.
|
||||||
|
ReturnDataCopy = 0x3e, ## Copy output data from the previous call to
|
||||||
|
## memory.
|
||||||
|
ExtCodeHash = 0x3f, ## Returns the keccak256 hash of a contract’s code
|
||||||
|
|
||||||
|
# 40s: Block Information
|
||||||
|
Blockhash = 0x40, ## Get the hash of one of the 256 most recent
|
||||||
|
## complete blocks.
|
||||||
|
Coinbase = 0x41, ## Get the block's beneficiary address.
|
||||||
|
Timestamp = 0x42, ## Get the block's timestamp.
|
||||||
|
Number = 0x43, ## Get the block's number.
|
||||||
|
Difficulty = 0x44, ## Get the block's difficulty.
|
||||||
|
GasLimit = 0x45, ## Get the block's gas limit.
|
||||||
|
|
||||||
|
ChainId = 0x46, ## Get current chain’s EIP-155 unique identifier.
|
||||||
|
SelfBalance = 0x47, ## Get current contract's balance.
|
||||||
|
|
||||||
|
Nop0x48, Nop0x49, Nop0x4A, Nop0x4B, Nop0x4C, Nop0x4D,
|
||||||
|
Nop0x4E, Nop0x4F, ## ..
|
||||||
|
|
||||||
|
# 50s: Stack, Memory, Storage and Flow Operations
|
||||||
|
Pop = 0x50, ## Remove item from stack.
|
||||||
|
Mload = 0x51, ## Load word from memory.
|
||||||
|
Mstore = 0x52, ## Save word to memory.
|
||||||
|
Mstore8 = 0x53, ## Save byte to memory.
|
||||||
|
Sload = 0x54, ## Load word from storage.
|
||||||
|
Sstore = 0x55, ## Save word to storage.
|
||||||
|
Jump = 0x56, ## Alter the program counter.
|
||||||
|
JumpI = 0x57, ## Conditionally alter the program counter.
|
||||||
|
Pc = 0x58, ## Get the value of the program counter prior to
|
||||||
|
## the increment corresponding to this instruction.
|
||||||
|
Msize = 0x59, ## Get the size of active memory in bytes.
|
||||||
|
Gas = 0x5a, ## Get the amount of available gas, including the
|
||||||
|
## corresponding reduction for the cost of this
|
||||||
|
## instruction.
|
||||||
|
JumpDest = 0x5b, ## Mark a valid destination for jumps. This
|
||||||
|
## operation has no effect on machine state during
|
||||||
|
## execution.
|
||||||
|
BeginSub = 0x5c, ## Marks the entry point to a subroutine
|
||||||
|
ReturnSub = 0x5d, ## Returns control to the caller of a subroutine.
|
||||||
|
JumpSub = 0x5e, ## Transfers control to a subroutine.
|
||||||
|
Nop0x5F = 0x5f, ## ..
|
||||||
|
|
||||||
|
# 60s & 70s: Push Operations.
|
||||||
|
Push1 = 0x60, ## Place 1-byte item on stack.
|
||||||
|
Push2 = 0x61, ## Place 2-byte item on stack.
|
||||||
|
|
||||||
|
Push3, Push4, Push5, Push6, Push7, Push8,
|
||||||
|
Push9, Push10, Push11, Push12, Push13, Push14,
|
||||||
|
Push15, Push16, Push17, Push18, Push19, Push20,
|
||||||
|
Push21, Push22, Push23, Push24, Push25, Push26,
|
||||||
|
Push27, Push28, Push29, Push30, Push31, ## ..
|
||||||
|
|
||||||
|
Push32 = 0x7f, ## Place 32-byte (full word) item on stack.
|
||||||
|
|
||||||
|
# 80s: Duplication Operations
|
||||||
|
Dup1 = 0x80, ## Duplicate 1st stack item.
|
||||||
|
Dup2 = 0x81, ## Duplicate 2nd stack item.
|
||||||
|
|
||||||
|
Dup3, Dup4, Dup5, Dup6, Dup7, Dup8,
|
||||||
|
Dup9, Dup10, Dup11, Dup12, Dup13, Dup14,
|
||||||
|
Dup15, ## ..
|
||||||
|
|
||||||
|
Dup16 = 0x8f, ## Duplicate 16th stack item.
|
||||||
|
|
||||||
|
# 90s: Exchange Operations
|
||||||
|
Swap1 = 0x90, ## Exchange 1st and 2nd stack items.
|
||||||
|
Swap2 = 0x91, ## Exchange 1st and 3rd stack items.
|
||||||
|
|
||||||
|
Swap3, Swap4, Swap5, Swap6, Swap7, Swap8,
|
||||||
|
Swap9, Swap10, Swap11, Swap12, Swap13, Swap14,
|
||||||
|
Swap15, ## ..
|
||||||
|
|
||||||
|
Swap16 = 0x9f, ## Exchange 1st and 17th stack items.
|
||||||
|
|
||||||
|
# a0s: Logging Operations
|
||||||
|
Log0 = 0xa0, ## Append log record with no topics.
|
||||||
|
Log1 = 0xa1, ## Append log record with one topics.
|
||||||
|
|
||||||
|
Log2, Log3, ## ..
|
||||||
|
|
||||||
|
Log4 = 0xa4, ## Append log record with four topics.
|
||||||
|
|
||||||
|
Nop0xA5, Nop0xA6, Nop0xA7, Nop0xA8, Nop0xA9, Nop0xAA,
|
||||||
|
Nop0xAB, Nop0xAC, Nop0xAD, Nop0xAE, Nop0xAF, Nop0xB0,
|
||||||
|
Nop0xB1, Nop0xB2, Nop0xB3, Nop0xB4, Nop0xB5, Nop0xB6,
|
||||||
|
Nop0xB7, Nop0xB8, Nop0xB9, Nop0xBA, Nop0xBB, Nop0xBC,
|
||||||
|
Nop0xBD, Nop0xBE, Nop0xBF, Nop0xC0, Nop0xC1, Nop0xC2,
|
||||||
|
Nop0xC3, Nop0xC4, Nop0xC5, Nop0xC6, Nop0xC7, Nop0xC8,
|
||||||
|
Nop0xC9, Nop0xCA, Nop0xCB, Nop0xCC, Nop0xCD, Nop0xCE,
|
||||||
|
Nop0xCF, Nop0xD0, Nop0xD1, Nop0xD2, Nop0xD3, Nop0xD4,
|
||||||
|
Nop0xD5, Nop0xD6, Nop0xD7, Nop0xD8, Nop0xD9, Nop0xDA,
|
||||||
|
Nop0xDB, Nop0xDC, Nop0xDD, Nop0xDE, Nop0xDF, Nop0xE0,
|
||||||
|
Nop0xE1, Nop0xE2, Nop0xE3, Nop0xE4, Nop0xE5, Nop0xE6,
|
||||||
|
Nop0xE7, Nop0xE8, Nop0xE9, Nop0xEA, Nop0xEB, Nop0xEC,
|
||||||
|
Nop0xED, Nop0xEE, Nop0xEF, ## ..
|
||||||
|
|
||||||
|
# f0s: System operations
|
||||||
|
Create = 0xf0, ## Create a new account with associated code.
|
||||||
|
Call = 0xf1, ## Message-call into an account.
|
||||||
|
CallCode = 0xf2, ## Message-call into this account with an
|
||||||
|
## alternative account's code.
|
||||||
|
Return = 0xf3, ## Halt execution returning output data.
|
||||||
|
DelegateCall = 0xf4, ## Message-call into this account with an
|
||||||
|
## alternative account's code, but persisting the
|
||||||
|
## current values for sender and value.
|
||||||
|
Create2 = 0xf5, ## Behaves identically to CREATE, except using
|
||||||
|
## keccak256( 0xff ++ address ++ salt ++
|
||||||
|
## keccak256(init_code))[12:]
|
||||||
|
|
||||||
|
Nop0xF6, Nop0xF7, Nop0xF8, Nop0xF9, ## ..
|
||||||
|
|
||||||
|
StaticCall = 0xfa, ## Static message-call into an account.
|
||||||
|
|
||||||
|
Nop0xFB, Nop0xFC, ## ..
|
||||||
|
|
||||||
|
Revert = 0xfd, ## Halt execution reverting state changes but
|
||||||
|
## returning data and remaining gas.
|
||||||
|
Invalid = 0xfe, ## Designated invalid instruction.
|
||||||
|
SelfDestruct = 0xff ## Halt execution and register account for later
|
||||||
|
## deletion.
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Verify that Op is contiguous and sym names follow some standards
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
import strutils, sequtils
|
||||||
|
static:
|
||||||
|
type Vfy = enum
|
||||||
|
VfyStop = 0x00,
|
||||||
|
VfySelfDestruct = 0xff
|
||||||
|
|
||||||
|
const
|
||||||
|
allowedChars = {'A'..'Z', 'a'..'z', '0'..'9'}
|
||||||
|
|
||||||
|
# Enum holes look like: "Op 123" (space triggers error)
|
||||||
|
proc badSymNames(a: openArray[string]): seq[string] =
|
||||||
|
toSeq(a).filterIt(it.len < 2 or
|
||||||
|
not it[0].isUpperAscii or
|
||||||
|
it.count(allowedChars) < it.len)
|
||||||
|
|
||||||
|
const
|
||||||
|
vfySymNames = toSeq(0 .. 255).mapIt($it.Vfy).badSymNames
|
||||||
|
opSymNames = toSeq(0 .. 255).mapIt($it.Op).badSymNames
|
||||||
|
|
||||||
|
# control test, values 1..254 must be rejected
|
||||||
|
when vfySymNames.len != 254:
|
||||||
|
static:
|
||||||
|
echo "*** Got only ", vfySymNames.len,
|
||||||
|
" rejected Vfy enum symbols (expected 254)"
|
||||||
|
{.fatal: "Compiler logic might have changed -- please fix"}
|
||||||
|
|
||||||
|
# verify Op enum/table
|
||||||
|
when 0 < opSymNames.len:
|
||||||
|
static:
|
||||||
|
echo "*** Unexpected enum symbols: \"", opSymNames.join("\", "), '"'
|
||||||
|
{.fatal: "Probably holes in Op enum -- please fix"}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# End
|
||||||
|
# ------------------------------------------------------------------------------
|
|
@ -8,79 +8,7 @@
|
||||||
# ##################################################################
|
# ##################################################################
|
||||||
# Macros to facilitate opcode enum and table creation
|
# Macros to facilitate opcode enum and table creation
|
||||||
|
|
||||||
import macros, strformat, strutils
|
import macros
|
||||||
|
|
||||||
# Due to https://github.com/nim-lang/Nim/issues/8007, we can't
|
|
||||||
# use compile-time Tables of object variants, so instead, we use
|
|
||||||
# const arrays to map Op --> gas prices.
|
|
||||||
# Arrays require an enum without hole. This macro will fill the holes
|
|
||||||
# in the enum.
|
|
||||||
|
|
||||||
# This has an added benefits that we can use computed gotos (direct threaded interpreter)
|
|
||||||
# instead of call or subroutine threading to dispatch opcode.
|
|
||||||
# see: https://github.com/nim-lang/Nim/issues/7699 (computed gotos, bad codegen with enum with holes)
|
|
||||||
# see: https://github.com/status-im/nimbus/wiki/Interpreter-optimization-resources
|
|
||||||
# for interpreter dispatch strategies
|
|
||||||
|
|
||||||
macro fill_enum_holes*(body: untyped): untyped =
|
|
||||||
## Fill the holes of an enum
|
|
||||||
## For example
|
|
||||||
## type Foo = enum
|
|
||||||
## A = 0x00,
|
|
||||||
## B = 0x10
|
|
||||||
|
|
||||||
# Sanity checks
|
|
||||||
#
|
|
||||||
# StmtList
|
|
||||||
# TypeSection
|
|
||||||
# TypeDef
|
|
||||||
# PragmaExpr
|
|
||||||
# Postfix
|
|
||||||
# Ident "*"
|
|
||||||
# Ident "Op"
|
|
||||||
# Pragma
|
|
||||||
# Ident "pure"
|
|
||||||
# Empty
|
|
||||||
# EnumTy
|
|
||||||
# Empty
|
|
||||||
# EnumFieldDef
|
|
||||||
# Ident "Stop"
|
|
||||||
# IntLit 0
|
|
||||||
# EnumFieldDef
|
|
||||||
# Ident "Add"
|
|
||||||
# IntLit 1
|
|
||||||
body[0].expectKind(nnkTypeSection)
|
|
||||||
body[0][0][2].expectKind(nnkEnumTy)
|
|
||||||
|
|
||||||
let opcodes = body[0][0][2]
|
|
||||||
|
|
||||||
# We will iterate over all the opcodes
|
|
||||||
# check if the i-th value is declared, if not add a no-op
|
|
||||||
# and accumulate that in a "dense opcodes" declaration
|
|
||||||
|
|
||||||
var
|
|
||||||
opcode = 0
|
|
||||||
holes_idx = 1
|
|
||||||
dense_opcs = nnkEnumTy.newTree()
|
|
||||||
dense_opcs.add newEmptyNode()
|
|
||||||
|
|
||||||
# Iterate on the enum with holes
|
|
||||||
while holes_idx < opcodes.len:
|
|
||||||
let curr_ident = opcodes[holes_idx]
|
|
||||||
|
|
||||||
if curr_ident.kind in {nnkIdent, nnkEmpty} or
|
|
||||||
(curr_ident.kind == nnkEnumFieldDef and
|
|
||||||
curr_ident[1].intVal == opcode):
|
|
||||||
|
|
||||||
dense_opcs.add curr_ident
|
|
||||||
inc holes_idx
|
|
||||||
else:
|
|
||||||
dense_opcs.add newIdentNode(&"Nop0x{opcode.toHex(2)}")
|
|
||||||
|
|
||||||
inc opcode
|
|
||||||
|
|
||||||
result = body
|
|
||||||
result[0][0][2] = dense_opcs
|
|
||||||
|
|
||||||
macro fill_enum_table_holes*(enumTy: typedesc[enum], nop_filler, body: untyped): untyped =
|
macro fill_enum_table_holes*(enumTy: typedesc[enum], nop_filler, body: untyped): untyped =
|
||||||
## Fill the holes of table mapping for enum with a default value
|
## Fill the holes of table mapping for enum with a default value
|
||||||
|
|
|
@ -5,190 +5,8 @@
|
||||||
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
||||||
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
when not defined(vm2_enabled):
|
|
||||||
{.fatal: "Flags \"vm2_enabled\" must be defined"}
|
|
||||||
when defined(evmc_enabled):
|
when defined(evmc_enabled):
|
||||||
{.fatal: "Flags \"evmc_enabled\" and \"vm2_enabled\" are mutually exclusive"}
|
{.fatal: "Flags \"evmc_enabled\" and \"vm2_enabled\" are mutually exclusive"}
|
||||||
|
|
||||||
import ./utils/macros_gen_opcodes
|
import ./op_codes
|
||||||
|
export Op
|
||||||
fill_enum_holes:
|
|
||||||
type
|
|
||||||
# Yellow Paper Appendix H - https://ethereum.github.io/yellowpaper/paper.pdf
|
|
||||||
# Special notes from Yellow Paper:
|
|
||||||
# - Signed values are treated as two’s complement signed 256-bit integers.
|
|
||||||
# - When −2^255 is negated, there is an overflow
|
|
||||||
# - For addmod and mulmod, intermediate computations are not subject to the 2^256 modulo.
|
|
||||||
# Nimbus authors note:
|
|
||||||
# - This means that we can't naively do (Uint256 + Uint256) mod uint256,
|
|
||||||
# because the intermediate sum (or multiplication) might roll over if
|
|
||||||
# intermediate result is greater or equal 2^256
|
|
||||||
|
|
||||||
Op* = enum
|
|
||||||
# 0s: Stop and Arithmetic Operations
|
|
||||||
Stop = 0x00, # Halts execution.
|
|
||||||
Add = 0x01, # Addition operation.
|
|
||||||
Mul = 0x02, # Multiplication operation.
|
|
||||||
Sub = 0x03, # Subtraction operation.
|
|
||||||
Div = 0x04, # Integer division operation.
|
|
||||||
Sdiv = 0x05, # Signed integer division operation (truncated).
|
|
||||||
Mod = 0x06, # Modulo remainder operation.
|
|
||||||
Smod = 0x07, # Signed modulo remainder operation.
|
|
||||||
Addmod = 0x08, # Modulo addition operation.
|
|
||||||
Mulmod = 0x09, # Modulo multiplication operation.
|
|
||||||
Exp = 0x0A, # Exponentiation operation
|
|
||||||
SignExtend = 0x0B, # Extend length of two’s complement signed integer.
|
|
||||||
|
|
||||||
# 10s: Comparison & Bitwise Logic Operations
|
|
||||||
Lt = 0x10, # Less-than comparison.
|
|
||||||
Gt = 0x11, # Greater-than comparison.
|
|
||||||
Slt = 0x12, # Signed less-than comparison.
|
|
||||||
Sgt = 0x13, # Signed greater-than comparison.
|
|
||||||
Eq = 0x14, # Equality comparison.
|
|
||||||
IsZero = 0x15, # Simple not operator. (Note: real Yellow Paper description)
|
|
||||||
And = 0x16, # Bitwise AND operation.
|
|
||||||
Or = 0x17, # Bitwise OR operation.
|
|
||||||
Xor = 0x18, # Bitwise XOR operation.
|
|
||||||
Not = 0x19, # Bitwise NOT operation.
|
|
||||||
Byte = 0x1A, # Retrieve single byte from word.
|
|
||||||
Shl = 0x1B, # Shift left
|
|
||||||
Shr = 0x1C, # Logical shift right
|
|
||||||
Sar = 0x1D, # Arithmetic shift right
|
|
||||||
|
|
||||||
# 20s: SHA3
|
|
||||||
Sha3 = 0x20, # Compute Keccak-256 hash.
|
|
||||||
|
|
||||||
# 30s: Environmental Information
|
|
||||||
Address = 0x30, # Get address of currently executing account.
|
|
||||||
Balance = 0x31, # Get balance of the given account.
|
|
||||||
Origin = 0x32, # Get execution origination address.
|
|
||||||
Caller = 0x33, # Get caller address.
|
|
||||||
CallValue = 0x34, # Get deposited value by the instruction/transaction responsible for this execution.
|
|
||||||
CallDataLoad = 0x35, # Get input data of current environment.
|
|
||||||
CallDataSize = 0x36, # Get size of input data in current environment.
|
|
||||||
CallDataCopy = 0x37, # Copy input data in current environment to memory.
|
|
||||||
CodeSize = 0x38, # Get size of code running in current environment.
|
|
||||||
CodeCopy = 0x39, # Copy code running in current environment to memory.
|
|
||||||
GasPrice = 0x3a, # Get price of gas in current environment.
|
|
||||||
ExtCodeSize = 0x3b, # Get size of an account's code
|
|
||||||
ExtCodeCopy = 0x3c, # Copy an account's code to memory.
|
|
||||||
ReturnDataSize = 0x3d, # Get size of output data from the previous call from the current environment.
|
|
||||||
ReturnDataCopy = 0x3e, # Copy output data from the previous call to memory.
|
|
||||||
ExtCodeHash = 0x3f, # Returns the keccak256 hash of a contract’s code
|
|
||||||
|
|
||||||
# 40s: Block Information
|
|
||||||
Blockhash = 0x40, # Get the hash of one of the 256 most recent complete blocks.
|
|
||||||
Coinbase = 0x41, # Get the block's beneficiary address.
|
|
||||||
Timestamp = 0x42, # Get the block's timestamp.
|
|
||||||
Number = 0x43, # Get the block's number.
|
|
||||||
Difficulty = 0x44, # Get the block's difficulty.
|
|
||||||
GasLimit = 0x45, # Get the block's gas limit.
|
|
||||||
|
|
||||||
ChainId = 0x46, # Get current chain’s EIP-155 unique identifier.
|
|
||||||
SelfBalance = 0x47, # Get current contract's balance.
|
|
||||||
|
|
||||||
# 50s: Stack, Memory, Storage and Flow Operations
|
|
||||||
Pop = 0x50, # Remove item from stack.
|
|
||||||
Mload = 0x51, # Load word from memory.
|
|
||||||
Mstore = 0x52, # Save word to memory.
|
|
||||||
Mstore8 = 0x53, # Save byte to memory.
|
|
||||||
Sload = 0x54, # Load word from storage.
|
|
||||||
Sstore = 0x55, # Save word to storage.
|
|
||||||
Jump = 0x56, # Alter the program counter.
|
|
||||||
JumpI = 0x57, # Conditionally alter the program counter.
|
|
||||||
Pc = 0x58, # Get the value of the program counter prior to the increment corresponding to this instruction.
|
|
||||||
Msize = 0x59, # Get the size of active memory in bytes.
|
|
||||||
Gas = 0x5a, # Get the amount of available gas, including the corresponding reduction for the cost of this instruction.
|
|
||||||
JumpDest = 0x5b, # Mark a valid destination for jumps. This operation has no effect on machine state during execution.
|
|
||||||
BeginSub = 0x5c, # Marks the entry point to a subroutine
|
|
||||||
ReturnSub = 0x5d, # Returns control to the caller of a subroutine.
|
|
||||||
JumpSub = 0x5e, # Transfers control to a subroutine.
|
|
||||||
|
|
||||||
# 60s & 70s: Push Operations.
|
|
||||||
Push1 = 0x60, # Place 1-byte item on stack.
|
|
||||||
Push2 = 0x61, # Place 2-byte item on stack.
|
|
||||||
Push3,
|
|
||||||
Push4,
|
|
||||||
Push5,
|
|
||||||
Push6,
|
|
||||||
Push7,
|
|
||||||
Push8,
|
|
||||||
Push9,
|
|
||||||
Push10,
|
|
||||||
Push11,
|
|
||||||
Push12,
|
|
||||||
Push13,
|
|
||||||
Push14,
|
|
||||||
Push15,
|
|
||||||
Push16,
|
|
||||||
Push17,
|
|
||||||
Push18,
|
|
||||||
Push19,
|
|
||||||
Push20,
|
|
||||||
Push21,
|
|
||||||
Push22,
|
|
||||||
Push23,
|
|
||||||
Push24,
|
|
||||||
Push25,
|
|
||||||
Push26,
|
|
||||||
Push27,
|
|
||||||
Push28,
|
|
||||||
Push29,
|
|
||||||
Push30,
|
|
||||||
Push31,
|
|
||||||
Push32 = 0x7f, # Place 32-byte (full word) item on stack.
|
|
||||||
|
|
||||||
# 80s: Duplication Operations
|
|
||||||
Dup1 = 0x80, # Duplicate 1st stack item.
|
|
||||||
Dup2 = 0x81, # Duplicate 2nd stack item.
|
|
||||||
Dup3,
|
|
||||||
Dup4,
|
|
||||||
Dup5,
|
|
||||||
Dup6,
|
|
||||||
Dup7,
|
|
||||||
Dup8,
|
|
||||||
Dup9,
|
|
||||||
Dup10,
|
|
||||||
Dup11,
|
|
||||||
Dup12,
|
|
||||||
Dup13,
|
|
||||||
Dup14,
|
|
||||||
Dup15,
|
|
||||||
Dup16 = 0x8f, # Duplicate 16th stack item.
|
|
||||||
|
|
||||||
# 90s: Exchange Operations
|
|
||||||
Swap1 = 0x90, # Exchange 1st and 2nd stack items.
|
|
||||||
Swap2 = 0x91, # Exchange 1st and 3rd stack items.
|
|
||||||
Swap3,
|
|
||||||
Swap4,
|
|
||||||
Swap5,
|
|
||||||
Swap6,
|
|
||||||
Swap7,
|
|
||||||
Swap8,
|
|
||||||
Swap9,
|
|
||||||
Swap10,
|
|
||||||
Swap11,
|
|
||||||
Swap12,
|
|
||||||
Swap13,
|
|
||||||
Swap14,
|
|
||||||
Swap15,
|
|
||||||
Swap16 = 0x9f, # Exchange 1st and 17th stack items.
|
|
||||||
|
|
||||||
# a0s: Logging Operations
|
|
||||||
Log0 = 0xa0, # Append log record with no topics.
|
|
||||||
Log1 = 0xa1, # Append log record with one topics.
|
|
||||||
Log2,
|
|
||||||
Log3,
|
|
||||||
Log4 = 0xa4, # Append log record with four topics.
|
|
||||||
|
|
||||||
# f0s: System operations
|
|
||||||
Create = 0xf0, # Create a new account with associated code.
|
|
||||||
Call = 0xf1, # Message-call into an account.
|
|
||||||
CallCode = 0xf2, # Message-call into this account with an alternative account's code.
|
|
||||||
Return = 0xf3, # Halt execution returning output data.
|
|
||||||
DelegateCall = 0xf4, # Message-call into this account with an alternative account's code, but persisting the current values for sender and value.
|
|
||||||
Create2 = 0xf5, # Behaves identically to CREATE, except using keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]
|
|
||||||
StaticCall = 0xfa, # Static message-call into an account.
|
|
||||||
Revert = 0xfd, # Halt execution reverting state changes but returning data and remaining gas.
|
|
||||||
Invalid = 0xfe, # Designated invalid instruction.
|
|
||||||
SelfDestruct = 0xff # Halt execution and register account for later deletion.
|
|
||||||
|
|
Loading…
Reference in New Issue