
المصدر: مجتمع Dengchain
في مقال اليوم ، سننظر في الصلابةحدثيطلق عليه في Ethereum أكثر شيوعًا و EVMسجلاتجوهرسنرى كيفية استخدامها ، وتعريفاتهم ، وكيفية استخدام موضوع الحدث والتوقيع لتصفية السجل ، وبعض الاقتراحات حول متى.
سنقوم أيضًا بتغطية التفتيش-حدث-وضع التفاعل ، يتم تطبيق هذا النموذج الشهير تقليديًا على إعادة صياغة متغيرات الدولة ، لكننا سنرى لماذا يجب تطبيق هذا النموذج أيضًا على إحداث أحداث ومخاطر محتملة ومواطن أمنية.
كيف تحدد الأحداث في صلابة؟
تكون متاحةحدث
تحدد الكلمة الرئيسية الحدث في صلابة ، كما هو موضح أدناه.
interface ilight {< br/> event switchedon () ؛يمكنك تمرير اسم العقد من خلال وصول محدود كامل ، يليه المتابعةثم ، ثم
للوصول إلى الحدث من عقد آخر مع اسم الحدث ، كما هو موضح أدناه:
ust dress user)
توقيع الحدث هو:
ust dress user)
موضوع الحدث هو:
bytes32 topichash = uccess .
يرجى ملاحظة أنه بعد الصلابة فقط v0.8.15 ، سوف الحادث.selector
يمكن للأعضاء استخدامه.
إذا قمت بالتحقق من أي سجل blockchain ، فستجد فهرس السجل0
(الأول) الغرض يتوافق مع موضوع الحدث.نظرًا لأن الموضوع هو المحتوى الذي يمكن البحث فيه من خلال السجل ، يمكنناتصفية مع موضوع الحدث:
-
ابحث عن أحداث محددة في العقد الذكي لعنوان معين.
-
ابحث عن أحداث محددة في جميع العقود على blockchain.
سوف نراها أكثر أدناه ،مجهول
حدث مجهول هو استثناء هذه القاعدة.مجهول
الكلمات الرئيسية تجعلها غير قادرة على البحث ، لذا استخدم المصطلح"مجهول"جوهر
بناءً على هذه الحقيقة ، يمكننا أيضًا أن نستنتج أن أبسط حدث محدد في الصلابة لا يحتوي على معلمات ، مثل الحدث المحدد أعلاهbulbreplaced
أوSwitchedon
، سيتم استخدامه في الأسفلlog1
يثير رمز التشغيل السمة في السجل لأن الحادث نفسه قابل للبحث.
يمكنك إضافة المزيد من الموضوعات ، وسيتم استخدام موضوعات أخرىlog2
،log3
،log4
وlog5
طالما تم وضع علامة على هذه المعلماتمفهرسة
جوهردعنا نلقي نظرة على معلمة الفهرس في القسم التالي.
معلمات الحدث ومعلمات الفهرس
يمكن أن يقبل الحدث أي نوع من المعلمات ، بما في ذلك نوع القيمة (uintn
،Bytesn
،بول
،عنوان
...) ،،بنية
،التعداد
ونوع القيمة المحدد من قبل المستخدم.
وفقًا لبحثي في هذه المقالة ، فإن النوع الوحيد غير المسموح به هو نوع الوظيفة الداخلية.يُسمح بنوع الوظيفة الخارجية ، لكن نوع الوظيفة الداخلية غير مسموح به.على سبيل المثال ، لن يتم تجميع الكود التالي.
// spdx- Sidefier: غير مرخص
Pragma Salidity ^0.8.0 ؛ >
إذا كان بيان الحدثمجهول
في العقد ABI ، الحادث متاح"مجهول"
سيتم تمييز الحقل باسمحقيقي
جوهر
<الشكل النمط = "النص": المركز ؛ ">
IMG https://github.com/ethereum/solidity/issues/13086
ميزة مجهولة هي أنها تجعل عقدك أرخص وأرخص ، والغاز أرخص عند تشغيله.
حالة جيدة من الحدث المجهول هو عقد مع حدث واحد فقط.جميع الأحداث في عقد التفاوض مفيدة ، لأن هذا الحادث فقط سيظهر في سجل الأحداث.الاشتراك في اسمه غير ذي صلة ، لأنه يتم تعريف حدث واحد فقط لإصدار العقد.لذلك ، يمكنك تحديد الأحداث المجهولة ، والاشتراك في جميع سجلات الأحداث من العقد ، وتأكيد أنها نفس الأحداث.
تحقق من استخدام الاستخدام المجهول في مكتبة الرموز الشائعة ، مثل عقد DS-Note في DapppHub[7]وسط.
<الشكل النمط = "النص": المركز ؛ ">
IMGرمز المصدر[8]
يمكننا أن نرى في جزء الكود أعلاه أنه نظرًا لأن بيان الحدث مجهول ، فإن هذا يمكن أن يحدد المعلمة "المفهرسة" الرابعة.
يرجى ملاحظة أنه نظرًا لأن الحدث المجهول لا يحتوي على موضوع BYTES32 ، فإن الحدث المجهول لا يدعم.selector
عضو.
استخدم رمز التشغيل السجل لتشغيل الأحداث في التجميع
<الشكل النمط = "النص": المركز ؛ ">
img https://docs.soliditlylang.org/en/v0.8.19/yul.html#evm-dialect
من الممكن تشغيل حدث في التجميع ، والاستخدامlogn
التعليمات ، التعليمات تتوافق مع رمز التشغيل المركز بواسطة تعليمات EVM.
لتشغيل حدث في التجميع ، يجب عليك تخزين جميع البيانات الصادرة عن الحادث فيذاكرة
موقف محدد.
بمجرد قيامك بتخزين البيانات من الحدث في الذاكرة ، وبعد ذلك يمكنك تحديد المعلمات التالية إلى تعليمات logn:
-
P = احصل على موضع ذاكرة البيانات منه.في الأساس ، هذا مؤشر ذاكرة ، أو "إزاحة" أو "فهرس الذاكرة" ، اعتمادًا على كيفية تسميته.
-
S = تريد عدد البايتات الصادرة من P في الحدث.
-
جميع المعلمات الأخرىT1
إلى جانبT2
إلى جانبT3
وT4
إنها معلمات الحدث التي تريد فهرستها.يرجى ملاحظة أن هناك شيئين مهمين هنا: 1) يجب أن تكون هذه المعلمات هي نفس المعلمات المحددة في نفس ترتيب تعريف الأحداث الخاصة بك ، 2) يجب وضع هذه المعلمات في الذاكرة للحصول على البيانات.
يوضح جزء الكود التالي كيفية تنفيذ هذه العملية في التجميع.
bytes32 topichash = مثال على ذلك /> log2 (
freemomorypointer ، /// `p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p` p" " p` p` p` p` p` = بدء الإزاحة في الذاكرة
64 ، // `s` = عدد البايتات في الذاكرة من p` لتضمين في بيانات الحدث
موضوع تصفية الحدث It Self
tokenid // 1st parameter
)
}
}
تكلفة الغاز للحدث
<الشكل النمط = "النص": المركز ؛ ">
جميع رمز تشغيل السجلات (log0
إلى جانبlog1
إلى جانبlog2
إلى جانبlog3
إلى جانبlog4
) تحتاج إلى استهلاك الغاز.كلما زاد عدد المعلمات (الموضوعات) ، زادت الغاز الذي يستهلكونه.
<الشكل النمط = "النص": المركز ؛ ">
بالإضافة إلى ذلك ، يمكن أن تتسبب عوامل أخرى مثل الفهارس أو البيانات في استهلاك الحدث المزيد من الغاز.
تحقق -وضع -وضع نشط
وضع الفحص الفعال التفاعلي[9]كما أنها مناسبة للحوادث.
تتمثل إحدى الطرق لاكتشاف هذه الأوضاع في استخدام أداة التحليل الثابت Remix.
يمكن أيضًا اكتشاف هذا النموذج بواسطة Slither.عندما يقوم العقد بتشغيل عقد مع مكالمة خارجية ، ستحصل على اكتشاف لمطالبة "حدث إعادة".
لذلك ، بالنسبة إلى DAPP ، يكون الأمر مهمًا للغاية ، بحيث يمكنك التحقق بشكل صحيح من الحادث أولاً ، التالي ، وأصدره أخيرًا.هذا مهم بشكل خاص عندما تكون مكالمات متكررة أو إعادة إدخالها.إذا تم تشغيل الحدث بعد مكالمات خارجية ، وتم إجراء هذه المكالمة الخارجية من مكالمة متكررة ، ثم:
-
كان الحادث الأول هو المرة الثانية بعد اكتمال المكالمة.
-
تم إصدار الحدث الثاني بعد المعاملة الأولية.
-
عندما يقوم المستخدمون المقيدون والعناوين بتنفيذ عمليات معينة (على سبيل المثال ، المالك أو مسؤول العقد).وهذا يشمل مثل تلك الشعبية
نقل الملكية (العنوان)
الوظيفة ، لا يمكن استدعاء هذه الوظيفة إلا من قبل المالك لتغيير مالك العقد. -
تغيير بعض المتغيرات الرئيسية أو المعلمات الحسابية ، والتي هي المسؤولة عن المنطق الأساسي للعقد.إنه مهم بشكل خاص في خلفية بروتوكول Defi.
-
عقود المراقبة المنتشرة في الإنتاج للكشف عن تشوهات.
-
المستند المفقود لغرض استخدام الحدث المجهول (تعرف لماذا)
[14] -
[مزايا حدث مجهول]
يتيح فهم هذا أيضًا تتبع التدقيق الواضح تحت السلسلة لمراقبة مكالمات العقد.يمكنك معرفة الوظائف التي يتم استدعاؤها أولاً وأخيراً ، وترتيب تشغيل كل روتين أثناء تنفيذ المعاملة.
وثيقة الكاشف النازع[10]-قيمة ومحللات فيبر الثابتة.
هذا الضعف المحتمل على درب البتات[11]وجدت والتقرير في مراجعة العقود الذكية.
<الشكل النمط = "النص": المركز ؛ ">
<الشكل النمط = "النص": المركز ؛ ">
متى يجب تشغيل الحادث؟
قد يكون هناك عدة حالات في عقدك قد تكون مهمة ومفيدة لإطلاق الأحداث.
<الشكل النمط = "النص": المركز ؛ ">
<الشكل النمط = "النص": المركز ؛ ">
وثيقة الكاشف النازع[12]صف المزيد من المعلومات حول هذه الحالات.
هذا موصوف أيضًا في تقرير تدقيق الممرات عن Looksrare.
<الشكل النمط = "النص": المركز ؛ ">
<الشكل النمط = "النص": المركز ؛ ">
عرض 0xprotocol[13]تفاصيل لفهم القضايا المتعلقة بالسلامة المتعلقة بالحادث.
الرجوع إلى
<-style-type>