تخطٍ إلى المحتوى الرئيسي

فهم مواصفات آلة الإيثيريوم الافتراضية (EVM) في الورقة الصفراء

evm
المستوى المتوسط
qbzzt
15 مايو 2022
17 دقيقة قراءة

الورقة الصفراء (opens in a new tab) هي المواصفات الرسمية لإيثيريوم. باستثناء ما تم تعديله من خلال عملية مقترحات تحسين إيثريوم (EIP)، فهي تحتوي على الوصف الدقيق لكيفية عمل كل شيء. إنها مكتوبة كورقة رياضية، والتي تتضمن مصطلحات قد لا يجدها المبرمجون مألوفة. في هذه الورقة، ستتعلم كيفية قراءتها، وبالتالي الأوراق الرياضية الأخرى ذات الصلة.

أي ورقة صفراء؟

مثل كل شيء آخر تقريبًا في إيثريوم، تتطور الورقة الصفراء بمرور الوقت. للتمكن من الإشارة إلى إصدار معين، قمت بتحميل الإصدار الحالي وقت الكتابة. ستشير أرقام الأقسام والصفحات والمعادلات التي أستخدمها إلى ذلك الإصدار. من الجيد إبقاؤها مفتوحة في نافذة مختلفة أثناء قراءة هذا المستند.

لماذا آلة الإيثيريوم الافتراضية (EVM)؟

كُتبت الورقة الصفراء الأصلية في بداية تطوير إيثريوم. تصف آلية الإجماع الأصلية القائمة على إثبات العمل والتي تم استخدامها في الأصل لتأمين الشبكة. ومع ذلك، أوقفت إيثريوم إثبات العمل وبدأت في استخدام الإجماع القائم على إثبات الحصة في سبتمبر 2022. سيركز هذا البرنامج التعليمي على أجزاء الورقة الصفراء التي تحدد آلة إيثريوم الافتراضية. لم تتغير آلة الإيثيريوم الافتراضية (EVM) مع الانتقال إلى إثبات الحصة (باستثناء القيمة المرجعة لرمز التشغيل DIFFICULTY).

9 نموذج التنفيذ

يتضمن هذا القسم (صفحة 12-14) معظم تعريف آلة الإيثيريوم الافتراضية (EVM).

يتضمن مصطلح حالة النظام كل ما تحتاج إلى معرفته عن النظام لتشغيله. في الحاسوب العادي، هذا يعني الذاكرة، ومحتوى المسجلات، وما إلى ذلك.

إن آلة تورنغ (opens in a new tab) هي نموذج حسابي. في الأساس، هي نسخة مبسطة من الحاسوب، والتي ثبت أن لديها نفس القدرة على إجراء العمليات الحسابية التي يمكن للحاسوب العادي إجراؤها (كل ما يمكن للحاسوب حسابه يمكن لآلة تورنغ حسابه والعكس صحيح). يسهل هذا النموذج إثبات النظريات المختلفة حول ما هو قابل للحساب وما هو غير قابل للحساب.

يعني مصطلح Turing-complete (opens in a new tab) الحاسوب الذي يمكنه إجراء نفس العمليات الحسابية مثل آلة تورنغ. يمكن أن تدخل آلات تورنغ في حلقات لا نهائية، ولا يمكن لآلة الإيثيريوم الافتراضية (EVM) ذلك لأنها ستنفد من الغاز، لذا فهي شبه كاملة تورنغيًا فقط.

9.1 الأساسيات

يقدم هذا القسم أساسيات آلة الإيثيريوم الافتراضية (EVM) وكيفية مقارنتها بالنماذج الحسابية الأخرى.

