في مقالة اليوم، سنلقي نظرة على حدث Solidity ، والمعروفة أكثر باسم السجلات في Ethereum وEVM. سنرى كيفية استخدامها وتعريفاتها وكيفية استخدام تجزئة موضوع الحدث والتوقيعات لتصفية السجلات، بالإضافة إلى بعض النصائح حول متى يجب عليك استخدامها.
سنغطي أيضًا فحص-الأحداث-التفاعلات هذا النمط المعروف يتم تطبيقه تقليديًا على إعادة إدخال متغيرات الحالة، لكننا سنرى لماذا يجب أيضًا تطبيق هذا النمط على إثارة الأحداث والمخاطر المحتملة ونقاط الضعف الأمنية المعنية.
كيفية تحديد الأحداث في Solidity؟
يمكن استخدامهeventتحدد الكلمة الرئيسية الأحداث في Solidity كما هو موضح أدناه.
يُرجى ملاحظة أنه فقط بعد الإصدار 0.8.15 من Solidity.selector يمكن للأعضاء فقط استخدامه.
إذا نظرت إلى أي سجلات صادرة عن blockchain، فستجد أن السجلات مفهرس الموضوع0 (أولاً) الإدخال المقابل تجزئة موضوع الحدث. نظرًا لأن المواضيع عبارة عن محتوى قابل للبحث عبر السجلات، فيمكننا التصفية باستخدام تجزئة موضوع الحدث:
ابحث عن حدث معين ضمن عقد ذكي في عنوان محدد.
في المنطقة ابحث في جميع العقود الموجودة على blockchain لحدث معين.
نا كما سنرى أدناه، مجهولمجهول الأحداث هي استثناءات لهذه القاعدة. الكلمة الرئيسية مجهولة تجعلها غير قابلة للبحث وبالتالي استخدم المصطلح "مجهول".
وبناءً على هذه الحقيقة، يمكننا أيضًا استنتاج أن Solidity أبسط حدث محدد، بدون أي معلمات، مثل الحدث المحدد أعلاهBulbReplacedأوSwitchedON , سيستخدم LOG1 كود التشغيل أسفل الغطاء. قم بتشغيل المواضيع في السجل لأن الأحداث نفسها قابلة للبحث.
يمكن إضافة المزيد من السمات، وسيتم استخدام مواضيع أخرى< code>LOG2, LOG3, LOG4وLOG5< /code>، طالما تم وضع علامة على هذه المعلمات على أنها مفهرسة code>. دعونا نلقي نظرة على معلمات الفهرس في القسم التالي.
معلمات الحدث ومعلمات الفهرس
يمكن للأحداث قبول معلمات من أي نوع، بما في ذلك أنواع القيم (uintN, bytesN< /span>, bool, العنوان...),الهيكل، التعداد ومحدد من قبل المستخدم نوع القيمة.
بناءً على بحثي أثناء كتابة هذه المقالة، الأنواع الوحيدة غير المسموح بها هي نوع الوظائف الداخلية. يُسمح بأنواع الوظائف الخارجية، لكن أنواع الوظائف الداخلية غير مسموح بها. على سبيل المثال، لن يتم ترجمة التعليمات البرمجية التالية.
إذا تم الإعلان عن الحدث كـ span>مجهول، في عقد ABI، حدث"مجهول"سيتم وضع علامة على الحقل على أنه صحيح.
إحدى مزايا الأحداث المجهولة هي أنها تجعل عقدك أرخص في النشر، وأيضًا أرخص من حيث الغاز عند تشغيله.
حالة الاستخدام الجيد للأحداث المجهولة هي للعقود التي تحتوي على حدث واحد فقط. من المنطقي الاستماع إلى كافة الأحداث في العقد لأن هذا الحدث واحد فقط هو الذي سيظهر في سجل الأحداث. الاشتراك باسمه غير ذي صلة حيث يتم تحديد حدث واحد فقط ليتم إصداره بواسطة العقد. لذلك، يمكنك تعريف الأحداث على أنها مجهولة والاشتراك في كافة سجلات الأحداث من العقد والتأكد من أنها جميعها نفس الحدث.
شاهد أمثلة للأحداث المجهولة المستخدمة في مكتبات التعليمات البرمجية الشائعة، مثل DappHub عقد DS-Note [7].
يمكننا كما رأينا في مقتطف الشفرة، نظرًا لإعلان الحدث مجهولاً، فإن هذا يجعل من الممكن تحديد معلمة رابعة "مفهرسة".
يرجى ملاحظة أنه نظرًا لأن الأحداث المجهولة لا تحتوي على تجزئة موضوع bytes32، فإن الأحداث المجهولة لا يدعم .selector العضو.
< span style="font-size: 18px;">من الممكن تشغيل الأحداث في التجميع باستخدام logN code تعليمات >، والتي تتوافق مع كود التشغيل في مجموعة تعليمات EVM.
لتشغيل حدث في التجميع، يجب عليك تضمين كافة البيانات التي سيتم إرسالها بواسطة الحدث مخزنة في موقع محدد في الذاكرة.
بمجرد حصولك على البيانات التي سيتم إرسالها بواسطة الحدث المخزن في الذاكرة، يمكنك يمكن بعد ذلك تحديد المعلمات التالية لتوجيه logN:
p = موقع الذاكرة الذي سيتم بدء جلب البيانات منه. هذا في الأساس مؤشر ذاكرة، أو "إزاحة" أو "فهرس ذاكرة"، اعتمادًا على ما تسميه.
s = تريد البدء من النقطة p الحدث عدد البايتات المنبعثة في .
جميع المعلمات الأخرىt1, t2, t3 و t4 code> هي جميع معلمات الأحداث التي تريد أن تكون قابلة للفهرسة. يرجى ملاحظة أن هناك شيئين مهمين هنا: 1) يجب أن تكون هذه المعلمات هي نفس المعلمات المحددة في تعريف الحدث الخاص بك بنفس الترتيب، 2) يجب وضع هذه المعلمات في الذاكرة للحصول على البيانات.
يوضح مقتطف الكود أدناه كيفية القيام بذلك هذا في الجمعية.
<span ) 10px 10px / 40px بدون تكرار ;height: 30px; العرض: 100%;الهامش السفلي: -7px;نصف القطر الحدودي: 5px;'>الحدث exampleEventAsm(bytes32 tokenId); وظيفة _emitEventAssembly(bytes32 tokenId) داخلي{ freeMemoryPointer := mload(0x40) mstore(freeMemoryPointer, subjectHash) mstore(add(freeMemoryPointer, 32), tokenId) < br> // قم بإصدار حدث `ExampleEventAsm` بموضوعين log2( freeMemoryPointer , // `p` = بدء الإزاحة في الذاكرة 64, // `s` = عدد البايتات في الذاكرة من `p` المراد تضمينها في بيانات الحدث< br> topicHash, // موضوع لتصفية الحدث نفسه tokenId // المعلمة الأولى المفهرسة )
تكلفة الغاز للحدث
جميع أكواد التشغيل المسجلة (LOG0, السجل1, السجل2, LOG3, LOG4) الجميع بحاجة إلى استهلاك الغاز. كلما زاد عدد المعلمات (الموضوعات) لديهم، زاد استهلاكهم للغاز.
بالإضافة إلى ذلك ، يمكن لعوامل أخرى مثل الفهرسة أو حجم البيانات أن تتسبب أيضًا في استهلاك انبعاث الحدث لمزيد من الغاز.
التحقق من الوضع التفاعلي للحدث
التحقق صالح - الوضع التفاعلي [9] يعمل أيضًا مع الأحداث.
إحدى طرق اكتشاف هذه الأنماط هي استخدام أداة التحليل الثابت Remix .
يمكن أيضًا اكتشاف هذا النمط بواسطة Slither. عند تشغيل الانزلاق ضد عقد يطلق حدثًا بعد مكالمة خارجية، سوف تحصل على اكتشاف يقول "حدث إعادة الدخول".
لذا، بالنسبة للتطبيقات اللامركزية، يعد الترتيب أمرًا مهمًا حتى تتمكن من الحصول عليه بشكل صحيح تعرف على الحدث الذي تم إصداره أولاً، وبعده، وأخيرًا. وهذا مهم بشكل خاص في حالة المكالمات المتكررة أو إعادة الدخول. إذا تم تشغيل الحدث بعد مكالمة خارجية، وقام هذا الاستدعاء الخارجي بإجراء مكالمة إعادة دخول، فحينئذٍ:
الحدث الأول المنبعث هو الحدث الذي يقع بعد اكتمال مكالمة إعادة الدخول الثانية.
الحدث الثاني المنبعث هو حدث المعاملة الأولية تنبعث لاحقا.
فهم هذا أيضًا يجعل من الممكن A يتم توفير مسار تدقيق واضح خارج السلسلة لمراقبة مكالمات العقود. يمكنك معرفة الوظائف التي تم استدعاؤها أولاً وأخيرًا، والترتيب الذي تم به تشغيل كل روتين أثناء تنفيذ الصفقة.
هذه الثغرة الأمنية المحتملة موجودة أيضًا في Trail of Bits against Liquity[ 11] تم العثور عليها والإبلاغ عنها في تدقيق العقود الذكية.
متى يجب تشغيل الحدث؟
قد تكون هناك عدة مواقف في عقدك حيث قد يكون إطلاق حدث ما مهمًا ومفيدًا.
متى عندما يقوم المستخدمون والعناوين المقيدة بتنفيذ إجراءات معينة (على سبيل المثال: المالك أو مسؤول العقد). يتضمن ذلك، على سبيل المثال، نقل الملكية (العنوان) الشائع الوظيفة التي لا يمكن استدعاؤها إلا من قبل المالك لتغيير مالك العقد.
قم بتغيير بعض المتغيرات الرئيسية أو المعلمات الحسابية المسؤولة عن المنطق الأساسي للعقد. هذا مهم بشكل خاص في سياق بروتوكولات DeFi.
تم توضيح المزيد من المعلومات حول هذه المواقف في وثائق كاشف Slither [12].
تم توضيح ذلك أيضًا في تقرير تدقيق Trail على LooksRare.
مراقبة العقود المنشورة في الإنتاج للكشف عن الحالات الشاذة.
عرض تفاصيل 0xprotocol[13] للمشكلات المتعلقة بالأمان المحيطة بالحادث.
المرجع
استخدام حدث مجهول وثائق مفقودة للغرض (اعرف السبب)<[14]
< span style="text-align: left;">[مزايا الأحداث المجهولة]
Preview
احصل على فهم أوسع لصناعة العملات المشفرة من خلال التقارير الإعلامية، وشارك في مناقشات متعمقة مع المؤلفين والقراء الآخرين ذوي التفكير المماثل. مرحبًا بك للانضمام إلينا في مجتمع Coinlive المتنامي:https://t.me/CoinliveSG