Summary
EVM opcode
는 이더리움 네트워크에서 스마트 계약을 실행하기 위한 기계어 명령어입니다.
Description
EVM opcode
는 이더리움 네트워크에서 스마트 계약을 실행하기 위한 기계어 명령어로, EVM이 스마트 계약의 코드를 이해하고 실행할 수 있게 해줍니다. Opcode는 스마트 계약의 로직을 구현하는 데 필수적인 요소이며, 가스 소비, 메모리 관리, 흐름 제어 등 다양한 작업을 수행합니다.
중요성
- 가스 소비 계산: 각 opcode는 실행 시 일정량(변동성을 가진 연산도 존재)의 가스를 소비합니다. 이는 네트워크의 자원을 사용하는 대가로, 스마트 계약의 효율성을 평가하는 데 중요한 요소입니다.
- 스마트 계약 실행: opcode는 스마트 계약의 비즈니스 로직을 실행하는 데 필요한 기본적인 구성 요소입니다.
- 보안: 일부 opcode는 보안 관련 작업을 수행하여 스마트 계약을 안전하게 유지합니다.
주요 Opcode 예시
- SSTORE (0x55):
storage[key] := val
- SLOAD (0x54):
storage[key]
- CREATE (0xF0):
addr = keccak256(rlp([address(this), this.nonce]))
- CREATE2 (0xF5):
addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
- ++ 연산자는 EVM의 CREATE2 opcode 컨텍스트에서 문자열 또는 바이트 시퀀스의 연결을 나타냅니다.
Tips
a, b => a + b
는ADD
opcode가 스택에서 두 항목(a
와b
)을 가져와 이들의 합을 스택에 다시 놓는다는 의미입니다. 가장 왼쪽 항목(a
)이 스택의 최상위 항목입니다.- 모든 스택 설명은 이후 스택 항목을 생략합니다. 명시되지 않은 스택 요소는 연산의 의미에 영향을 주지 않는다고 가정할 수 있습니다. 단, 스택 오버플로우가 발생하는 경우는 예외입니다.
- 스택의 최대 크기는 1024 항목이며, 모든 스택 항목은 32 바이트입니다.
a // b
는 내림 나눗셈을 나타냅니다. EVM에서 0으로 나누기의 결과는 0입니다.- 모든 산술 연산은 모듈로 2**256로 수행됩니다.
- 지정된
INVALID
opcode를 포함하여 EVM은 현재 141 개의 opcode를 구현하고 있으며, 그 중 65 개는 중복된 명령어(PUSHn
,DUPn
,SWAPn
,LOGn
)입니다.
Existing Opcodes
Shanghai
Number | Name | Execution spec category | Initial Release | EIP |
---|---|---|---|---|
0x00 | STOP | Control Flow | ||
0x01 | ADD | Arithmetic | ||
0x02 | MUL | Arithmetic | ||
0x03 | SUB | Arithmetic | ||
0x04 | DIV | Arithmetic | ||
0x05 | SDIV | Arithmetic | ||
0x06 | MOD | Arithmetic | ||
0x07 | SMOD | Arithmetic | ||
0x08 | ADDMOD | Arithmetic | ||
0x09 | MULMOD | Arithmetic | ||
0x0A | EXP | Arithmetic | ||
0x0B | SIGNEXTEND | Arithmetic | ||
0x10 | LT | Comparison | ||
0x11 | GT | Comparison | ||
0x12 | SLT | Comparison | ||
0x13 | SGT | Comparison | ||
0x14 | EQ | Comparison | ||
0x15 | ISZERO | Comparison | ||
0x16 | AND | Bitwise | ||
0x17 | OR | Bitwise | ||
0x18 | XOR | Bitwise | ||
0x19 | NOT | Bitwise | ||
0x1A | BYTE | Bitwise | ||
0x1B | SHL | Bitwise | Constantinople | EIP-145 |
0x1C | SHR | Bitwise | Constantinople | EIP-145 |
0x1D | SAR | Bitwise | Constantinople | EIP-145 |
0x20 | KECCAK | Keccak | ||
0x30 | ADDRESS | Environmental | ||
0x31 | BALANCE | Environmental | ||
0x32 | ORIGIN | Environmental | ||
0x33 | CALLER | Environmental | ||
0x34 | CALLVALUE | Environmental | ||
0x35 | CALLDATALOAD | Environmental | ||
0x36 | CALLDATASIZE | Environmental | ||
0x37 | CALLDATACOPY | Environmental | ||
0x38 | CODESIZE | Environmental | ||
0x39 | CODECOPY | Environmental | ||
0x3A | GASPRICE | Environmental | ||
0x3B | EXTCODESIZE | Environmental | ||
0x3C | EXTCODECOPY | Environmental | ||
0x3D | RETURNDATASIZE | Environmental | Byzantium | EIP-211 |
0x3E | RETURNDATACOPY | Environmental | Byzantium | EIP-211 |
0x3F | EXTCODEHASH | Environmental | Constantinople | EIP-1052 |
0x40 | BLOCKHASH | Block | ||
0x41 | COINBASE | Block | ||
0x42 | TIMESTAMP | Block | ||
0x43 | NUMBER | Block | ||
0x44 | DIFFICULTY | Block | Frontier→London | |
0x44 | PREVRANDAO | Block | Paris | EIP-4399 |
0x45 | GASLIMIT | Block | ||
0x46 | CHAINID | Block | Istanbul | EIP-1344 |
0x47 | SELFBALANCE | Block | Istanbul | EIP-1884 |
0x48 | BASEFEE | Block | London | EIP-3198 |
0x50 | POP | Pop | ||
0x51 | MLOAD | Memory | ||
0x52 | MSTORE | Memory | ||
0x53 | MSTORE8 | Memory | ||
0x54 | SLOAD | Storage | ||
0x55 | SSTORE | Storage | ||
0x56 | JUMP | Control Flow | ||
0x57 | JUMPI | Control Flow | ||
0x58 | PC | Control Flow | ||
0x59 | MSIZE | Memory | ||
0x5A | GAS | Control Flow | ||
0x5B | JUMPDEST | Control Flow | ||
0x5F | PUSH0 | Push | Shanghai | EIP-3855 |
0x60 | PUSH1 | Push | ||
0x61 | PUSH2 | Push | ||
0x62 | PUSH3 | Push | ||
0x63 | PUSH4 | Push | ||
0x64 | PUSH5 | Push | ||
0x65 | PUSH6 | Push | ||
0x66 | PUSH7 | Push | ||
0x67 | PUSH8 | Push | ||
0x68 | PUSH9 | Push | ||
0x69 | PUSH10 | Push | ||
0x6A | PUSH11 | Push | ||
0x6B | PUSH12 | Push | ||
0x6C | PUSH13 | Push | ||
0x6D | PUSH14 | Push | ||
0x6E | PUSH15 | Push | ||
0x6F | PUSH16 | Push | ||
0x70 | PUSH17 | Push | ||
0x71 | PUSH18 | Push | ||
0x72 | PUSH19 | Push | ||
0x73 | PUSH20 | Push | ||
0x74 | PUSH21 | Push | ||
0x75 | PUSH22 | Push | ||
0x76 | PUSH23 | Push | ||
0x77 | PUSH24 | Push | ||
0x78 | PUSH25 | Push | ||
0x79 | PUSH26 | Push | ||
0x7A | PUSH27 | Push | ||
0x7B | PUSH28 | Push | ||
0x7C | PUSH29 | Push | ||
0x7D | PUSH30 | Push | ||
0x7E | PUSH31 | Push | ||
0x7F | PUSH32 | Push | ||
0x80 | DUP1 | Dup | ||
0x81 | DUP2 | Dup | ||
0x82 | DUP3 | Dup | ||
0x83 | DUP4 | Dup | ||
0x84 | DUP5 | Dup | ||
0x85 | DUP6 | Dup | ||
0x86 | DUP7 | Dup | ||
0x87 | DUP8 | Dup | ||
0x88 | DUP9 | Dup | ||
0x89 | DUP10 | Dup | ||
0x8A | DUP11 | Dup | ||
0x8B | DUP12 | Dup | ||
0x8C | DUP13 | Dup | ||
0x8D | DUP14 | Dup | ||
0x8E | DUP15 | Dup | ||
0x8F | DUP16 | Dup | ||
0x90 | SWAP1 | Swap | ||
0x91 | SWAP2 | Swap | ||
0x92 | SWAP3 | Swap | ||
0x93 | SWAP4 | Swap | ||
0x94 | SWAP5 | Swap | ||
0x95 | SWAP6 | Swap | ||
0x96 | SWAP7 | Swap | ||
0x97 | SWAP8 | Swap | ||
0x98 | SWAP9 | Swap | ||
0x99 | SWAP10 | Swap | ||
0x9A | SWAP11 | Swap | ||
0x9B | SWAP12 | Swap | ||
0x9C | SWAP13 | Swap | ||
0x9D | SWAP14 | Swap | ||
0x9E | SWAP15 | Swap | ||
0x9F | SWAP16 | Swap | ||
0xA0 | LOG0 | Log | ||
0xA1 | LOG1 | Log | ||
0xA2 | LOG2 | Log | ||
0xA3 | LOG3 | Log | ||
0xA4 | LOG4 | Log | ||
0xF0 | CREATE | System | ||
0xF1 | CALL | System | ||
0xF2 | CALLCODE | System | ||
0xF3 | RETURN | System | ||
0xF4 | DELEGATECALL | System | Homestead | EIP-7 |
0xF5 | CREATE2 | System | Constantinople | EIP-1014 |
0xFA | STATICCALL | System | Byzantium | EIP-214 |
0xFD | REVERT | System | Byzantium | EIP-140 |
0xFE | INVALID/ABORT | System | (unofficial) | EIP-141 |
0xFF | SELFDESTRUCT | System |
https://github.com/ethereum/execution-specs/blob/master/lists/evm/pending-opcodes.md https://github.com/ethereum/execution-specs/blob/master/lists/evm/proposed-opcodes.md