Opcodes für die EVM
Letzte Aktualisierung der Seite: 11. September 2025
Übersicht
Dies ist eine aktualisierte Version der EVM-Referenzseite unter wolflo/evm-opcodes (opens in a new tab). Sie stützt sich zudem auf das Yellow Paper (opens in a new tab), das Jello Paper (opens in a new tab) und die geth (opens in a new tab)-Implementierung. Dies soll eine leicht zugängliche Referenz sein, ist jedoch nicht besonders rigoros. Wenn Sie sich der Richtigkeit sicher sein und jeden Randfall kennen möchten, ist die Verwendung des Jello Papers oder einer Client-Implementierung ratsam.
Suchen Sie nach einer interaktiven Referenz? Schauen Sie sich evm.codes (opens in a new tab) an.
Für Operationen mit dynamischen Gaskosten, siehe gas.md (opens in a new tab).
💡 Kurzer Tipp: Um ganze Zeilen anzuzeigen, verwenden Sie [Shift] + Scrollen, um auf dem Desktop horizontal zu scrollen.
| Stack | Name | Gas | Anfänglicher Stack | Resultierender Stack | Speicher / Storage | Notizen |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | Ausführung anhalten | |||
| 01 | ADD | 3 | a, b | a + b | (u)int256-Addition modulo 2**256 | |
| 02 | MUL | 5 | a, b | a * b | (u)int256-Multiplikation modulo 2**256 | |
| 03 | SUB | 3 | a, b | a - b | (u)int256-Subtraktion modulo 2**256 | |
| 04 | DIV | 5 | a, b | a // b | uint256-Division | |
| 05 | SDIV | 5 | a, b | a // b | int256-Division | |
| 06 | MOD | 5 | a, b | a % b | uint256-Modulo | |
| 07 | SMOD | 5 | a, b | a % b | int256-Modulo | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | (u)int256-Addition modulo N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | (u)int256-Multiplikation modulo N | |
| 0A | EXP | A1 (opens in a new tab) | a, b | a ** b | uint256-Potenzierung modulo 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | Vorzeichenerweiterung (opens in a new tab) von x von (b+1) Bytes auf 32 Bytes | |
| 0C-0F | ungültig | |||||
| 10 | LT | 3 | a, b | a < b | uint256 kleiner-als | |
| 11 | GT | 3 | a, b | a > b | uint256 größer-als | |
| 12 | SLT | 3 | a, b | a < b | int256 kleiner-als | |
| 13 | SGT | 3 | a, b | a > b | int256 größer-als | |
| 14 | EQ | 3 | a, b | a == b | (u)int256-Gleichheit | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 ist-null | |
| 16 | AND | 3 | a, b | a && b | bitweises UND | |
| 17 | OR | 3 | a, b | a || b | bitweises ODER | |
| 18 | XOR | 3 | a, b | a ^ b | bitweises exklusives ODER (XOR) | |
| 19 | NOT | 3 | a | ~a | bitweises NICHT | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | i-tes Byte von (u)int256 x, von links | |
| 1B | SHL | 3 | shift, val | val << shift | Linksverschiebung | |
| 1C | SHR | 3 | shift, val | val >> shift | logische Rechtsverschiebung | |
| 1D | SAR | 3 | shift, val | val >> shift | arithmetische Rechtsverschiebung | |
| 1E-1F | ungültig | |||||
| 20 | KECCAK256 | A2 (opens in a new tab) | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | ungültig | |||||
| 30 | ADDRESS | 2 | . | address(this) | Adresse des ausführenden Vertrags | |
| 31 | BALANCE | A5 (opens in a new tab) | addr | addr.balance | Guthaben, in Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | Adresse, von der die Transaktion ausging | |
| 33 | CALLER | 2 | . | msg.sender | Adresse des msg-Absenders | |
| 34 | CALLVALUE | 2 | . | msg.value | msg-Wert, in Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | Wort aus msg-Daten an Index idx lesen | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | Länge der msg-Daten, in Bytes | |
| 37 | CALLDATACOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | msg-Daten kopieren |
| 38 | CODESIZE | 2 | . | len(this.code) | Länge des Codes des ausführenden Vertrags, in Bytes | |
| 39 | CODECOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | Bytecode des ausführenden Vertrags kopieren |
| 3A | GASPRICE | 2 | . | tx.gasprice | Gaspreis der Transaktion, in Wei pro Einheit Gas ** (opens in a new tab) | |
| 3B | EXTCODESIZE | A5 (opens in a new tab) | addr | len(addr.code) | Größe des Codes an der Adresse, in Bytes | |
| 3C | EXTCODECOPY | A4 (opens in a new tab) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | Code von addr kopieren |
| 3D | RETURNDATASIZE | 2 | . | size | Größe der zurückgegebenen Daten vom letzten externen Aufruf, in Bytes | |
| 3E | RETURNDATACOPY | A3 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | zurückgegebene Daten vom letzten externen Aufruf kopieren |
| 3F | EXTCODEHASH | A5 (opens in a new tab) | addr | hash | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | . | block.coinbase | Adresse des Block-Vorschlagenden des aktuellen Blocks | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | Zeitstempel des aktuellen Blocks | |
| 43 | NUMBER | 2 | . | block.number | Nummer des aktuellen Blocks | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | Zufalls-Beacon | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | Gaslimit des aktuellen Blocks | |
| 46 | CHAINID | 2 | . | chain_id | aktuelle Chain-ID (opens in a new tab) auf den Stack legen | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | Guthaben des ausführenden Vertrags, in Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | Grundgebühr des aktuellen Blocks | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (opens in a new tab) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | Blob-Grundgebühr des aktuellen Blocks (EIP-7516 (opens in a new tab)) | |
| 4B-4F | ungültig | |||||
| 50 | POP | 2 | _anon | . | Element von der Spitze des Stacks entfernen und verwerfen | |
| 51 | MLOAD | 3* (opens in a new tab) | ost | mem[ost:ost+32] | Wort aus dem Speicher an Offset ost lesen | |
| 52 | MSTORE | 3* (opens in a new tab) | ost, val | . | mem[ost:ost+32] := val | ein Wort in den Speicher schreiben |
| 53 | MSTORE8 | 3* (opens in a new tab) | ost, val | . | mem[ost] := val && 0xFF | ein einzelnes Byte in den Speicher schreiben |
| 54 | SLOAD | A6 (opens in a new tab) | key | storage[key] | Wort aus dem Storage lesen | |
| 55 | SSTORE | A7 (opens in a new tab) | key, val | . | storage[key] := val | Wort in den Storage schreiben |
| 56 | JUMP | 8 | dst | . | $pc := dst markiert, dass pc nur zugewiesen wird, wenn dst ein gültiges jumpdest ist | |
| 57 | JUMPI | 10 | dst, condition | . | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | . | $pc | Programmierzähler (Program Counter) | |
| 59 | MSIZE | 2 | . | len(mem) | Größe des Speichers im aktuellen Ausführungskontext, in Bytes | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | gültiges Sprungziel markieren | ein gültiges Sprungziel, zum Beispiel ein Sprungziel, das nicht innerhalb der Push-Daten liegt | ||
| 5C | TLOAD | 100 | key | tstorage[key] | Wort aus dem transienten Storage lesen (EIP-1153 (opens in a new tab)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | Wort in den transienten Storage schreiben (EIP-1153 (opens in a new tab)) |
| 5E | MCOPY | 3+3*words+A0 (opens in a new tab) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | Speicher von einem Bereich in einen anderen kopieren (EIP-5656 (opens in a new tab)) |
| 5F | PUSH0 | 2 | . | uint8 | den konstanten Wert 0 auf den Stack legen | |
| 60 | PUSH1 | 3 | . | uint8 | 1-Byte-Wert auf den Stack legen | |
| 61 | PUSH2 | 3 | . | uint16 | 2-Byte-Wert auf den Stack legen | |
| 62 | PUSH3 | 3 | . | uint24 | 3-Byte-Wert auf den Stack legen | |
| 63 | PUSH4 | 3 | . | uint32 | 4-Byte-Wert auf den Stack legen | |
| 64 | PUSH5 | 3 | . | uint40 | 5-Byte-Wert auf den Stack legen | |
| 65 | PUSH6 | 3 | . | uint48 | 6-Byte-Wert auf den Stack legen | |
| 66 | PUSH7 | 3 | . | uint56 | 7-Byte-Wert auf den Stack legen | |
| 67 | PUSH8 | 3 | . | uint64 | 8-Byte-Wert auf den Stack legen | |
| 68 | PUSH9 | 3 | . | uint72 | 9-Byte-Wert auf den Stack legen | |
| 69 | PUSH10 | 3 | . | uint80 | 10-Byte-Wert auf den Stack legen | |
| 6A | PUSH11 | 3 | . | uint88 | 11-Byte-Wert auf den Stack legen | |
| 6B | PUSH12 | 3 | . | uint96 | 12-Byte-Wert auf den Stack legen | |
| 6C | PUSH13 | 3 | . | uint104 | 13-Byte-Wert auf den Stack legen | |
| 6D | PUSH14 | 3 | . | uint112 | 14-Byte-Wert auf den Stack legen | |
| 6E | PUSH15 | 3 | . | uint120 | 15-Byte-Wert auf den Stack legen | |
| 6F | PUSH16 | 3 | . | uint128 | 16-Byte-Wert auf den Stack legen | |
| 70 | PUSH17 | 3 | . | uint136 | 17-Byte-Wert auf den Stack legen | |
| 71 | PUSH18 | 3 | . | uint144 | 18-Byte-Wert auf den Stack legen | |
| 72 | PUSH19 | 3 | . | uint152 | 19-Byte-Wert auf den Stack legen | |
| 73 | PUSH20 | 3 | . | uint160 | 20-Byte-Wert auf den Stack legen | |
| 74 | PUSH21 | 3 | . | uint168 | 21-Byte-Wert auf den Stack legen | |
| 75 | PUSH22 | 3 | . | uint176 | 22-Byte-Wert auf den Stack legen | |
| 76 | PUSH23 | 3 | . | uint184 | 23-Byte-Wert auf den Stack legen | |
| 77 | PUSH24 | 3 | . | uint192 | 24-Byte-Wert auf den Stack legen | |
| 78 | PUSH25 | 3 | . | uint200 | 25-Byte-Wert auf den Stack legen | |
| 79 | PUSH26 | 3 | . | uint208 | 26-Byte-Wert auf den Stack legen | |
| 7A | PUSH27 | 3 | . | uint216 | 27-Byte-Wert auf den Stack legen | |
| 7B | PUSH28 | 3 | . | uint224 | 28-Byte-Wert auf den Stack legen | |
| 7C | PUSH29 | 3 | . | uint232 | 29-Byte-Wert auf den Stack legen | |
| 7D | PUSH30 | 3 | . | uint240 | 30-Byte-Wert auf den Stack legen | |
| 7E | PUSH31 | 3 | . | uint248 | 31-Byte-Wert auf den Stack legen | |
| 7F | PUSH32 | 3 | . | uint256 | 32-Byte-Wert auf den Stack legen | |
| 80 | DUP1 | 3 | a | a, a | 1. Wert auf dem Stack klonen | |
| 81 | DUP2 | 3 | _, a | a, _, a | 2. Wert auf dem Stack klonen | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | 3. Wert auf dem Stack klonen | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | 4. Wert auf dem Stack klonen | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | 5. Wert auf dem Stack klonen | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | 6. Wert auf dem Stack klonen | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | 7. Wert auf dem Stack klonen | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | 8. Wert auf dem Stack klonen | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | 9. Wert auf dem Stack klonen | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | 10. Wert auf dem Stack klonen | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | 11. Wert auf dem Stack klonen | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | 12. Wert auf dem Stack klonen | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | 13. Wert auf dem Stack klonen | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | 14. Wert auf dem Stack klonen | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | 15. Wert auf dem Stack klonen | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | 16. Wert auf dem Stack klonen | |
| 90 | SWAP1 | 3 | a, b | b, a | ||
| 91 | SWAP2 | 3 | a, _, b | b, _, a | ||
| 92 | SWAP3 | 3 | a, _, _, b | b, _, _, a | ||
| 93 | SWAP4 | 3 | a, _, _, _, b | b, _, _, _, a | ||
| 94 | SWAP5 | 3 | a, ..., b | b, ..., a | ||
| 95 | SWAP6 | 3 | a, ..., b | b, ..., a | ||
| 96 | SWAP7 | 3 | a, ..., b | b, ..., a | ||
| 97 | SWAP8 | 3 | a, ..., b | b, ..., a | ||
| 98 | SWAP9 | 3 | a, ..., b | b, ..., a | ||
| 99 | SWAP10 | 3 | a, ..., b | b, ..., a | ||
| 9A | SWAP11 | 3 | a, ..., b | b, ..., a | ||
| 9B | SWAP12 | 3 | a, ..., b | b, ..., a | ||
| 9C | SWAP13 | 3 | a, ..., b | b, ..., a | ||
| 9D | SWAP14 | 3 | a, ..., b | b, ..., a | ||
| 9E | SWAP15 | 3 | a, ..., b | b, ..., a | ||
| 9F | SWAP16 | 3 | a, ..., b | b, ..., a | ||
| A0 | LOG0 | A8 (opens in a new tab) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (opens in a new tab) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (opens in a new tab) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (opens in a new tab) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | ungültig | |||||
| F0 | CREATE | A9 (opens in a new tab) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (opens in a new tab) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | wie DELEGATECALL, überträgt aber nicht den ursprünglichen msg.sender und msg.value |
| F3 | RETURN | 0* (opens in a new tab) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (opens in a new tab) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | ungültig | |||||
| FA | STATICCALL | AA (opens in a new tab) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | ungültig | |||||
| FD | REVERT | 0* (opens in a new tab) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (opens in a new tab) | als ungültig designierter Opcode - EIP-141 (opens in a new tab) | |||
| FF | SELFDESTRUCT | AB (opens in a new tab) | addr | . | sendet alle ETH an addr; wenn in derselben Transaktion ausgeführt, in der ein Vertrag erstellt wurde, wird der Vertrag zerstört |