Скануйте, щоб завантажити додаток Gate
qrCode
Більше варіантів завантаження
Не нагадувати сьогодні

Автоматизація аудиту Solidity за допомогою скрипту Wake Printer

Передумови та налаштування

У цьому навчальному посібнику ми використовуватимемо репозиторій workshop як приклад проекту:

wake up

Bash

Копіювати

wake print

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## Зосереджено на конкретному контрактіwake print list-functions --contract-name Token

Bash

Копіювати

Наступні кроки

Принтер дає вам карту; детектор шукає вразливості. Вони разом перетворюють аудит Solidity із ручної роботи у структурований і проникливий процес. Кожен створений вами принтер може зробити складний код більш зрозумілим і підвищити безпеку аналізованих смарт-контрактів.

Для виявлення вразливостей Wake пропонує окрему систему детекторів, яка йде далі за візуалізацію і допомагає виявити реальні проблеми безпеки. Принтери дають вам карту; детектори шукають проблеми.

Рconsider your printers for community contribution. Sharing analysis tools makes them more powerful, and ваші власні налаштування принтерів можуть допомогти іншим аудиторам краще розуміти складний код.

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Популярні активності Gate FunДізнатися більше
  • Рин. кап.:$4.22KХолдери:1
    0.00%
  • Рин. кап.:$4.21KХолдери:1
    0.00%
  • Рин. кап.:$4.21KХолдери:1
    0.00%
  • Рин. кап.:$4.21KХолдери:1
    0.00%
  • Рин. кап.:$4.22KХолдери:1
    0.00%
  • Закріпити