2021-04-08 14:52:10 +00:00
|
|
|
|
# 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.
|
|
|
|
|
|
2021-04-08 15:13:27 +00:00
|
|
|
|
when not defined(vm2_enabled):
|
|
|
|
|
{.fatal: "Flags \"vm2_enabled\" must be defined"}
|
|
|
|
|
when defined(evmc_enabled):
|
|
|
|
|
{.fatal: "Flags \"evmc_enabled\" and \"vm2_enabled\" are mutually exclusive"}
|
|
|
|
|
|
2021-04-08 14:52:10 +00:00
|
|
|
|
import ./utils/macros_gen_opcodes
|
|
|
|
|
|
|
|
|
|
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.
|