المتطلبات الأساسية والإعداد
في هذا البرنامج التعليمي، سنستخدم مستودع ورشة العمل كمثال للمشروع:
استيقظ
Bash
نسخ
استيقظاطبع
Bash
نسخ
استيقظ
نسخ
نسخ
نسخ
clickاستيراد wake.ir كما irاستيراد wake.ir.types كما typesمن rich استيرادطباعةمن wake.cli import SolidityNamefrom wake.printers import Printer, printerclass ListContractsPrinter(Printer):def print(self) -> None:pass @printer.command(name="list-contracts")def cli(self) -> None:pass
Python
Copy
فيما يلي وظيفة كل جزء في القالب:
تنفيذ نمط الزائر
يستخدم Wake نمط الزائر لاجتياز شجرة بناء الجملة المجردة (AST) للعقود. يسمح نمط الزائر لبرنامج Wake بالتنقل تلقائيًا في بنية الكود لديك، مما يتيح لك التفاعل مع عناصر محددة مثل تعريفات العقد أو الوظيفة.
لسرد العقود، سنتجاوز طريقة `visit_contract_definition`، والتي سيتم استدعاؤها لكل عقد في قاعدة الكود.أضف هذه الطريقة إلى فئة ListContractsPrinter الخاصة بك: wake print list-contracts
Bash
نسخ
يشغل هذا الأمر الطابعة الخاصة بك ويطبع جميع أسماء العقود الموجودة في مشروعك.
مخرجات مُحسّنة
يعرض التنفيذ الأساسي جميع العقود، بما في ذلك الواجهات والعقود الموروثة.
التنفيذ الأساسي... لنُحسّنه لعرض العقود القابلة للنشر فقط:
def visit_contract_definition(self, node: ir.ContractDefinition) -> None:iflen(node.child_contracts) != 0:returnif node.kind != ir.enums.ContractKind.CONTRACT:returnprint(node.name)
Python
Copy
تحتوي فئة ContractDefinition على خصائص يمكن استخدامها لتصفية النتائج. للاطلاع على مرجع كامل، يُرجى زيارة: https://ackee.xyz/wake/docs/latest/api-reference/ir/declarations/contract-definition/ التنفيذ الكامل: هذه هي النسخة النهائية مع الفصل الأمثل للمهام - جمع البيانات أثناء المسح وعرضها في دالة "print()": الدرس الثاني: تحليل دوال العقد. يُعد فهم الدوال التي يمكن استدعاؤها من الخارج أمرًا بالغ الأهمية للأمان: غالبًا ما تُحدد دوال "السحب" أو "النقل" العامة نطاق الهجوم للعقد. لنُنشئ طابعة لرسم نطاق الهجوم من خلال سرد جميع الدوال العامة والخارجية.
تعيين دالة الطابعة
إنشاء طابعة جديدة:
class ListFunctionsPrinter(Printer): contract: list[ir.ContractDefinition] = []def visit_contract_definition(self, node: ir.ContractDefinition) -> None: `self.contracts.append(node)` (Python) (Copy) (Handling Inheritance Hierarchy) (في طريقة `print()`، نكرر التسلسل الهرمي للوراثة من العقد الأساسي إلى العقد المشتق، ونعرض الدوال القابلة للاستدعاء في كل مستوى:) (def) (get_callable_final_functions(self, contract: ir.ContractDefinition) -> list[ir.FunctionDefinition]:return [\ funny == 0# هل النهائي التنفيذ\وfunc.visibility في[ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]\ ]
بايثون
نسخ
تشغيل دالة الطابعة
نفذ الطابعة للاطلاع على تسلسل الوراثة والقابل للاستدعاء الوظائف:
العقد: السياقالعقد: قابل للتمليكالوظائف:المالكالتنازل عن الملكيةنقل الملكيةالعقد: SingleTokenVaultالوظائف:المنشئالإيداعالسحبالسحب الطارئرصيدتعيين حدود الإيداع--------------------العقد: مثال EIP712الوظائف:المنشئDOMAIN_SEPARATORإرسال التصويت بالتوقيعالحصول على عدد الأصوات--------------------------العقد: السياقالعقد: IERC20العقد: IERC20Metadataالعقد: IERC20Errorsالعقد: ERC20الوظائف:الاسم الرمزالأرقام العشريةإجمالي العرضرصيدتحويلبدلموافقتحويل منالعقد: IERC20Permitالعقد: IERC5267العقد: EIP712الوظائف:نطاق eip712العقد: Noncesالعقد: ERC20Permitالوظائف:تصريحرموز غير محددةDOMAIN_SEPARATORالعقد: رمز التصريحالوظائف:منشئ---------------------------العقد: رمز مميزالوظائف:منشئرموز مينتنقلنقل مع بايتاحصل على الرصيد--------------------------العقد: السياقالعقد: IERC20العقد: IERC20Metadataالعقد: IERC20Errorsالعقد: ERC20الوظائف:الاسمالرمزالكسور العشريةإجمالي العرضرصيدالتحويلالبدلالموافقةالتحويل منالعقد: MockERC20الوظائف:المنشئ--------------------
Bash
نسخ
يوفر لك المخرج خريطة مرئية سريعة للوراثة ونقاط الدخول القابلة للاستدعاء لكل عقد.
يوفر لك المخرج خريطة مرئية سريعة للوراثة ونقاط الدخول القابلة للاستدعاء لكل عقد.
@printer.command(name="list-functions")@click.option("--contract-name", type=str, required=False)def cli(self, contract_name: str | None) -> None: self.contract_name = contract_name
بايثون
نسخ
منطق التصفية الشرطية
print()تتحقق هذه الطريقة الآن من طلب عقد محدد. إذا لم يُحدد اسم عقد، فستُدرج الطابعة جميع العقود القابلة للنشر. إذا تم تحديد اسم، فستُفحص فقط التسلسل الهرمي للعقود المرتبطة بهذا الاسم، حتى لو لم يكن عقدًا ورقيًا.
التنفيذ الكامل مع خيارات واجهة سطر الأوامر
هذه هي الطابعة النهائية مع تصفية العقود الاختيارية. ...
## تحليل جميع العقود القابلة للنشرwakeprint list-functions## التركيز على عقد محددwakeprint list-functions --contract-name Token
Bash
نسخ
لاحق الخطوات
الطابعات تُوفر الخريطة؛ وأجهزة الكشف تكتشف الثغرات الأمنية. معًا، تُحوّل هذه العناصر عملية تدقيق Solidity من روتين يدوي مُرهق إلى عملية مُنظّمة وعميقة. كل طابعة تكتبها تُوضّح الأكواد المعقدة، وتُعزز أمان العقود الذكية التي تُدقّقها. للكشف عن الثغرات الأمنية، يُقدّم Wake نظام كشف مُنفصل يتجاوز التصور ليُحدّد مشاكل الأمان الفعلية. الطابعات تُوفر الخريطة؛ وأجهزة الكشف تكتشف المشاكل. فكّر في إعادة طابعاتك إلى المُجتمع. تكون أدوات التحليل أكثر فعالية عند مُشاركتها، وتُساعد طابعاتك المُخصّصة المُدقّقين الآخرين على فهم قواعد الأكواد المُعقدة بفعالية أكبر.