إن آلة المكدس (opens in a new tab) هي حاسوب يخزن البيانات الوسيطة ليس في المسجلات، ولكن في مكدس (opens in a new tab). هذه هي البنية المفضلة للآلات الافتراضية لأنه من السهل تنفيذها مما يعني أن الأخطاء والثغرات الأمنية أقل احتمالًا. تنقسم الذاكرة في المكدس إلى كلمات بحجم 256 بت. تم اختيار هذا لأنه مناسب لعمليات التشفير الأساسية لإيثيريوم مثل تجزئة (هاش) Keccak-256 وحسابات المنحنى الإهليلجي. الحد الأقصى لحجم المكدس هو 1024 عنصرًا (1024 × 256 بت). عندما يتم تنفيذ رموز التشغيل، فإنها عادة ما تحصل على معلمات من المكدس. هناك رموز تشغيل خاصة بإعادة تنظيم العناصر في المكدس مثل POP (إزالة عنصر من أعلى المكدس)، وDUP_N (تكرار العنصر N في المكدس)، وما إلى ذلك.

تمتلك آلة الإيثيريوم الافتراضية (EVM) أيضًا مساحة متطايرة تسمى الذاكرة والتي تستخدم لتخزين البيانات أثناء التنفيذ. تنظم هذه الذاكرة في كلمات بحجم 32 بايت. يتم تهيئة جميع مواقع الذاكرة إلى الصفر. إذا قمت بتنفيذ نص يول (opens in a new tab) البرمجي هذا لإضافة كلمة إلى الذاكرة، فسيملأ 32 بايتًا من الذاكرة عن طريق حشو المساحة الفارغة في الكلمة بالأصفار، أي أنه ينشئ كلمة واحدة - مع أصفار في المواقع من 0 إلى 29، و0x60 في الموقع 30، و0xA7 في الموقع 31.

1mstore(0, 0x60A7)

mstore هو واحد من ثلاثة رموز تشغيل توفرها آلة الإيثيريوم الافتراضية (EVM) للتفاعل مع الذاكرة - فهو يقوم بتحميل كلمة في الذاكرة. الاثنان الآخران هما mstore8 الذي يقوم بتحميل بايت واحد في الذاكرة، وmload الذي ينقل كلمة من الذاكرة إلى المكدس.

لدى آلة الإيثيريوم الافتراضية (EVM) أيضًا نموذج تخزين منفصل غير متطاير يتم الحفاظ عليه كجزء من حالة النظام - يتم تنظيم هذه الذاكرة في مصفوفات كلمات (بدلاً من مصفوفات البايتات القابلة للعنونة بالكلمات في المكدس). هذا التخزين هو المكان الذي تحتفظ فيه العقود بالبيانات الثابتة - يمكن للعقد التفاعل فقط مع التخزين الخاص به. يتم تنظيم التخزين في تعيينات المفتاح-القيمة.

على الرغم من أنه لم يتم ذكره في هذا القسم من الورقة الصفراء، فمن المفيد أيضًا معرفة أن هناك نوعًا رابعًا من الذاكرة. بيانات الاستدعاء (Calldata) هي ذاكرة للقراءة فقط قابلة للعنونة بالبايت تُستخدم لتخزين القيمة التي تم تمريرها مع معلمة data الخاصة بالمعاملة. تحتوي آلة الإيثيريوم الافتراضية (EVM) على رموز تشغيل محددة لإدارة calldata. يقوم calldatasize بإرجاع حجم البيانات. يقوم calldataload بتحميل البيانات في المكدس. يقوم calldatacopy بنسخ البيانات إلى الذاكرة.

تخزن بنية فون نيومان (opens in a new tab) القياسية النص البرمجي والبيانات في نفس الذاكرة. لا تتبع آلة الإيثيريوم الافتراضية (EVM) هذا المعيار لأسباب أمنية - فمشاركة الذاكرة المتطايرة تجعل من الممكن تغيير النص البرمجي للبرنامج. بدلاً من ذلك، يتم حفظ النص البرمجي في التخزين.

هناك حالتان فقط يتم فيهما تنفيذ النص البرمجي من الذاكرة:

  • عندما يقوم عقد بإنشاء عقد آخر (باستخدام CREATE (opens in a new tab) أو CREATE2 (opens in a new tab))، يأتي النص البرمجي لمنشئ العقد من الذاكرة.
  • أثناء إنشاء أي عقد، يتم تشغيل النص البرمجي للمُنشئ ثم يُرجع النص البرمجي للعقد الفعلي، من الذاكرة أيضًا.

