امسح ضوئيًا لتحميل تطبيق Gate
qrCode
خيارات تحميل إضافية
لا تذكرني بذلك مرة أخرى اليوم

استخدام سكريبت Wake Printer لأتمتة تدقيق Solidity

الافتراضات والإعدادات

في هذا الدرس، سنستخدم مستودع workshop كمشروع نموذجي:

استيقظ

Bash

نسخ

استيقظ اطبع

Bash

نسخ

شغل طابعة محددة بالاسم:

الدرس 1: أنشئ طابعتك الأولى – سرد العقود

لنبدأ بطابعة بسيطة تقوم بسرد جميع العقود في المشروع. يقدم هذا المثال المفاهيم الأساسية التي ستستخدمها في تحليلات أكثر تعقيدًا.

إنشاء هيكل الطابعة

شغل الأمر التالي لبناء أول طابعتك:

from future import annotationsimport networkx as nximport rich_click as clickimport wake.ir as irimport wake.ir.types as typesfrom rich importprintfrom 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

نسخ

إليك وظيفة كل جزء في النموذج:

  • print(): الطريقة الرئيسية لعرض نتائج التحليل
  • cli(): معالج واجهة سطر الأوامر لتخصيص المعلمات

تطبيق نمط الزائر

يستخدم 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

نسخ

تحتوي فئة ContractDefinition على خصائص يمكن استخدامها لتصفية النتائج. لمزيد من التفاصيل، راجع:

النسخة النهائية

هذه هي النسخة النهائية، مع فصل الاهتمامات بشكل مناسب — حيث يتم جمع البيانات أثناء التصفح وعرضها في طريقة print():

الدرس 2: تحليل دوال العقود

معرفة الدوال التي يمكن استدعاؤها من الخارج مهمة جدًا للأمان: الدوال العامة أو الخارجية مثل ‘withdraw’ أو ‘transfer’ غالبًا ما تحدد نقطة هجوم على العقد. لننشئ طابعة تعرض جميع الدوال العامة والخارجية لرسم سطح الهجوم.

إعداد طابعة الدوال

أنشئ طابعة جديدة:

class ListFunctionsPrinter(Printer): contracts: list[ir.ContractDefinition] = []def visit_contract_definition(self, node: ir.ContractDefinition) -> None: self.contracts.append(node)

Python

نسخ

التعامل مع هيكل الوراثة

في طريقة print()، نقوم بالتنقل عبر هيكل الوراثة من العقدة الأساسية إلى العقد المشتقة، مع عرض كل مستوى من الدوال القابلة للاستدعاء:

def get_callable_final_functions(self, contract: ir.ContractDefinition) -> list[ir.FunctionDefinition]:return [\ func for func in contract.functions\iflen(func.child_functions) == 0# هو التنفيذ النهائي\and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]\ ]

Python

نسخ

تشغيل طابعة الدوال

شغل الطابعة لعرض هيكل الوراثة والدوال القابلة للاستدعاء:

Contract: ContextContract: OwnableFunctions: owner renounceOwnership transferOwnershipContract: SingleTokenVaultFunctions: constructor deposit withdraw emergencyWithdraw balanceOf setDepositLimits--------------------Contract: EIP712ExampleFunctions: constructor DOMAIN_SEPARATOR castVoteBySignature getVoteCounts--------------------Contract: ContextContract: IERC20Contract: IERC20MetadataContract: IERC20ErrorsContract: ERC20Functions: name symbol decimals totalSupply balanceOf transfer allowance approve transferFromContract: IERC20PermitContract: IERC5267Contract: EIP712Functions: eip712DomainContract: NoncesContract: ERC20PermitFunctions: permit nonces DOMAIN_SEPARATORContract: PermitTokenFunctions: constructor--------------------Contract: TokenFunctions: constructor mintTokens transfer transferWithBytes getBalance--------------------Contract: ContextContract: IERC20Contract: IERC20MetadataContract: IERC20ErrorsContract: ERC20Functions: name symbol decimals totalSupply balanceOf transfer allowance approve transferFromContract: MockERC20Functions: constructor--------------------

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

Python

نسخ

منطق التصفية الشرطية

طريقة print() الآن تتحقق مما إذا تم طلب عقد معين. إذا لم يتم تقديم اسم العقد، ستقوم الطابعة بسرد جميع العقود القابلة للنشر. وإذا تم تحديد اسم، فستتعمق فقط في هيكل ذلك العقد، حتى لو لم يكن عقدًا وراثيًا.

النسخة النهائية مع خيارات CLI

هذه هي النسخة النهائية للطابعة مع وظيفة تصفية اختيارية للعقد:

分析所有可部署的合约wake print list-functions## التركيز على عقد معيناستدعاء print list-functions --contract-name Token

Bash

نسخ

الخطوات التالية

توفر الطابعة خريطة لك؛ يكتشف الماسح الثغرات. معًا، يحولون تدقيق Solidity من عمل يدوي مرهق إلى عملية منظمة ذات رؤى. كل طابعة تكتبها يمكن أن تجعل الكود المعقد أكثر وضوحًا — وتعزز أمان العقود الذكية التي تقوم بمراجعتها.

بالنسبة لاكتشاف الثغرات، يوفر Wake نظام ماسح منفصل يتجاوز التصور لتحديد المشكلات الأمنية الفعلية. توفر الطابعات خريطة لك؛ يكتشف الماسح الثغرات.

فكر في المساهمة بطابعتك في المجتمع. الأدوات التحليلية تكون أكثر قوة عند مشاركتها، وقد تساعد طابعاتك المخصصة المراجعين الآخرين على فهم الكود المعقد بشكل أكثر فعالية.

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • تعليق
  • إعادة النشر
  • مشاركة
تعليق
0/400
لا توجد تعليقات
  • Gate Fun الساخنعرض المزيد
  • القيمة السوقية:$4.2Kعدد الحائزين:1
    0.00%
  • القيمة السوقية:$4.21Kعدد الحائزين:1
    0.00%
  • القيمة السوقية:$4.23Kعدد الحائزين:1
    0.00%
  • القيمة السوقية:$4.22Kعدد الحائزين:1
    0.00%
  • القيمة السوقية:$4.23Kعدد الحائزين:1
    0.00%
  • تثبيت