رموز التشغيل لـ EVM
هذه نسخة محدثة من صفحة مرجع EVM على wolflo/evm-opcodes (يفتح في علامة تبويب جديدة). مستمدة أيضًا من الورقة الصفراء (يفتح في علامة تبويب جديدة)، وJello Paper (يفتح في علامة تبويب جديدة)، وتنفيذ جو إيثريوم (geth) (يفتح في علامة تبويب جديدة). يُقصد بهذا أن يكون مرجعًا مبسطًا، ولكنه ليس صارمًا بشكل خاص. إذا كنت تريد التأكد من الصحة والوعي بكل حالة استثنائية، فمن المستحسن استخدام Jello Paper أو تنفيذ عميل.
هل تبحث عن مرجع تفاعلي؟ تحقق من evm.codes (يفتح في علامة تبويب جديدة).
للعمليات ذات تكاليف الغاز الديناميكية، راجع gas.md (يفتح في علامة تبويب جديدة).
💡 نصيحة سريعة: لعرض الأسطر بالكامل، استخدم [shift] + scroll للتمرير أفقيًا على سطح المكتب.
| المكدس | الاسم | الغاز | المكدس الأولي | المكدس الناتج | الذاكرة / التخزين | ملاحظات |
|---|---|---|---|---|---|---|
| 00 | STOP | 0 | إيقاف التنفيذ | |||
| 01 | ADD | 3 | a, b | a + b | إضافة (u)int256 بمعيار 2**256 | |
| 02 | MUL | 5 | a, b | a * b | ضرب (u)int256 بمعيار 2**256 | |
| 03 | SUB | 3 | a, b | a - b | طرح (u)int256 بمعيار 2**256 | |
| 04 | DIV | 5 | a, b | a // b | قسمة uint256 | |
| 05 | SDIV | 5 | a, b | a // b | قسمة int256 | |
| 06 | MOD | 5 | a, b | a % b | باقي قسمة uint256 | |
| 07 | SMOD | 5 | a, b | a % b | باقي قسمة int256 | |
| 08 | ADDMOD | 8 | a, b, N | (a + b) % N | إضافة (u)int256 بمعيار N | |
| 09 | MULMOD | 8 | a, b, N | (a * b) % N | ضرب (u)int256 بمعيار N | |
| 0A | EXP | A1 (يفتح في علامة تبويب جديدة) | a, b | a ** b | أس uint256 بمعيار 2**256 | |
| 0B | SIGNEXTEND | 5 | b, x | SIGNEXTEND(x, b) | تمديد الإشارة (يفتح في علامة تبويب جديدة) لـ x من (b+1) بايت إلى 32 بايت | |
| 0C-0F | غير صالح | |||||
| 10 | LT | 3 | a, b | a < b | أصغر من uint256 | |
| 11 | GT | 3 | a, b | a > b | أكبر من uint256 | |
| 12 | SLT | 3 | a, b | a < b | أصغر من int256 | |
| 13 | SGT | 3 | a, b | a > b | أكبر من int256 | |
| 14 | EQ | 3 | a, b | a == b | مساواة (u)int256 | |
| 15 | ISZERO | 3 | a | a == 0 | (u)int256 يساوي صفرًا | |
| 16 | AND | 3 | a, b | a && b | AND على مستوى البت | |
| 17 | OR | 3 | a, b | a || b | OR على مستوى البت | |
| 18 | XOR | 3 | a, b | a ^ b | XOR على مستوى البت | |
| 19 | NOT | 3 | a | ~a | NOT على مستوى البت | |
| 1A | BYTE | 3 | i, x | (x >> (248 - i * 8)) && 0xFF | البايت i من (u)int256 x، من اليسار | |
| 1B | SHL | 3 | shift, val | val << shift | إزاحة لليسار | |
| 1C | SHR | 3 | shift, val | val >> shift | إزاحة منطقية لليمين | |
| 1D | SAR | 3 | shift, val | val >> shift | إزاحة حسابية لليمين | |
| 1E-1F | غير صالح | |||||
| 20 | KECCAK256 | A2 (يفتح في علامة تبويب جديدة) | ost, len | keccak256(mem[ost:ost+len-1]) | keccak256 | |
| 21-2F | غير صالح | |||||
| 30 | ADDRESS | 2 | . | address(this) | عنوان العقد المنفذ | |
| 31 | BALANCE | A5 (يفتح في علامة تبويب جديدة) | addr | addr.balance | الرصيد، بوحدة Wei | |
| 32 | ORIGIN | 2 | . | tx.origin | العنوان الذي أنشأ المعاملة | |
| 33 | CALLER | 2 | . | msg.sender | عنوان مرسل الرسالة | |
| 34 | CALLVALUE | 2 | . | msg.value | قيمة الرسالة، بوحدة Wei | |
| 35 | CALLDATALOAD | 3 | idx | msg.data[idx:idx+32] | قراءة كلمة من بيانات الرسالة عند المؤشر idx | |
| 36 | CALLDATASIZE | 2 | . | len(msg.data) | طول بيانات الرسالة، بالبايت | |
| 37 | CALLDATACOPY | A3 (يفتح في علامة تبويب جديدة) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | نسخ بيانات الرسالة |
| 38 | CODESIZE | 2 | . | len(this.code) | طول رمز العقد المنفذ، بالبايت | |
| 39 | CODECOPY | A3 (يفتح في علامة تبويب جديدة) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | |
| 3A | GASPRICE | 2 | . | tx.gasprice | سعر الغاز للمعاملة، بوحدة Wei لكل وحدة غاز ** (يفتح في علامة تبويب جديدة) | |
| 3B | EXTCODESIZE | A5 (يفتح في علامة تبويب جديدة) | addr | len(addr.code) | حجم الرمز عند addr، بالبايت | |
| 3C | EXTCODECOPY | A4 (يفتح في علامة تبويب جديدة) | addr, dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | نسخ الرمز من addr |
| 3D | RETURNDATASIZE | 2 | . | size | حجم البيانات المرجعة من آخر استدعاء خارجي، بالبايت | |
| 3E | RETURNDATACOPY | A3 (يفتح في علامة تبويب جديدة) | dstOst, ost, len | . | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | نسخ البيانات المرجعة من آخر استدعاء خارجي |
| 3F | EXTCODEHASH | A5 (يفتح في علامة تبويب جديدة) | addr | hash | hash = addr.exists ? keccak256(addr.code) : 0 | |
| 40 | BLOCKHASH | 20 | blockNum | blockHash(blockNum) | ||
| 41 | COINBASE | 2 | . | block.coinbase | عنوان مُقترِح الكتلة الحالية | |
| 42 | TIMESTAMP | 2 | . | block.timestamp | الطابع الزمني للكتلة الحالية | |
| 43 | NUMBER | 2 | . | block.number | رقم الكتلة الحالية | |
| 44 | PREVRANDAO | 2 | . | randomness beacon | منارة العشوائية | |
| 45 | GASLIMIT | 2 | . | block.gaslimit | حد الغاز للكتلة الحالية | |
| 46 | CHAINID | 2 | . | chain_id | دفع معرف السلسلة (يفتح في علامة تبويب جديدة) الحالي إلى المكدس | |
| 47 | SELFBALANCE | 5 | . | address(this).balance | رصيد العقد المنفذ، بوحدة Wei | |
| 48 | BASEFEE | 2 | . | block.basefee | الرسم الأساسي للكتلة الحالية | |
| 49 | BLOBHASH | 3 | idx | tx.blob_versioned_hashes[idx] | EIP-4844 (يفتح في علامة تبويب جديدة) | |
| 4A | BLOBBASEFEE | 2 | . | block.blobbasefee | الرسم الأساسي لكتلة البيانات للكتلة الحالية (EIP-7516 (يفتح في علامة تبويب جديدة)) | |
| 4B-4F | غير صالح | |||||
| 50 | POP | 2 | _anon | . | إزالة العنصر من أعلى المكدس وتجاهله | |
| 51 | MLOAD | 3* (يفتح في علامة تبويب جديدة) | ost | mem[ost:ost+32] | قراءة كلمة من الذاكرة عند الإزاحة ost | |
| 52 | MSTORE | 3* (يفتح في علامة تبويب جديدة) | ost, val | . | mem[ost:ost+32] := val | كتابة كلمة في الذاكرة |
| 53 | MSTORE8 | 3* (يفتح في علامة تبويب جديدة) | ost, val | . | mem[ost] := val && 0xFF | كتابة بايت واحد في الذاكرة |
| 54 | SLOAD | A6 (يفتح في علامة تبويب جديدة) | key | storage[key] | قراءة كلمة من التخزين | |
| 55 | SSTORE | A7 (يفتح في علامة تبويب جديدة) | key, val | . | storage[key] := val | كتابة كلمة في التخزين |
| 56 | JUMP | 8 | dst | . | $pc := dst يشير إلى أنه يتم تعيين pc فقط إذا كان dst وجهة قفز صالحة | |
| 57 | JUMPI | 10 | dst, condition | . | $pc := condition ? dst : $pc + 1 | |
| 58 | PC | 2 | . | $pc | عداد البرنامج | |
| 59 | MSIZE | 2 | . | len(mem) | حجم الذاكرة في سياق التنفيذ الحالي، بالبايت | |
| 5A | GAS | 2 | . | gasRemaining | ||
| 5B | JUMPDEST | 1 | تحديد وجهة قفز صالحة | وجهة قفز صالحة، على سبيل المثال وجهة قفز ليست داخل بيانات الدفع | ||
| 5C | TLOAD | 100 | key | tstorage[key] | قراءة كلمة من التخزين العابر (EIP-1153 (يفتح في علامة تبويب جديدة)) | |
| 5D | TSTORE | 100 | key, val | . | tstorage[key] := val | كتابة كلمة في التخزين العابر (EIP-1153 (يفتح في علامة تبويب جديدة)) |
| 5E | MCOPY | 3+3*words+A0 (يفتح في علامة تبويب جديدة) | dstOst, ost, len | . | mem[dstOst] := mem[ost:ost+len] | نسخ الذاكرة من منطقة إلى أخرى (EIP-5656 (يفتح في علامة تبويب جديدة)) |
| 5F | PUSH0 | 2 | . | uint8 | دفع القيمة الثابتة 0 إلى المكدس | |
| 60 | PUSH1 | 3 | . | uint8 | دفع قيمة من 1 بايت إلى المكدس | |
| 61 | PUSH2 | 3 | . | uint16 | دفع قيمة من 2 بايت إلى المكدس | |
| 62 | PUSH3 | 3 | . | uint24 | دفع قيمة من 3 بايت إلى المكدس | |
| 63 | PUSH4 | 3 | . | uint32 | دفع قيمة من 4 بايت إلى المكدس | |
| 64 | PUSH5 | 3 | . | uint40 | دفع قيمة من 5 بايت إلى المكدس | |
| 65 | PUSH6 | 3 | . | uint48 | دفع قيمة من 6 بايت إلى المكدس | |
| 66 | PUSH7 | 3 | . | uint56 | دفع قيمة من 7 بايت إلى المكدس | |
| 67 | PUSH8 | 3 | . | uint64 | دفع قيمة من 8 بايت إلى المكدس | |
| 68 | PUSH9 | 3 | . | uint72 | دفع قيمة من 9 بايت إلى المكدس | |
| 69 | PUSH10 | 3 | . | uint80 | دفع قيمة من 10 بايت إلى المكدس | |
| 6A | PUSH11 | 3 | . | uint88 | دفع قيمة من 11 بايت إلى المكدس | |
| 6B | PUSH12 | 3 | . | uint96 | دفع قيمة من 12 بايت إلى المكدس | |
| 6C | PUSH13 | 3 | . | uint104 | دفع قيمة من 13 بايت إلى المكدس | |
| 6D | PUSH14 | 3 | . | uint112 | دفع قيمة من 14 بايت إلى المكدس | |
| 6E | PUSH15 | 3 | . | uint120 | دفع قيمة من 15 بايت إلى المكدس | |
| 6F | PUSH16 | 3 | . | uint128 | دفع قيمة من 16 بايت إلى المكدس | |
| 70 | PUSH17 | 3 | . | uint136 | دفع قيمة من 17 بايت إلى المكدس | |
| 71 | PUSH18 | 3 | . | uint144 | دفع قيمة من 18 بايت إلى المكدس | |
| 72 | PUSH19 | 3 | . | uint152 | دفع قيمة من 19 بايت إلى المكدس | |
| 73 | PUSH20 | 3 | . | uint160 | دفع قيمة من 20 بايت إلى المكدس | |
| 74 | PUSH21 | 3 | . | uint168 | دفع قيمة من 21 بايت إلى المكدس | |
| 75 | PUSH22 | 3 | . | uint176 | دفع قيمة من 22 بايت إلى المكدس | |
| 76 | PUSH23 | 3 | . | uint184 | دفع قيمة من 23 بايت إلى المكدس | |
| 77 | PUSH24 | 3 | . | uint192 | دفع قيمة من 24 بايت إلى المكدس | |
| 78 | PUSH25 | 3 | . | uint200 | دفع قيمة من 25 بايت إلى المكدس | |
| 79 | PUSH26 | 3 | . | uint208 | دفع قيمة من 26 بايت إلى المكدس | |
| 7A | PUSH27 | 3 | . | uint216 | دفع قيمة من 27 بايت إلى المكدس | |
| 7B | PUSH28 | 3 | . | uint224 | دفع قيمة من 28 بايت إلى المكدس | |
| 7C | PUSH29 | 3 | . | uint232 | دفع قيمة من 29 بايت إلى المكدس | |
| 7D | PUSH30 | 3 | . | uint240 | دفع قيمة من 30 بايت إلى المكدس | |
| 7E | PUSH31 | 3 | . | uint248 | دفع قيمة من 31 بايت إلى المكدس | |
| 7F | PUSH32 | 3 | . | uint256 | دفع قيمة من 32 بايت إلى المكدس | |
| 80 | DUP1 | 3 | a | a, a | استنساخ القيمة الأولى في المكدس | |
| 81 | DUP2 | 3 | _, a | a, _, a | استنساخ القيمة الثانية في المكدس | |
| 82 | DUP3 | 3 | _, _, a | a, _, _, a | استنساخ القيمة الثالثة في المكدس | |
| 83 | DUP4 | 3 | _, _, _, a | a, _, _, _, a | استنساخ القيمة الرابعة في المكدس | |
| 84 | DUP5 | 3 | ..., a | a, ..., a | استنساخ القيمة الخامسة في المكدس | |
| 85 | DUP6 | 3 | ..., a | a, ..., a | استنساخ القيمة السادسة في المكدس | |
| 86 | DUP7 | 3 | ..., a | a, ..., a | استنساخ القيمة السابعة في المكدس | |
| 87 | DUP8 | 3 | ..., a | a, ..., a | استنساخ القيمة الثامنة في المكدس | |
| 88 | DUP9 | 3 | ..., a | a, ..., a | استنساخ القيمة التاسعة في المكدس | |
| 89 | DUP10 | 3 | ..., a | a, ..., a | استنساخ القيمة العاشرة في المكدس | |
| 8A | DUP11 | 3 | ..., a | a, ..., a | استنساخ القيمة الحادية عشرة في المكدس | |
| 8B | DUP12 | 3 | ..., a | a, ..., a | استنساخ القيمة الثانية عشرة في المكدس | |
| 8C | DUP13 | 3 | ..., a | a, ..., a | استنساخ القيمة الثالثة عشرة في المكدس | |
| 8D | DUP14 | 3 | ..., a | a, ..., a | استنساخ القيمة الرابعة عشرة في المكدس | |
| 8E | DUP15 | 3 | ..., a | a, ..., a | استنساخ القيمة الخامسة عشرة في المكدس | |
| 8F | DUP16 | 3 | ..., a | a, ..., a | استنساخ القيمة السادسة عشرة في المكدس | |
| 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 (يفتح في علامة تبويب جديدة) | ost, len | . | LOG0(memory[ost:ost+len-1]) | |
| A1 | LOG1 | A8 (يفتح في علامة تبويب جديدة) | ost, len, topic0 | . | LOG1(memory[ost:ost+len-1], topic0) | |
| A2 | LOG2 | A8 (يفتح في علامة تبويب جديدة) | ost, len, topic0, topic1 | . | LOG2(memory[ost:ost+len-1], topic0, topic1) | |
| A3 | LOG3 | A8 (يفتح في علامة تبويب جديدة) | ost, len, topic0, topic1, topic2 | . | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | |
| A4 | LOG4 | A8 (يفتح في علامة تبويب جديدة) | ost, len, topic0, topic1, topic2, topic3 | . | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | |
| A5-EF | غير صالح | |||||
| F0 | CREATE | A9 (يفتح في علامة تبويب جديدة) | val, ost, len | addr | addr = keccak256(rlp([address(this), this.nonce])) | |
| F1 | CALL | AA (يفتح في علامة تبويب جديدة) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F2 | CALLCODE | AA (يفتح في علامة تبويب جديدة) | gas, addr, val, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] = returndata | نفس DELEGATECALL، ولكنه لا ينشر msg.sender و msg.value الأصليين |
| F3 | RETURN | 0* (يفتح في علامة تبويب جديدة) | ost, len | . | return mem[ost:ost+len-1] | |
| F4 | DELEGATECALL | AA (يفتح في علامة تبويب جديدة) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| F5 | CREATE2 | A9 (يفتح في علامة تبويب جديدة) | val, ost, len, salt | addr | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | |
| F6-F9 | غير صالح | |||||
| FA | STATICCALL | AA (يفتح في علامة تبويب جديدة) | gas, addr, argOst, argLen, retOst, retLen | success | mem[retOst:retOst+retLen-1] := returndata | |
| FB-FC | غير صالح | |||||
| FD | REVERT | 0* (يفتح في علامة تبويب جديدة) | ost, len | . | revert(mem[ost:ost+len-1]) | |
| FE | INVALID | AF (يفتح في علامة تبويب جديدة) | رمز تشغيل غير صالح مخصص - EIP-141 (يفتح في علامة تبويب جديدة) | |||
| FF | SELFDESTRUCT | AB (يفتح في علامة تبويب جديدة) | addr | . | يرسل كل ETH إلى addr؛ إذا تم تنفيذه في نفس المعاملة التي تم فيها إنشاء عقد، فإنه يدمر العقد |