يعني مصطلح التنفيذ الاستثنائي استثناءً يؤدي إلى توقف تنفيذ العقد الحالي.

9.2 نظرة عامة على الرسوم

يشرح هذا القسم كيفية حساب رسوم الغاز. هناك ثلاث تكاليف:

تكلفة رمز التشغيل

التكلفة المتأصلة لرمز التشغيل المحدد. للحصول على هذه القيمة، ابحث عن مجموعة التكلفة لرمز التشغيل في الملحق H (صفحة 28، تحت المعادلة (327))، وابحث عن مجموعة التكلفة في المعادلة (324). يمنحك هذا دالة تكلفة، والتي تستخدم في معظم الحالات معلمات من الملحق G (صفحة 27).

على سبيل المثال، رمز التشغيل CALLDATACOPY (opens in a new tab) هو عضو في المجموعة Wcopy. تكلفة رمز التشغيل لتلك المجموعة هي Gverylow+Gcopy×⌈μs[2]÷32⌉. بالنظر إلى الملحق G، نرى أن كلا الثابتين هما 3، مما يعطينا 3+3×⌈μs[2]÷32⌉.

لا يزال يتعين علينا فك شفرة التعبير ⌈μs[2]÷32⌉. الجزء الخارجي، ⌈ <value> ⌉ هو دالة السقف، وهي دالة تُعطى قيمة وتعيد أصغر عدد صحيح لا يزال ليس أصغر من القيمة. على سبيل المثال، ⌈2.5⌉ = ⌈3⌉ = 3. الجزء الداخلي هو μs[2]÷32. بالنظر إلى القسم 3 (الاصطلاحات) في الصفحة 3، μ هي حالة الآلة. يتم تعريف حالة الآلة في القسم 9.4.1 في الصفحة 13. وفقًا لذلك القسم، فإن أحد معلمات حالة الآلة هو s للمكدس. بجمع كل ذلك معًا، يبدو أن μs[2] هو الموقع رقم 2 في المكدس. بالنظر إلى رمز التشغيل (opens in a new tab)، فإن الموقع رقم 2 في المكدس هو حجم البيانات بالبايت. بالنظر إلى رموز التشغيل الأخرى في المجموعة Wcopy، وCODECOPY (opens in a new tab) وRETURNDATACOPY (opens in a new tab)، فإنها تحتوي أيضًا على حجم من البيانات في نفس الموقع. إذًا ⌈μs[2]÷32⌉ هو عدد الكلمات بحجم 32 بايت اللازمة لتخزين البيانات التي يتم نسخها. بجمع كل شيء معًا، التكلفة المتأصلة لـ CALLDATACOPY (opens in a new tab) هي 3 غاز بالإضافة إلى 3 لكل كلمة من البيانات التي يتم نسخها.

تكلفة التشغيل

تكلفة تشغيل النص البرمجي الذي نستدعيه.

تكلفة توسيع الذاكرة

تكلفة توسيع الذاكرة (إذا لزم الأمر).

في المعادلة 324، تكتب هذه القيمة على النحو التالي Cmemi')-Cmemi). بالنظر إلى القسم 9.4.1 مرة أخرى، نرى أن μi هو عدد الكلمات في الذاكرة. إذًا μi هو عدد الكلمات في الذاكرة قبل رمز التشغيل و_μi'_ هو عدد الكلمات في الذاكرة بعد رمز التشغيل.

تعرَّف الدالة Cmem في المعادلة 326: Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋. ⌊x⌋ هي دالة الأرضية، وهي دالة تُعطى قيمة وتعيد أكبر عدد صحيح لا يزال ليس أكبر من القيمة. على سبيل المثال، ⌊2.5⌋ = ⌊2⌋ = 2. عندما تكون a < √512، فإن a2 < 512، وتكون نتيجة دالة الأرضية صفرًا. لذلك بالنسبة لأول 22 كلمة (704 بايت)، ترتفع التكلفة خطيًا مع عدد كلمات الذاكرة المطلوبة. بعد هذه النقطة، يكون ⌊a2 ÷ 512⌋ موجبًا. عندما تكون الذاكرة المطلوبة عالية بما يكفي، تتناسب تكلفة الغاز مع مربع كمية الذاكرة.

