2025-11-08 17:01:38
loading...

使用 Wake Printer 脚本实现 Solidity 智能合约审计自动化

摘要
前提条件和设置 在本教程中,我们将通过一个示例项目(workshop 仓库)演示如何利用 Wake Printer 脚本简化 Solidity 审计流程: wake up Bash 复制 运行以下命令以启动 Wake 打印机: wake print Bash 复制 按名称运行特定的打印机: 教程 1:创建你的第一个打印机 – 列出合约 我们从一个简单的例子开始:创建一个列出项目中所有合约的打印机。这个示例将帮助你掌握复杂分析中的核心概念。 创建打印机结构 运行以下命令来搭建你的第

前提条件和设置EJ1比特币实时行情与区块链市场分析平台-好币网

在本教程中,我们将通过一个示例项目(workshop 仓库)演示如何利用 Wake Printer 脚本简化 Solidity 审计流程:EJ1比特币实时行情与区块链市场分析平台-好币网

wake up

BashEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

运行以下命令以启动 Wake 打印机:EJ1比特币实时行情与区块链市场分析平台-好币网

wake print

BashEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

按名称运行特定的打印机:EJ1比特币实时行情与区块链市场分析平台-好币网

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

我们从一个简单的例子开始:创建一个列出项目中所有合约的打印机。这个示例将帮助你掌握复杂分析中的核心概念。EJ1比特币实时行情与区块链市场分析平台-好币网

创建打印机结构EJ1比特币实时行情与区块链市场分析平台-好币网

运行以下命令来搭建你的第一个打印机:EJ1比特币实时行情与区块链市场分析平台-好币网

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

PythonEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

以下是模板中每个部分的作用:EJ1比特币实时行情与区块链市场分析平台-好币网

  • print():显示分析结果的主要执行方法。EJ1比特币实时行情与区块链市场分析平台-好币网

  • cli():用于自定义参数的命令行界面处理程序。EJ1比特币实时行情与区块链市场分析平台-好币网

实现访问者模式EJ1比特币实时行情与区块链市场分析平台-好币网

Wake 使用访问者模式遍历合约的抽象语法树 (AST)。这种模式允许自动导航代码结构,并对特定元素(如合约或函数定义)做出反应。EJ1比特币实时行情与区块链市场分析平台-好币网

为了列出合约,我们将覆盖 visit_contract_definition 方法,该方法会为代码库中的每个合约调用。EJ1比特币实时行情与区块链市场分析平台-好币网

将此方法添加到你的 ListContractsPrinter 类:EJ1比特币实时行情与区块链市场分析平台-好币网

wake print list-contracts

BashEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

此命令运行你的打印机并打印项目中找到的所有合约名称。EJ1比特币实时行情与区块链市场分析平台-好币网

改进输出EJ1比特币实时行情与区块链市场分析平台-好币网

基本实现会显示所有合约,包括接口和继承的合约。让我们改进它,仅显示可部署的合约:EJ1比特币实时行情与区块链市场分析平台-好币网

def visit_contract_definition(self, node: ir.ContractDefinition) -> None:iflen(node.child_contracts) != 0:returnif node.kind != ir.enums.ContractKind.CONTRACT:returnprint(node.name)

PythonEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

ContractDefinition 类包含可用于过滤结果的属性。有关完整参考,请参见:https://ackee.xyz/wake/docs/latest/api-reference/ir/declarations/contract-definition/EJ1比特币实时行情与区块链市场分析平台-好币网

完整实现EJ1比特币实时行情与区块链市场分析平台-好币网

这是最终版本,具有适当的关注点分离——在遍历期间收集数据并在 print() 方法中显示它。EJ1比特币实时行情与区块链市场分析平台-好币网

教程 2:分析合约函数

了解哪些函数可从外部调用对于安全性至关重要:公共 'withdraw' 或 'transfer' 函数通常定义了合约的攻击面。让我们创建一个打印机,通过列出所有公共和外部函数来绘制攻击面。EJ1比特币实时行情与区块链市场分析平台-好币网

设置函数打印机

创建一个新的打印机:EJ1比特币实时行情与区块链市场分析平台-好币网

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

PythonEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

处理继承层次结构

在 print() 方法中,我们遍历从基合约到派生合约的继承层次结构,显示每个级别的可调用函数:EJ1比特币实时行情与区块链市场分析平台-好币网

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]\        ]

PythonEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

运行函数打印机

执行打印机以查看继承层次结构和可调用函数:EJ1比特币实时行情与区块链市场分析平台-好币网

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--------------------

BashEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

输出为你提供每个合约的继承和可调用入口点的快速可视化地图。EJ1比特币实时行情与区块链市场分析平台-好币网

@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

PythonEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

条件过滤逻辑EJ1比特币实时行情与区块链市场分析平台-好币网

print() 方法现在检查是否请求了特定的合约。如果没有提供合约名称,则打印机将列出所有可部署的合约。如果指定了名称,它将仅深入到该合约的层次结构中,即使它不是叶子合约也是如此。EJ1比特币实时行情与区块链市场分析平台-好币网

完整实现与 CLI 选项EJ1比特币实时行情与区块链市场分析平台-好币网

这是带有可选合约过滤功能的最终打印机。EJ1比特币实时行情与区块链市场分析平台-好币网

## 分析所有可部署的合约wake print list-functions## 专注于特定的合约wake print list-functions --contract-name Token

BashEJ1比特币实时行情与区块链市场分析平台-好币网

复制EJ1比特币实时行情与区块链市场分析平台-好币网

后续步骤EJ1比特币实时行情与区块链市场分析平台-好币网

打印机为你提供地图;检测器查找漏洞。它们共同将 Solidity 审计从手动苦力转变为结构化、有洞察力的过程。你编写的每个打印机都可以使复杂的代码更清晰——并增强你审查的智能合约的安全性。EJ1比特币实时行情与区块链市场分析平台-好币网

对于漏洞检测,Wake 提供了一个单独的检测器系统,该系统超越了可视化来识别实际的安全问题。打印机为你提供地图;检测器查找问题。EJ1比特币实时行情与区块链市场分析平台-好币网

考虑将你的打印机贡献回社区。分析工具在共享时最强大,你的自定义打印机可能会帮助其他审计员更有效地理解复杂的代码库。EJ1比特币实时行情与区块链市场分析平台-好币网

声明:文章不代表好币网观点及立场,不构成本平台任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!转载请注明出处!侵权必究!
币圈快讯
查看更多
热门币种
BTC比特币
105,239.09 USDT
¥755,174.66
+0.76%
ETH以太坊
2,517.54 USDT
¥18,065.36
+0.25%
USDT泰达币
1.00000 USDT
¥7.18
+0.01%
XRP瑞波币
2.15 USDT
¥15.44
+0.13%
BNB币安币
646.71 USDT
¥4,640.66
+0.96%
SOLSolana
145.58 USDT
¥1,044.65
+1.24%
USDC
0.99980 USDT
¥7.17
+0.01%
TRX波场
0.27410 USDT
¥1.97
-0.11%
DOGE狗狗币
0.16830 USDT
¥1.21
-0.18%
ADA艾达币
0.59440 USDT
¥4.27
0%
查看更多
回顶部