2018-04-06 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.
|
|
|
|
|
|
Refactor interpreter dispatch (#65)
* move forks constants, rename errors
* Move vm/utils to vm/interpreter/utils
* initial opcodes refactoring
* Add refactored Comparison & Bitwise Logic Operations
* Add sha3 and address, simplify macro, support pop 0
* balance, origin, caller, callValue
* fix gas copy opcodes gas costs, add callDataLoad/Size/Copy, CodeSize/Copy and gas price opcode
* Update with 30s, 40s, 50s opcodes + impl of balance + stack improvement
* add push, dup, swap, log, create and call operations
* finish opcode implementation
* Add the new dispatching logic
* Pass the opcode test
* Make test_vm_json compile
* halt execution without exceptions for Return, Revert, selfdestruct (fix #62)
* Properly catch and recover from EVM exceptions (stack underflow ...)
* Fix byte op
* Fix jump regressions
* Update for latest devel, don't import old dispatch code as quasiBoolean macro is broken by latest devel
* Fix sha3 regression on empty memory slice and until end of range slice
* Fix padding / range error on expXY_success (gas computation left)
* update logging procs
* Add tracing - expXY_success is not a regression, sload stub was accidentally passing the test
* Reuse the same stub as OO implementation
* Delete previous opcode implementation
* Delete object oriented fork code
* Delete exceptions that were used as control flows
* delete base.nim :fire:, yet another OO remnants
* Delete opcode table
* Enable omputed gotos and compile-time gas fees
* Revert const gasCosts -> generates SIGSEGV
* inline push, swap and dup opcodes
* loggers are now template again, why does this pass new tests?
* Trigger CI rebuild after rocksdb fix https://github.com/status-im/nim-rocksdb/pull/5
* Address review comment on "push" + VMTests in debug mode (not release)
* Address review comment: don't tag fork by default, make opcode impl grepable
* Static compilation fixes after rebasing
* fix the initialization of the VM database
* add a missing import
* Deactivate balance and sload test following #59
* Reactivate stack check (deactivated in #59, necessary to pass tests)
* Merge remaining opcodes implementation from #59
* Merge callDataLoad and codeCopy fixes, todo simplify see #67
2018-07-06 07:52:31 +00:00
|
|
|
|
import ./utils/macros_gen_opcodes
|
2018-06-12 15:33:47 +00:00
|
|
|
|
|
|
|
|
|
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:
|
2022-04-08 04:54:11 +00:00
|
|
|
|
# - This means that we can't naively do (UInt256 + UInt256) mod uint256,
|
2018-06-12 15:33:47 +00:00
|
|
|
|
# because the intermediate sum (or multiplication) might roll over if
|
|
|
|
|
# intermediate result is greater or equal 2^256
|
|
|
|
|
|
Refactor interpreter dispatch (#65)
* move forks constants, rename errors
* Move vm/utils to vm/interpreter/utils
* initial opcodes refactoring
* Add refactored Comparison & Bitwise Logic Operations
* Add sha3 and address, simplify macro, support pop 0
* balance, origin, caller, callValue
* fix gas copy opcodes gas costs, add callDataLoad/Size/Copy, CodeSize/Copy and gas price opcode
* Update with 30s, 40s, 50s opcodes + impl of balance + stack improvement
* add push, dup, swap, log, create and call operations
* finish opcode implementation
* Add the new dispatching logic
* Pass the opcode test
* Make test_vm_json compile
* halt execution without exceptions for Return, Revert, selfdestruct (fix #62)
* Properly catch and recover from EVM exceptions (stack underflow ...)
* Fix byte op
* Fix jump regressions
* Update for latest devel, don't import old dispatch code as quasiBoolean macro is broken by latest devel
* Fix sha3 regression on empty memory slice and until end of range slice
* Fix padding / range error on expXY_success (gas computation left)
* update logging procs
* Add tracing - expXY_success is not a regression, sload stub was accidentally passing the test
* Reuse the same stub as OO implementation
* Delete previous opcode implementation
* Delete object oriented fork code
* Delete exceptions that were used as control flows
* delete base.nim :fire:, yet another OO remnants
* Delete opcode table
* Enable omputed gotos and compile-time gas fees
* Revert const gasCosts -> generates SIGSEGV
* inline push, swap and dup opcodes
* loggers are now template again, why does this pass new tests?
* Trigger CI rebuild after rocksdb fix https://github.com/status-im/nim-rocksdb/pull/5
* Address review comment on "push" + VMTests in debug mode (not release)
* Address review comment: don't tag fork by default, make opcode impl grepable
* Static compilation fixes after rebasing
* fix the initialization of the VM database
* add a missing import
* Deactivate balance and sload test following #59
* Reactivate stack check (deactivated in #59, necessary to pass tests)
* Merge remaining opcodes implementation from #59
* Merge callDataLoad and codeCopy fixes, todo simplify see #67
2018-07-06 07:52:31 +00:00
|
|
|
|
Op* = enum
|
2018-06-12 15:33:47 +00:00
|
|
|
|
# 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.
|
Refactor interpreter dispatch (#65)
* move forks constants, rename errors
* Move vm/utils to vm/interpreter/utils
* initial opcodes refactoring
* Add refactored Comparison & Bitwise Logic Operations
* Add sha3 and address, simplify macro, support pop 0
* balance, origin, caller, callValue
* fix gas copy opcodes gas costs, add callDataLoad/Size/Copy, CodeSize/Copy and gas price opcode
* Update with 30s, 40s, 50s opcodes + impl of balance + stack improvement
* add push, dup, swap, log, create and call operations
* finish opcode implementation
* Add the new dispatching logic
* Pass the opcode test
* Make test_vm_json compile
* halt execution without exceptions for Return, Revert, selfdestruct (fix #62)
* Properly catch and recover from EVM exceptions (stack underflow ...)
* Fix byte op
* Fix jump regressions
* Update for latest devel, don't import old dispatch code as quasiBoolean macro is broken by latest devel
* Fix sha3 regression on empty memory slice and until end of range slice
* Fix padding / range error on expXY_success (gas computation left)
* update logging procs
* Add tracing - expXY_success is not a regression, sload stub was accidentally passing the test
* Reuse the same stub as OO implementation
* Delete previous opcode implementation
* Delete object oriented fork code
* Delete exceptions that were used as control flows
* delete base.nim :fire:, yet another OO remnants
* Delete opcode table
* Enable omputed gotos and compile-time gas fees
* Revert const gasCosts -> generates SIGSEGV
* inline push, swap and dup opcodes
* loggers are now template again, why does this pass new tests?
* Trigger CI rebuild after rocksdb fix https://github.com/status-im/nim-rocksdb/pull/5
* Address review comment on "push" + VMTests in debug mode (not release)
* Address review comment: don't tag fork by default, make opcode impl grepable
* Static compilation fixes after rebasing
* fix the initialization of the VM database
* add a missing import
* Deactivate balance and sload test following #59
* Reactivate stack check (deactivated in #59, necessary to pass tests)
* Merge remaining opcodes implementation from #59
* Merge callDataLoad and codeCopy fixes, todo simplify see #67
2018-07-06 07:52:31 +00:00
|
|
|
|
Exp = 0x0A, # Exponentiation operation
|
2018-06-12 15:33:47 +00:00
|
|
|
|
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.
|
2019-04-30 05:23:51 +00:00
|
|
|
|
Shl = 0x1B, # Shift left
|
|
|
|
|
Shr = 0x1C, # Logical shift right
|
|
|
|
|
Sar = 0x1D, # Arithmetic shift right
|
2018-06-12 15:33:47 +00:00
|
|
|
|
|
|
|
|
|
# 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.
|
2019-04-30 05:23:51 +00:00
|
|
|
|
ExtCodeHash = 0x3f, # Returns the keccak256 hash of a contract’s code
|
2018-06-12 15:33:47 +00:00
|
|
|
|
|
|
|
|
|
# 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.
|
|
|
|
|
|
2021-05-15 06:37:40 +00:00
|
|
|
|
ChainIdOp = 0x46, # Get current chain’s EIP-155 unique identifier.
|
2019-11-11 05:12:58 +00:00
|
|
|
|
SelfBalance = 0x47, # Get current contract's balance.
|
2021-06-27 13:18:17 +00:00
|
|
|
|
BaseFee = 0x48, # Get block’s base fee. EIP-3198
|
2019-11-11 04:58:58 +00:00
|
|
|
|
|
2018-06-12 15:33:47 +00:00
|
|
|
|
# 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.
|
2020-11-25 09:43:34 +00:00
|
|
|
|
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.
|
2018-06-12 15:33:47 +00:00
|
|
|
|
|
|
|
|
|
# 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.
|
2019-04-30 05:23:51 +00:00
|
|
|
|
Create2 = 0xf5, # Behaves identically to CREATE, except using keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]
|
2018-06-12 15:33:47 +00:00
|
|
|
|
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.
|
2022-02-01 08:35:30 +00:00
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
# EIP-4399 new opcode
|
2022-02-27 05:21:46 +00:00
|
|
|
|
PrevRandao* = Difficulty
|