ملاحظة أن هذه العوامل تؤثر فقط على تكلفة الغاز المتأصلة - فهي لا تأخذ في الحسبان سوق الرسوم أو الإكراميات لبرامج المدققين التي تحدد المبلغ الذي يطلب من المستخدم النهائي دفعه - هذه مجرد التكلفة الأولية لتشغيل عملية معينة على آلة الإيثيريوم الافتراضية (EVM).

اقرأ المزيد عن الغاز.

9.3 بيئة التنفيذ

بيئة التنفيذ هي مجموعة، I، تتضمن معلومات ليست جزءًا من حالة البلوك تشين أو آلة الإيثيريوم الافتراضية (EVM).

Parameterرمز التشغيل للوصول إلى البياناتنص سوليديتي البرمجي للوصول إلى البيانات
IaADDRESS (opens in a new tab)address(this)
IoORIGIN (opens in a new tab)tx.origin
IpGASPRICE (opens in a new tab)tx.gasprice
IdCALLDATALOAD (opens in a new tab)، إلخ.msg.data
IsCALLER (opens in a new tab)msg.sender
IvCALLVALUE (opens in a new tab)msg.value
IbCODECOPY (opens in a new tab)address(this).code
IHحقول رأس الكتلة، مثل NUMBER (opens in a new tab) وDIFFICULTY (opens in a new tab)block.number، block.difficulty، إلخ.
Ieعمق مكدس الاستدعاءات للمكالمات بين العقود (بما في ذلك إنشاء العقد)
Iwهل يُسمح لآلة الإيثيريوم الافتراضية (EVM) بتغيير الحالة، أم أنها تعمل بشكل ثابت

هناك عدد قليل من المعلمات الأخرى الضرورية لفهم بقية القسم 9:

Parameterمُعرَّف في القسمالمعنى
σ2 (ص. 2، المعادلة 1)حالة البلوك تشين
g9.3 (ص. 13)الغاز المتبقي
A6.1 (ص. 8)الحالة الفرعية المتراكمة (التغييرات المجدولة عند انتهاء المعاملة)
o9.3 (ص. 13)الناتج - النتيجة المرجعة في حالة المعاملة الداخلية (عندما يستدعي عقد عقدًا آخر) واستدعاءات دوال العرض (عندما تطلب معلومات فقط، لذلك لا توجد حاجة لانتظار معاملة)

9.4 نظرة عامة على التنفيذ

الآن بعد أن أصبحت لدينا كل المعلومات التمهيدية، يمكننا أخيرًا البدء في العمل على كيفية عمل آلة الإيثيريوم الافتراضية (EVM).

تعطينا المعادلات من 137 إلى 142 الشروط الأولية لتشغيل آلة الإيثيريوم الافتراضية (EVM):

الرمزالقيمة الأوليةالمعنى
μggالغاز المتبقي
μpc0عداد البرنامج، عنوان التعليمة التالية المراد تنفيذها
μm(0, 0, ...)الذاكرة، مهيأة إلى كل الأصفار
μi0أعلى موقع ذاكرة مستخدم
μs()المكدس، فارغ في البداية
μoالناتج، مجموعة فارغة حتى نتوقف إما مع بيانات الإرجاع (RETURN (opens in a new tab) أو REVERT (opens in a new tab)) أو بدونها (STOP (opens in a new tab) أو SELFDESTRUCT (opens in a new tab)).

