Отсканируйте, чтобы загрузить приложение Gate
qrCode
Больше вариантов загрузки
Не напоминай мне больше сегодня.

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

前提条件和设置

在本教程中,我们将使用 workshop 仓库作为示例项目:

唤醒

Bash

复制

唤醒 打印

Bash

复制

按名称运行特定的打印机:

教程 1:创建你的第一个打印机 – 列出合约

让我们从一个简单的打印机开始,它列出项目中的所有合约。此示例介绍了你将在更复杂的分析中使用的核心概念。

创建打印机结构

运行以下命令来搭建你的第一个打印机:

from __future__ import annotations import networkx as nx import rich_click as click import wake.ir as ir import wake.ir.types as types from rich import print from wake.cli import SolidityName from wake.printers import Printer, printer

class ListContractsPrinter(Printer): @print 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 类:

唤醒 打印 list-contracts

Bash

复制

此命令运行你的打印机并打印在你的项目中找到的所有合约名称。

改进输出

基本实现显示所有合约,包括接口和继承的合约。让我们改进它以仅显示可部署的合约:

def visit_contract_definition(self, node: ir.ContractDefinition) -> None: if len(node.child_contracts) != 0: return if node.kind != ir.enums.ContractKind.CONTRACT: return print(node.name)

Python

复制

ContractDefinition 类包含可用于过滤结果的属性。有关完整参考,请参见:

完整实现

这是最终版本,具有适当的关注点分离——在遍历期间收集数据并在 print 方法中显示它:

教程 2:分析合约函数

了解哪些函数可从外部调用对于安全至关重要:公共 ‘withdraw’ 或 ‘transfer’ 函数通常定义了合约的攻击面。让我们创建一个打印机,通过列出所有公共和外部函数来绘制攻击面。

@E0## 设置函数打印机

创建一个新的打印机:

class ListFunctionsPrinter(Printer): contracts: list[ir.ContractDefinition] = []

def visit_contract_definition(self, node: ir.ContractDefinition) -> None:
    self.contracts.append(node)

@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(self) 方法现在检查是否请求了特定的合约。如果没有提供合约名称,则打印机将列出所有可部署的合约。如果指定了名称,它将仅深入到该合约的层次结构中,即使它不是叶子合约也是如此。

完整实现与 CLI 选项

这是带有可选合约过滤功能的最终打印机。

专注于特定的合约

唤醒 打印 list-functions --contract-name Token

后续步骤

打印机为你提供地图;检测器查找漏洞。它们共同将 Solidity 审计从手动苦力转变为结构化、有洞察力的过程。你编写的每个打印机都可以使复杂的代码更清晰——并增强你审查的智能合约的安全性。

对于漏洞检测,Wake 提供了一个单独的检测器系统,该系统超越了可视化来识别实际的安全问题。打印机为你提供地图;检测器查找问题。

考虑将你的打印机贡献回社区。分析工具在共享时最强大,你的自定义打印机可能会帮助其他审计员更有效地理解复杂的代码库。

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • комментарий
  • Репост
  • Поделиться
комментарий
0/400
Нет комментариев
  • Закрепить