المصدر: مجتمع 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>