تخبرنا المعادلة 143 بوجود أربع حالات محتملة في كل نقطة زمنية أثناء التنفيذ، وماذا نفعل بها:

  1. Z(σ,μ,A,I). تمثل Z دالة تختبر ما إذا كانت العملية تنشئ انتقال حالة غير صالح (راجع التوقف الاستثنائي). إذا تم تقييمها على أنها True، فإن الحالة الجديدة مطابقة للحالة القديمة (باستثناء حرق الغاز) لأن التغييرات لم يتم تنفيذها.
  2. إذا كان رمز التشغيل الذي يتم تنفيذه هو REVERT (opens in a new tab)، فإن الحالة الجديدة هي نفسها الحالة القديمة، ويتم فقد بعض الغاز.
  3. إذا انتهت سلسلة العمليات، كما هو موضح بواسطة RETURN (opens in a new tab))، يتم تحديث الحالة إلى الحالة الجديدة.
  4. إذا لم نكن في إحدى الحالات النهائية 1-3، فاستمر في التشغيل.

9.4.1 حالة الآلة

يشرح هذا القسم حالة الآلة بمزيد من التفصيل. يحدد أن w هو رمز التشغيل الحالي. إذا كانت μpc أقل من ||Ib||، وهو طول النص البرمجي، فإن ذلك البايت (Ibpc]) هو رمز التشغيل. وإلا، يتم تعريف رمز التشغيل على أنه STOP (opens in a new tab).

نظرًا لأن هذه آلة مكدس (opens in a new tab)، فنحن بحاجة إلى تتبع عدد العناصر التي تم إخراجها (δ) وإدخالها (α) بواسطة كل رمز تشغيل.

9.4.2 التوقف الاستثنائي

يحدد هذا القسم الدالة Z، التي تحدد متى يكون لدينا إنهاء غير طبيعي. هذه دالة منطقية (opens in a new tab)، لذا فهي تستخدم لـ أو المنطقية (opens in a new tab) و لـ و المنطقية (opens in a new tab).

يكون لدينا توقف استثنائي إذا كان أي من هذه الشروط صحيحًا:

  • μg < C(σ,μ,A,I) كما رأينا في القسم 9.2، C هي الدالة التي تحدد تكلفة الغاز. لا يوجد غاز متبقٍ كافٍ لتغطية رمز التشغيل التالي.

  • δw=∅ إذا كان عدد العناصر التي تم إخراجها لرمز تشغيل غير محدد، فإن رمز التشغيل نفسه غير محدد.

  • || μs || < δw تدفق سفلي للمكدس، لا توجد عناصر كافية في المكدس لرمز التشغيل الحالي.

  • w = JUMP ∧ μs[0]∉D(Ib) رمز التشغيل هو JUMP (opens in a new tab) والعنوان ليس JUMPDEST (opens in a new tab). القفزات صالحة فقط عندما يكون الوجهة JUMPDEST (opens in a new tab).

  • w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib) رمز التشغيل هو JUMPI (opens in a new tab)، والشرط صحيح (غير صفري) لذا يجب أن تحدث القفزة، والعنوان ليس JUMPDEST (opens in a new tab). القفزات صالحة فقط عندما يكون الوجهة JUMPDEST (opens in a new tab).

  • w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo || رمز التشغيل هو RETURNDATACOPY (opens in a new tab). في رمز التشغيل هذا، عنصر المكدس μs[1] هو الإزاحة للقراءة منها في مخزن بيانات الإرجاع، وعنصر المكدس μs[2] هو طول البيانات. يحدث هذا الشرط عندما تحاول القراءة بعد نهاية مخزن بيانات الإرجاع. لاحظ أنه لا يوجد شرط مماثل لبيانات الاستدعاء أو للنص البرمجي نفسه. عندما تحاول القراءة بعد نهاية تلك المخازن المؤقتة، تحصل على أصفار فقط.

  • || μs || - δw + αw > 1024

    تجاوز المكدس. إذا أدى تشغيل رمز التشغيل إلى مكدس يزيد عن 1024 عنصرًا، فقم بالإجهاض.

  • ¬Iw ∧ W(w,μ) هل نعمل بشكل ثابت (¬ هو النفي (opens in a new tab) و_Iw_ صحيح عندما يُسمح لنا بتغيير حالة البلوك تشين)؟ إذا كان الأمر كذلك، ونحن نحاول إجراء عملية تغيير الحالة، فلا يمكن أن يحدث ذلك.

    الدالة W(w,μ) معرَّفة لاحقًا في المعادلة 150. W(w,μ) صحيح إذا كان أحد هذه الشروط صحيحًا:

    • w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT} تغير رموز التشغيل هذه الحالة، إما عن طريق إنشاء عقد جديد، أو تخزين قيمة، أو تدمير العقد الحالي.

    • LOG0≤w ∧ w≤LOG4 إذا تم استدعاؤنا بشكل ثابت، فلا يمكننا إصدار إدخالات السجل. جميع رموز تشغيل السجل موجودة في النطاق بين LOG0 (A0) (opens in a new tab) وLOG4 (A4) (opens in a new tab). يحدد الرقم الموجود بعد رمز تشغيل السجل عدد الموضوعات التي يحتوي عليها إدخال السجل.

    • w=CALL ∧ μs[2]≠0 يمكنك استدعاء عقد آخر عندما تكون ثابتًا، ولكن إذا فعلت ذلك، فلا يمكنك تحويل ETH إليه.

  • w = SSTORE ∧ μg ≤ Gcallstipend لا يمكنك تشغيل SSTORE (opens in a new tab) إلا إذا كان لديك أكثر من Gcallstipend (المعروف باسم 2300 في الملحق G) غاز.

