لقد قمت مؤخرا بإعادة تعلم الصلابة ، ودمج التفاصيل ، وكتابة “Solidity Minimalist Primer” للمبتدئين لاستخدامها (يمكن لرجال البرمجة العثور على برنامج تعليمي آخر) ، يتم تحديثه 1-3 مرات في الأسبوع.
جميع التعليمات البرمجية والبرامج التعليمية مفتوحة المصدر في github: github.com / AmazingAng / WTFSolidity
عندما نسمي دالة عقد ذكي ، فإن أول 4 بايت من الرمز الثانوي المرسل هي المحدد. في هذا الحديث ، سنغطي ماهية المحدد وكيفية استخدامه.
msg.data هو متغير عام في Solidity بقيمة بيانات المكالمة الكاملة (الرمز الثانوي الذي يستدعي الدالة).
في التعليمة البرمجية التالية ، يمكننا استخدام حدث السجل لإخراج بيانات المكالمة التي تستدعي وظيفة mint:
عندما يتم 0x2c44b726ADF1963cA47Af88B284C06f30380fC78 المعلمة ، تكون بيانات استدعاء الإخراج
يمكن تقسيم هذا الرمز الثانوي الفوضوي إلى جزأين:
في الواقع ، تخبر calldata العقد الذكي بالوظيفة التي أريد الاتصال بها وما هي المعلمات.
يتم تعريف المحدد على أنه أول 4 بايت من تجزئة توقيع الدالة ، فما هو توقيع الدالة؟
في الواقع ، في المحاضرة 21 ، قدمنا بإيجاز توقيع الوظيفة ، وهو “اسم الوظيفة (نوع المعلمة المفصولة بفواصل)”. على سبيل المثال ، توقيع الدالة للنعناع في الكود أعلاه هو “mint (address)”. في العقود الذكية ، يكون للوظائف المختلفة توقيعات وظيفية مختلفة ، حتى نتمكن من تحديد الوظيفة التي يجب استدعاؤها من خلال توقيع الوظيفة.
لاحظ أنه في توقيع الدالة ، يجب كتابة uint و int ك uint256 و int256.
دعنا نكتب دالة للتحقق من أن محدد وظيفة النعناع هو 0x6a627842. يمكنك تشغيل الوظيفة التالية ورؤية النتيجة.
يمكننا استخدام المحدد لاستدعاء الوظيفة المستهدفة. على سبيل المثال ، إذا كنت أرغب في استدعاء وظيفة mint ، فأنا بحاجة فقط إلى استخدام abi.encodeWithSelector لتشفير المحدد ومعلمات وظيفة mint وتمريرها إلى وظيفة الاتصال:
في السجل ، يمكننا أن نرى أن وظيفة mint يتم استدعاؤها بنجاح ويتم إخراج حدث Log.
في هذا الحديث ، قدمنا ما هو محدد الوظيفة ، وكيفية ارتباطه ب msg.data ، وتوقيعات الوظائف ، وكيفية استخدامه لاستدعاء وظيفة موضوعية.