nimbus-eth1/nimbus/vm/interpreter/opcode_values.nim

195 lines
8.3 KiB
Nim
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.
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 twos 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 twos 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 contracts 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.
ChainIdOp = 0x46, # Get current chains EIP-155 unique identifier.
SelfBalance = 0x47, # Get current contract's balance.
BaseFee = 0x48, # Get blocks base fee. EIP-3198
# 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.
const
# EIP-4399 new opcode
PrevRandao* = Difficulty