9.4.3 صلاحية وجهة القفز

هنا نحدد رسميًا ما هي رموز تشغيل JUMPDEST (opens in a new tab). لا يمكننا فقط البحث عن قيمة البايت 0x5B، لأنها قد تكون داخل PUSH (وبالتالي بيانات وليست رمز تشغيل).

في المعادلة (153) نعرّف دالة N(i,w). المعلمة الأولى، i، هي موقع رمز التشغيل. الثانية، w، هي رمز التشغيل نفسه. إذا كان w∈[PUSH1, PUSH32]، فهذا يعني أن رمز التشغيل هو PUSH (الأقواس المربعة تحدد نطاقًا يتضمن نقاط النهاية). في هذه الحالة، يكون رمز التشغيل التالي عند i+2+(w−PUSH1). بالنسبة إلى PUSH1 (opens in a new tab)، نحتاج إلى التقدم بمقدار اثنين من البايتات (PUSH نفسه وقيمة البايت الواحد)، بالنسبة إلى PUSH2 (opens in a new tab)، نحتاج إلى التقدم بمقدار ثلاثة بايتات لأنها قيمة بايتين، إلخ. جميع رموز تشغيل آلة الإيثيريوم الافتراضية (EVM) الأخرى يبلغ طولها بايت واحد فقط، لذلك في جميع الحالات الأخرى تكون N(i,w)=i+1.

تُستخدم هذه الدالة في المعادلة (152) لتعريف DJ(c,i)، وهي مجموعة (opens in a new tab) من جميع وجهات القفز الصالحة في النص البرمجي c، بدءًا من موقع رمز التشغيل i. هذه الدالة مُعرَّفة بشكل تكراري. إذا كانت i≥||c||، فهذا يعني أننا في نهاية النص البرمجي أو بعده. لن نجد أي وجهات قفز أخرى، لذلك ما عليك سوى إرجاع المجموعة الفارغة.

في جميع الحالات الأخرى، ننظر إلى بقية النص البرمجي بالانتقال إلى رمز التشغيل التالي والحصول على المجموعة التي تبدأ منه. c[i] هو رمز التشغيل الحالي، لذا فإن N(i,c[i]) هو موقع رمز التشغيل التالي. لذلك فإن DJ(c,N(i,c[i])) هي مجموعة وجهات القفز الصالحة التي تبدأ عند رمز التشغيل التالي. إذا لم يكن رمز التشغيل الحالي JUMPDEST، فما عليك سوى إرجاع تلك المجموعة. إذا كان JUMPDEST، فقم بتضمينه في مجموعة النتائج وأعد ذلك.

