Zum Hauptinhalt springen
Change page

Opcodes für die EVM

Dies ist eine aktualisierte Version der EVM-Referenzseite unter wolflo/evm-opcodes (öffnet in einem neuen Tab). Sie stützt sich auch auf das Yellow Paper (öffnet in einem neuen Tab), das Jello Paper (öffnet in einem neuen Tab) und die geth (öffnet in einem neuen Tab)-Implementierung. Dies soll eine zugängliche Referenz sein, ist aber nicht besonders streng. 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 (öffnet in einem neuen Tab) an.

Für Operationen mit dynamischen Gaskosten siehe gas.md (öffnet in einem neuen Tab).

💡 Kurzer Tipp: Um ganze Zeilen anzuzeigen, verwenden Sie auf dem Desktop [Shift] + Scrollen, um horizontal zu scrollen.

StackNameGasAnfänglicher StackResultierender StackMem / StorageHinweise
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 (öffnet in einem neuen Tab)a, ba ** buint256-Potenzierung modulo 2**256
0BSIGNEXTEND5b, xSIGNEXTEND(x, b)Vorzeichenerweiterung (öffnet in einem neuen 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 XOR
19NOT3a~abitweises NICHT
1ABYTE3i, x(x >> (248 - i * 8)) && 0xFFi-tes Byte von (u)int256 x, von links
1BSHL3shift, valval << shiftLinksverschiebung
1CSHR3shift, valval >> shiftlogische Rechtsverschiebung
1DSAR3shift, valval >> shiftarithmetische Rechtsverschiebung
1E-1Fungültig
20KECCAK256A2 (öffnet in einem neuen Tab)ost, lenkeccak256(mem[ost:ost+len-1])keccak256
21-2Fungültig
30ADDRESS2.address(this)Adresse des ausführenden Vertrags
31BALANCEA5 (öffnet in einem neuen Tab)addraddr.balanceKontostand, in Wei
32ORIGIN2.tx.originAdresse, von der die Transaktion ausging
33CALLER2.msg.senderAdresse des msg-Absenders
34CALLVALUE2.msg.valuemsg-Wert, in Wei
35CALLDATALOAD3idxmsg.data[idx:idx+32]Wort aus msg-Daten bei Index idx lesen
36CALLDATASIZE2.len(msg.data)Länge der msg-Daten, in Bytes
37CALLDATACOPYA3 (öffnet in einem neuen Tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1]msg-Daten kopieren
38CODESIZE2.len(this.code)Länge des Codes des ausführenden Vertrags, in Bytes
39CODECOPYA3 (öffnet in einem neuen 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 ** (öffnet in einem neuen Tab)
3BEXTCODESIZEA5 (öffnet in einem neuen Tab)addrlen(addr.code)Größe des Codes an der Adresse, in Bytes
3CEXTCODECOPYA4 (öffnet in einem neuen 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 vom letzten externen Aufruf, in Bytes
3ERETURNDATACOPYA3 (öffnet in einem neuen Tab)dstOst, ost, len.mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1]zurückgegebene Daten vom letzten externen Aufruf kopieren
3FEXTCODEHASHA5 (öffnet in einem neuen 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 (öffnet in einem neuen Tab) auf den Stack legen
47SELFBALANCE5.address(this).balanceKontostand des ausführenden Vertrags, in Wei
48BASEFEE2.block.basefeeGrundgebühr des aktuellen Blocks
49BLOBHASH3idxtx.blob_versioned_hashes[idx]EIP-4844 (öffnet in einem neuen Tab)
4ABLOBBASEFEE2.block.blobbasefeeBlob-Grundgebühr des aktuellen Blocks (EIP-7516 (öffnet in einem neuen Tab))
4B-4Fungültig
50POP2_anon.Element von der Spitze des Stacks entfernen und verwerfen
51MLOAD3* (öffnet in einem neuen Tab)ostmem[ost:ost+32]Wort aus dem Speicher bei Offset ost lesen
52MSTORE3* (öffnet in einem neuen Tab)ost, val.mem[ost:ost+32] := valein Wort in den Speicher schreiben
53MSTORE83* (öffnet in einem neuen Tab)ost, val.mem[ost] := val && 0xFFein einzelnes Byte in den Speicher schreiben
54SLOADA6 (öffnet in einem neuen Tab)keystorage[key]Wort aus dem Storage lesen
55SSTOREA7 (öffnet in einem neuen 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.$pcProgrammzähler
59MSIZE2.len(mem)Größe des Speichers im aktuellen Ausführungskontext, in Bytes
5AGAS2.gasRemaining
5BJUMPDEST1gültiges Sprungziel markierenein gültiges Sprungziel, zum Beispiel ein Sprungziel, das nicht innerhalb der Push-Daten liegt
5CTLOAD100keytstorage[key]Wort aus dem transienten Storage lesen (EIP-1153 (öffnet in einem neuen Tab))
5DTSTORE100key, val.tstorage[key] := valWort in den transienten Storage schreiben (EIP-1153 (öffnet in einem neuen Tab))
5EMCOPY3+3*words+A0 (öffnet in einem neuen Tab)dstOst, ost, len.mem[dstOst] := mem[ost:ost+len]Speicher von einem Bereich in einen anderen kopieren (EIP-5656 (öffnet in einem neuen 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 (öffnet in einem neuen Tab)ost, len.LOG0(memory[ost:ost+len-1])
A1LOG1A8 (öffnet in einem neuen Tab)ost, len, topic0.LOG1(memory[ost:ost+len-1], topic0)
A2LOG2A8 (öffnet in einem neuen Tab)ost, len, topic0, topic1.LOG2(memory[ost:ost+len-1], topic0, topic1)
A3LOG3A8 (öffnet in einem neuen Tab)ost, len, topic0, topic1, topic2.LOG3(memory[ost:ost+len-1], topic0, topic1, topic2)
A4LOG4A8 (öffnet in einem neuen Tab)ost, len, topic0, topic1, topic2, topic3.LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3)
A5-EFungültig
F0CREATEA9 (öffnet in einem neuen Tab)val, ost, lenaddraddr = keccak256(rlp([address(this), this.nonce]))
F1CALLAA (öffnet in einem neuen Tab)gas, addr, val, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F2CALLCODEAA (öffnet in einem neuen 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* (öffnet in einem neuen Tab)ost, len.return mem[ost:ost+len-1]
F4DELEGATECALLAA (öffnet in einem neuen Tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
F5CREATE2A9 (öffnet in einem neuen Tab)val, ost, len, saltaddraddr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:]
F6-F9ungültig
FASTATICCALLAA (öffnet in einem neuen Tab)gas, addr, argOst, argLen, retOst, retLensuccessmem[retOst:retOst+retLen-1] := returndata
FB-FCungültig
FDREVERT0* (öffnet in einem neuen Tab)ost, len.revert(mem[ost:ost+len-1])
FEINVALIDAF (öffnet in einem neuen Tab)als ungültig deklarierter Opcode - EIP-141 (öffnet in einem neuen Tab)
FFSELFDESTRUCTAB (öffnet in einem neuen Tab)addr.sendet alle ETH an addr; wenn in derselben Transaktion ausgeführt, in der ein Vertrag erstellt wurde, wird der Vertrag zerstört