💥 Gate 广场活动:#发帖赢代币TRUST 💥
在 Gate 广场发布与 TRUST 或 CandyDrop 活动 相关的原创内容,即有机会瓜分 13,333 枚 TRUST 奖励!
📅 活动时间: 2025年11月6日 – 11月16日 24:00(UTC+8)
📌 相关详情:
CandyDrop 👉 https://www.gate.com/zh/announcements/article/47990
📌 参与方式:
1️⃣ 在 Gate 广场发布原创内容,主题需与 TRUST 或 CandyDrop 活动相关;
2️⃣ 内容不少于 80 字;
3️⃣ 帖子添加话题: #发帖赢代币TRUST
4️⃣ 附上任意 CandyDrop 活动参与截图。
🏆 奖励设置(总奖池:13,333 TRUST)
🥇 一等奖(1名):3,833 TRUST / 人
🥈 二等奖(3名):1,500 TRUST / 人
🥉 三等奖(10名):500 TRUST / 人
📄 注意事项:
内容必须原创,禁止抄袭或灌水;
获奖者需完成 Gate 广场身份认证;
活动最终解释权归 Gate 所有。
使用 Wake Printer 脚本自动化 Solidity 审计
前提条件和设置
在本教程中,我们将使用 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
复制
以下是模板中每个部分的作用:
实现访问者模式
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 提供了一个单独的检测器系统,该系统超越了可视化来识别实际的安全问题。打印机为你提供地图;检测器查找问题。
考虑将你的打印机贡献回社区。分析工具在共享时最强大,你的自定义打印机可能会帮助其他审计员更有效地理解复杂的代码库。