9.4.4 التوقف العادي

يمكن لدالة التوقف H أن تُرجع ثلاثة أنواع من القيم.

  • إذا لم نكن في رمز تشغيل للتوقف، فقم بإرجاع ، المجموعة الفارغة. حسب الاصطلاح، يتم تفسير هذه القيمة على أنها خطأ منطقي.
  • إذا كان لدينا رمز تشغيل للتوقف لا ينتج مخرجات (إما STOP (opens in a new tab) أو SELFDESTRUCT (opens in a new tab))، فقم بإرجاع تسلسل من البايتات ذات الحجم الصفري كقيمة إرجاع. لاحظ أن هذا مختلف تمامًا عن المجموعة الفارغة. تعني هذه القيمة أن آلة الإيثيريوم الافتراضية (EVM) قد توقفت بالفعل، ولكن لا توجد بيانات إرجاع للقراءة.
  • إذا كان لدينا رمز تشغيل للتوقف ينتج مخرجات (إما RETURN (opens in a new tab) أو REVERT (opens in a new tab))، فقم بإرجاع تسلسل البايتات المحدد بواسطة رمز التشغيل هذا. يتم أخذ هذا التسلسل من الذاكرة، والقيمة الموجودة في أعلى المكدس (μs[0]) هي أول بايت، والقيمة التي تليها (μs[1]) هي الطول.

H.2 مجموعة التعليمات

قبل أن ننتقل إلى القسم الفرعي الأخير من آلة الإيثيريوم الافتراضية (EVM)، 9.5، دعنا نلقي نظرة على التعليمات نفسها. تم تعريفها في الملحق H.2 الذي يبدأ في الصفحة 29. من المتوقع أن يظل أي شيء لم يتم تحديده على أنه يتغير مع رمز التشغيل المحدد كما هو. يتم تحديد المتغيرات التي تتغير بـ <something>′.

على سبيل المثال، دعنا نلقي نظرة على رمز التشغيل ADD (opens in a new tab).

Valueالترميز المساعدδαالوصف
0x01ADD2١عملية الجمع.
μ′s[0] ≡ μs[0] + μs[1]

δ هو عدد القيم التي نخرجها من المكدس. في هذه الحالة اثنان، لأننا نضيف القيمتين العلويتين.

α هو عدد القيم التي ندفعها مرة أخرى. في هذه الحالة واحد، وهو المجموع.

لذا فإن قمة المكدس الجديدة (μ′s[0]) هي مجموع قمة المكدس القديمة (μs[0]) والقيمة القديمة تحتها (μs[1]).

بدلاً من استعراض جميع رموز التشغيل في "قائمة مملة"، يشرح هذا المقال فقط رموز التشغيل التي تقدم شيئًا جديدًا.

Valueالترميز المساعدδαالوصف
0x20KECCAK2562١حساب تجزئة (هاش) Keccak-256.
μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])
μ′i ≡ M(μis[0],μs[1])

هذا هو أول رمز تشغيل يصل إلى الذاكرة (في هذه الحالة، للقراءة فقط). ومع ذلك، قد يتوسع إلى ما بعد الحدود الحالية للذاكرة، لذلك نحتاج إلى تحديث μi. نقوم بذلك باستخدام الدالة M المحددة في المعادلة 328 في الصفحة 29.

Valueالترميز المساعدδαالوصف
0x31BALANCE١١الحصول على رصيد الحساب المحدد.
...

العنوان الذي نحتاج إلى إيجاد رصيده هو μs[0] mod 2160. أعلى المكدس هو العنوان، ولكن نظرًا لأن العناوين تبلغ 160 بت فقط، فإننا نحسب القيمة باقي القسمة (opens in a new tab) 2160.

