Zum Hauptinhalt springen
Change page

Opcodes für die EVM

Übersicht

Dies ist eine aktualisierte Version der EVM-Referenzseite unter wolflo/evm-opcodes (opens in a new tab). Zudem wurden Informationen aus dem Yellow Paper (opens in a new tab), dem Jello Paper (opens in a new tab) und der geth (opens in a new tab)-Implementierung herangezogen. Dies ist als leicht zugängliche Referenz gedacht, 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] + scroll, um auf dem Desktop horizontal zu scrollen.

StackNameGasAnfänglicher StackResultierender StackMem / StorageAnmerkungen
00STOP0Ausführung anhalten
01ADD3a, ba + b(u)int256-Addition modulo 2**256
02MUL5a, ba * b(u)int256-Multiplikation modulo 2**256
03SUB3a, ba - b(u)int256-Subtraktion modulo 2**256
04DIV5a, ba // buint256-Division
05SDIV5a, ba // bint256-Division
06MOD5a, ba % buint256-Modulo
07SMOD5a, ba % bint256-Modulo
08ADDMOD8a, b, N(a + b) % N(u)int256-Addition modulo N
09MULMOD8a, b, N(a * b) % N(u)int256-Multiplikation modulo N
0AEXPA1 (opens in a new tab)a, ba ** buint256-Potenzierung modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)Vorzeichenerweiterung (Sign Extend) (opens in a new tab) von x von (b+1) Bytes auf 32 Bytes
0C-0Fungültig
10LT3a, ba < buint256 kleiner als
11GT3a, ba > buint256 größer als
12SLT3a, ba < bint256 kleiner als
13SGT3a, ba > bint256 größer als
14EQ3a, ba == b(u)int256-Gleichheit
15ISZERO3aa == 0(u)int256 ist null
16AND3a, ba && bbitweises UND
17OR3a, ba || bbitweises ODER
18XOR3a, ba ^ bbitweises exklusives ODER (XOR)
19NOT3a~abitweises NICHT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-tes Byte von (u)int256 x, von links
1BSHL3shift, valval << shiftLinksverschiebung (Shift Left)
1CSHR3shift, valval >> shiftlogische Rechtsverschiebung (Logical Shift Right)
1DSAR3shift, valval >> shiftarithmetische Rechtsverschiebung (Arithmetic Shift Right)
1E-1Fungültig
20KECCAK256A2 (opens in a new tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fungültig
30ADDRESS2.address(this)Adresse des ausführenden Vertrags
31BALANCEA5 (opens in a new tab)addraddr.balanceGuthaben, in Wei
32ORIGIN2.tx.originAdresse, von der die Transaktion ausging
33CALLER2.msg.senderAdresse des msg.sender
34CALLVALUE2.msg.valuemsg.value, in Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]Wort aus msg.data an Index idx lesen
36CALLDATASIZE2.len(msg.data)Länge von msg.data, in Bytes
37CALLDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]msg.data kopieren
38CODESIZE2.len(this.code)Länge des Codes des ausführenden Vertrags, in Bytes
39CODECOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1]
3AGASPRICE2.tx.gaspriceGaspreis der Transaktion, in Wei pro Einheit Gas ** (opens in a new tab)
3BEXTCODESIZEA5 (opens in a new tab)addrlen(addr.code)Größe des Codes an der Adresse, in Bytes
3CEXTCODECOPYA4 (opens in a new tab)addr, dstOst, ost, len.mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1]Code von addr kopieren
3DRETURNDATASIZE2.sizeGröße der zurückgegebenen Daten des letzten externen Aufrufs, in Bytes
3ERETURNDATACOPYA3 (opens in a new tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]zurückgegebene Daten des letzten externen Aufrufs kopieren
3FEXTCODEHASHA5 (opens in a new tab)addrhashhash = addr.exists ? keccak256(addr.code) : 0
40BLOCKHASH20blockNumblockHash(blockNum)
41COINBASE2.block.coinbaseAdresse des Proposers des aktuellen Blocks
42TIMESTAMP2.block.timestampZeitstempel des aktuellen Blocks
43NUMBER2.block.numberNummer des aktuellen Blocks
44PREVRANDAO2.randomness beaconZufälligkeits-Beacon
45GASLIMIT2.block.gaslimitGaslimit des aktuellen Blocks
46CHAINID2.chain_idaktuelle Chain-ID (opens in a new tab) auf den Stack legen
47SELFBALANCE5.address(this).balanceGuthaben des ausführenden Vertrags, in Wei
48BASEFEE2.block.basefeeGrundgebühr des aktuellen Blocks
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (opens in a new tab)
4ABLOBBASEFEE2.block.blobbasefeeBlob-Grundgebühr des aktuellen Blocks (EIP-7516 (opens in a new tab))
4B-4Fungültig
50POP2_anon.Element von der Spitze des Stacks entfernen und verwerfen
51MLOAD3* (opens in a new tab)ostmem[ost:ost+32]Wort aus dem Memory an Offset ost lesen
52MSTORE3* (opens in a new tab)ost, val.mem[ost:ost+32] := valein Wort in den Memory schreiben
53MSTORE83* (opens in a new tab)ost, val.mem[ost] := val && 0xFFein einzelnes Byte in den Memory schreiben
54SLOADA6 (opens in a new tab)keystorage[key]Wort aus dem Storage lesen
55SSTOREA7 (opens in a new tab)key, val.storage[key] := valWort in den Storage schreiben
56JUMP8dst.$pc := dst markiert, dass pc nur zugewiesen wird, wenn dst ein gültiges jumpdest ist
57JUMPI10dst, condition.$pc := condition ? dst : $pc + 1
58PC2.$pcProgrammierzähler (Program Counter)
59MSIZE2.len(mem)Größe des Memorys im aktuellen Ausführungskontext, in Bytes
5AGAS2.gasRemaining
5BJUMPDEST1gültiges Sprungziel markierenein gültiges Sprungziel, zum Beispiel ein Sprungziel, das sich nicht innerhalb der Push-Daten befindet
5CTLOAD100keytstorage[key]Wort aus dem transienten Storage lesen (EIP-1153 (opens in a new tab))
5DTSTORE100key, val.tstorage[key] := valWort in den transienten Storage schreiben (EIP-1153 (opens in a new tab))
5EMCOPY3+3*words+A0 (opens in a new tab)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]Memory von einem Bereich in einen anderen kopieren (EIP-5656 (opens in a new tab))
5FPUSH02.uint8den konstanten Wert 0 auf den Stack legen
60PUSH13.uint81-Byte-Wert auf den Stack legen
61PUSH23.uint162-Byte-Wert auf den Stack legen
62PUSH33.uint243-Byte-Wert auf den Stack legen
63PUSH43.uint324-Byte-Wert auf den Stack legen
64PUSH53.uint405-Byte-Wert auf den Stack legen
65PUSH63.uint486-Byte-Wert auf den Stack legen
66PUSH73.uint567-Byte-Wert auf den Stack legen
67PUSH83.uint648-Byte-Wert auf den Stack legen
68PUSH93.uint729-Byte-Wert auf den Stack legen
69PUSH103.uint8010-Byte-Wert auf den Stack legen
6APUSH113.uint8811-Byte-Wert auf den Stack legen
6BPUSH123.uint9612-Byte-Wert auf den Stack legen
6CPUSH133.uint10413-Byte-Wert auf den Stack legen
6DPUSH143.uint11214-Byte-Wert auf den Stack legen
6EPUSH153.uint12015-Byte-Wert auf den Stack legen
6FPUSH163.uint12816-Byte-Wert auf den Stack legen
70PUSH173.uint13617-Byte-Wert auf den Stack legen
71PUSH183.uint14418-Byte-Wert auf den Stack legen
72PUSH193.uint15219-Byte-Wert auf den Stack legen
73PUSH203.uint16020-Byte-Wert auf den Stack legen
74PUSH213.uint16821-Byte-Wert auf den Stack legen
75PUSH223.uint17622-Byte-Wert auf den Stack legen
76PUSH233.uint18423-Byte-Wert auf den Stack legen
77PUSH243.uint19224-Byte-Wert auf den Stack legen
78PUSH253.uint20025-Byte-Wert auf den Stack legen
79PUSH263.uint20826-Byte-Wert auf den Stack legen
7APUSH273.uint21627-Byte-Wert auf den Stack legen
7BPUSH283.uint22428-Byte-Wert auf den Stack legen
7CPUSH293.uint23229-Byte-Wert auf den Stack legen
7DPUSH303.uint24030-Byte-Wert auf den Stack legen
7EPUSH313.uint24831-Byte-Wert auf den Stack legen
7FPUSH323.uint25632-Byte-Wert auf den Stack legen
80DUP13aa, a1. Wert auf dem Stack klonen
81DUP23_, aa, _, a2. Wert auf dem Stack klonen
82DUP33_, _, aa, _, _, a3. Wert auf dem Stack klonen
83DUP43_, _, _, aa, _, _, _, a4. Wert auf dem Stack klonen
84DUP53..., aa, ..., a5. Wert auf dem Stack klonen
85DUP63..., aa, ..., a6. Wert auf dem Stack klonen
86DUP73..., aa, ..., a7. Wert auf dem Stack klonen
87DUP83..., aa, ..., a8. Wert auf dem Stack klonen
88DUP93..., aa, ..., a9. Wert auf dem Stack klonen
89DUP103..., aa, ..., a10. Wert auf dem Stack klonen
8ADUP113..., aa, ..., a11. Wert auf dem Stack klonen
8BDUP123..., aa, ..., a12. Wert auf dem Stack klonen
8CDUP133..., aa, ..., a13. Wert auf dem Stack klonen
8DDUP143..., aa, ..., a14. Wert auf dem Stack klonen
8EDUP153..., aa, ..., a15. Wert auf dem Stack klonen
8FDUP163..., aa, ..., a16. Wert auf dem Stack klonen
90SWAP13a, bb, a
91SWAP23a, _, bb, _, a
92SWAP33a, _, _, bb, _, _, a
93SWAP43a, _, _, _, bb, _, _, _, a
94SWAP53a, ..., bb, ..., a
95SWAP63a, ..., bb, ..., a
96SWAP73a, ..., bb, ..., a
97SWAP83a, ..., bb, ..., a
98SWAP93a, ..., bb, ..., a
99SWAP103a, ..., bb, ..., a
9ASWAP113a, ..., bb, ..., a
9BSWAP123a, ..., bb, ..., a
9CSWAP133a, ..., bb, ..., a
9DSWAP143a, ..., bb, ..., a
9ESWAP153a, ..., bb, ..., a
9FSWAP163a, ..., bb, ..., a
A0LOG0A8 (opens in a new tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (opens in a new tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (opens in a new tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (opens in a new tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (opens in a new tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFungültig
F0CREATEA9 (opens in a new tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (opens in a new tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] = returndatawie DELEGATECALL, gibt aber nicht den ursprünglichen msg.sender und msg.value weiter
F3RETURN0* (opens in a new tab)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (opens in a new tab)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9ungültig
FASTATICCALLAA (opens in a new tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCungültig
FDREVERT0* (opens in a new tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (opens in a new tab)als ungültig deklarierter Opcode - EIP-141 (opens in a new tab)
FFSELFDESTRUCTAB (opens in a new tab)addr.sendet alle ETH an addr; wenn in derselben Transaktion ausgeführt, in der ein Vertrag erstellt wurde, zerstört es den Vertrag