إذا كانت σ[μs[0] mod 2160] ≠ ∅، فهذا يعني أن هناك معلومات حول هذا العنوان. في هذه الحالة، يكون σ[μs[0] mod 2160]b هو الرصيد لهذا العنوان. إذا كانت σ[μs[0] mod 2160] = ∅، فهذا يعني أن هذا العنوان غير مهيأ وأن الرصيد صفر. يمكنك رؤية قائمة حقول معلومات الحساب في القسم 4.1 في الصفحة 4.

المعادلة الثانية، A'a ≡ Aa ∪ {μs[0] mod 2160}، تتعلق بالفرق في التكلفة بين الوصول إلى التخزين الدافئ (التخزين الذي تم الوصول إليه مؤخرًا ومن المحتمل أن يتم تخزينه مؤقتًا) والتخزين البارد (التخزين الذي لم يتم الوصول إليه ومن المحتمل أن يكون في تخزين أبطأ وأكثر تكلفة لاسترداده). Aa هي قائمة العناوين التي تم الوصول إليها مسبقًا بواسطة المعاملة، والتي يجب أن تكون بالتالي أرخص للوصول إليها، كما هو محدد في القسم 6.1 في الصفحة 8. يمكنك قراءة المزيد حول هذا الموضوع في EIP-2929 (opens in a new tab).

Valueالترميز المساعدδαالوصف
0x8FDUP161617تكرار عنصر المكدس السادس عشر.
μ′s[0] ≡ μs[15]

لاحظ أنه لاستخدام أي عنصر في المكدس، نحتاج إلى إخراجه، مما يعني أننا بحاجة أيضًا إلى إخراج جميع عناصر المكدس فوقه. في حالة DUP<n> (opens in a new tab) وSWAP<n> (opens in a new tab)، هذا يعني الاضطرار إلى إخراج ثم دفع ما يصل إلى ستة عشر قيمة.

9.5 دورة التنفيذ

الآن بعد أن أصبح لدينا كل الأجزاء، يمكننا أخيرًا فهم كيفية توثيق دورة تنفيذ آلة الإيثيريوم الافتراضية (EVM).

تقول المعادلة (155) أنه بالنظر إلى الحالة:

  • σ (حالة البلوك تشين العالمية)
  • μ (حالة آلة الإيثيريوم الافتراضية)
  • A (الحالة الفرعية، التغييرات التي ستحدث عند انتهاء المعاملة)
  • I (بيئة التنفيذ)

الحالة الجديدة هي (σ', μ', A', I').

تحدد المعادلات (156)-(158) المكدس والتغيير فيه بسبب رمز التشغيل (μs). المعادلة (159) هي التغيير في الغاز (μg). المعادلة (160) هي التغيير في عداد البرنامج (μpc). أخيرًا، تحدد المعادلات (161)-(164) أن المعلمات الأخرى تظل كما هي، ما لم يتم تغييرها صراحةً بواسطة رمز التشغيل.

بهذا يتم تعريف آلة الإيثيريوم الافتراضية (EVM) بالكامل.

الخلاصة

الترميز الرياضي دقيق وقد سمح للورقة الصفراء بتحديد كل تفاصيل إيثريوم. ومع ذلك، لديها بعض العيوب:

  • لا يمكن فهمها إلا من قبل البشر، مما يعني أنه يجب كتابة اختبارات الامتثال (opens in a new tab) يدويًا.
  • يفهم المبرمجون النص البرمجي للحاسوب. قد يفهمون أو لا يفهمون الترميز الرياضي.

ربما لهذه الأسباب، كُتبت مواصفات طبقة الإجماع (opens in a new tab) الأحدث بلغة بايثون. هناك مواصفات طبقة التنفيذ بلغة بايثون (opens in a new tab)، لكنها ليست كاملة. إلى أن تتم ترجمة الورقة الصفراء بأكملها أيضًا إلى لغة بايثون أو لغة مشابهة، ستستمر الورقة الصفراء في الخدمة، ومن المفيد أن تكون قادرًا على قراءتها.

آخر تحديث للصفحة: 3 مارس 2026

هل كانت تعليمات الاستخدام هذه مفيدة؟