使用 Wake Printer 脚本自动化 Solidity 审计

2025年11月08日 20:20:21 加密货币 互联网
欧易

欧易OKX交易所

全球三大交易所之一,注册领取价值6,0000元数字货币盲盒

APP下载    官网注册
使用 Wake Printer 脚本自动化 Solidity 审计

前提条件和设置spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

在本教程中,我们将使用 workshop 仓库作为示例项目:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

wake upspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

BashspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

wake printspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

BashspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

按名称运行特定的打印机:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

教程 1:创建你的第一个打印机 – 列出合约spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

让我们从一个简单的打印机开始,它列出项目中的所有合约。此示例介绍了你将在更复杂的分析中使用的核心概念。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

创建打印机结构spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

运行以下命令来搭建你的第一个打印机:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

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:passspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

PythonspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

以下是模板中每个部分的作用:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

  • print():显示分析结果的主要执行方法spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

  • cli():用于自定义参数的命令行界面处理程序spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

实现访问者模式spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

Wake 使用访问者模式来遍历合约的抽象语法树 (AST)。访问者模式允许 Wake 自动导航你的代码结构,使你能够对特定元素(例如合约或函数定义)做出反应。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

要列出合约,我们将覆盖 visit_contract_definition 方法,该方法会为代码库中的每个合约调用。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

将此方法添加到你的 ListContractsPrinter 类:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

wake print list-contractsspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

BashspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

此命令运行你的打印机并打印在你的项目中找到的所有合约名称。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

改进输出spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

基本实现显示所有合约,包括接口和继承的合约。让我们改进它以仅显示可部署的合约:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

def visit_contract_definition(self, node: ir.ContractDefinition) -> None:iflen(node.child_contracts) != 0:returnif node.kind != ir.enums.ContractKind.CONTRACT:returnprint(node.name)spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

PythonspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

ContractDefinition 类包含可用于过滤结果的属性。有关完整参考,请参见:https://ackee.xyz/wake/docs/latest/api-reference/ir/declarations/contract-definition/spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

完整实现spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

这是最终版本,具有适当的关注点分离——在遍历期间收集数据并在 print() 方法中显示它:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

教程 2:分析合约函数spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

了解哪些函数可从外部调用对于安全至关重要:公共 'withdraw' 或 'transfer' 函数通常定义了合约的攻击面。让我们创建一个打印机,通过列出所有公共和外部函数来绘制攻击面。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

设置函数打印机

创建一个新的打印机:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

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

PythonspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

处理继承层次结构

在 print() 方法中,我们遍历从基合约到派生合约的继承层次结构,显示每个级别的可调用函数:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

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

PythonspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

运行函数打印机

执行打印机以查看继承层次结构和可调用函数:spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

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

BashspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

输出为你提供每个合约的继承和可调用入口点的快速可视化地图。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

@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

PythonspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

条件过滤逻辑spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

print() 方法现在检查是否请求了特定的合约。如果没有提供合约名称,则打印机将列出所有可部署的合约。如果指定了名称,它将仅深入到该合约的层次结构中,即使它不是叶子合约也是如此。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

完整实现与 CLI 选项spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

这是带有可选合约过滤功能的最终打印机。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

## 分析所有可部署的合约wake print list-functions## 专注于特定的合约wake print list-functions --contract-name TokenspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

BashspP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

复制spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

后续步骤spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

打印机为你提供地图;检测器查找漏洞。它们共同将 Solidity 审计从手动苦力转变为结构化、有洞察力的过程。你编写的每个打印机都可以使复杂的代码更清晰——并增强你审查的智能合约的安全性。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

对于漏洞检测,Wake 提供了一个单独的检测器系统,该系统超越了可视化来识别实际的安全问题。打印机为你提供地图;检测器查找问题。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

考虑将你的打印机贡献回社区。分析工具在共享时最强大,你的自定义打印机可能会帮助其他审计员更有效地理解复杂的代码库。spP比特币币圈炒币新手入门基础知识学习教程 - 币学堂

最新区块链知识
Robinhood Q3营收翻倍:预测市场成新增长引擎 股价为何不涨反跌?

Robinhood Q3营收翻倍:预测市场成新增长引擎 股价为何不涨反跌?

作者:Nancy,PANews随着十月收官,上市公司陆续晒出三季度成绩单。美国网红券商Robinhood交出了一份超出预期的财报,营收与利润双双刷新纪录,多元化战略初显成效,正加速迈向金融科技

2025年11月08日 0阅读
2025苹果手机怎么下载欧易交易所?iPhone快速下载安装欧易方法

2025苹果手机怎么下载欧易交易所?iPhone快速下载安装欧易方法

2025苹果手机怎么下载欧易交易所?iPhone如何下载欧易APP?iPhone苹果手机如何注册安装欧易APP? 对于国内的iPhone用户而言,想在苹果应用商店(App Store)直接搜索并下载“欧易&

2025年11月08日 0阅读
比特币链上有哪些币?各大公链有哪些?详细介绍20种及其生态币

比特币链上有哪些币?各大公链有哪些?详细介绍20种及其生态币

比特币可以说是公链的开山鼻祖,拥有广泛的认可度和应用场景,同时也吸引了众多开发者和投资者。随着技术的持续发展,比特币生态系统将继续扩张,除了比特币本身之外,还有其他项目为

2025年11月08日 0阅读
什么是BONK币?与其他迷因币有何不同?BONK 代币经济学及未来价格介绍

什么是BONK币?与其他迷因币有何不同?BONK 代币经济学及未来价格介绍

探索BONK,Solana 的领先迷因币—— 从代币经济学与社群空投,到价格历史、销毁机制,以及其在生态系统中日益重要的角色。 什么是BONK 币,以及为什么Solana 需要它&zwj

2025年11月08日 0阅读
揭秘 KOL 轮:被流量裹挟的一场财富实验

揭秘 KOL 轮:被流量裹挟的一场财富实验

曾几何时,一级市场的玩法相对清晰:VC 出钱、KOL 发声、散户提供流动性。但今天,这套玩法似乎正在被打破。VC 的背书不再万能,项目方开始围绕“影响力”重新设计游戏规则。而 KOL

2025年11月08日 0阅读
项目周刊丨Glassnode:BTC“四年周期”已失效 以太坊TPS创历史新高

项目周刊丨Glassnode:BTC“四年周期”已失效 以太坊TPS创历史新高

比特币嘉信理财CEO:将于2026年开始提供比特币交易服务嘉信理财首席执行官表示,他们将于2026年开始提供比特币交易服务。Jack Dorsey旗下Block Q3比特币营收近20亿美元,占总营收

2025年11月08日 0阅读
丨FIL突破3美元 Meta:到2028年 将在美国投入超过6000亿美元

丨FIL突破3美元 Meta:到2028年 将在美国投入超过6000亿美元

头条▌FIL突破3美元行情显示,FIL突破3美元,现报3.01美元,24小时涨幅达到117.2%,行情波动较大,请做好风险控制。▌Meta:到2028年 将在美国投入超过6000亿美元Meta Platforms称,到202

2025年11月08日 0阅读
多米诺骨牌倒下:10亿美元稳定币蒸发 DeFi史上最黑暗的一周?

多米诺骨牌倒下:10亿美元稳定币蒸发 DeFi史上最黑暗的一周?

2025年11月7日——加密市场尚未从10月11日的剧烈震荡中完全恢复,一场由稳定币引发的完美风暴正以惊人的速度席卷整个DeFi世界。在过去的一周里,我们见证了收益型稳定币遭遇自2

2025年11月08日 0阅读
末日战车启动:ZEC暴涨背后的熊市预警

末日战车启动:ZEC暴涨背后的熊市预警

作者:WolfDAO前言根据CoinMarketCap实时数据,Zcash在2025年10月8日至11月7日期间从$156.21暴涨至$533.92,30天涨幅达到241%(3.41倍),较2021年5月的前高点$319上涨67%,成功实现技术

2025年11月08日 0阅读
ETF可能成为 BTC暴跌的“定时炸弹”

ETF可能成为 BTC暴跌的“定时炸弹”

曾经的比特币ETF,被视为机构入场的通行证。如今,它正在成为系统性风险的引爆器。从10月29日至11月5日,连续6天资金外流,全市场比特币ETF净流出 近16亿美元!这意味着:聪明钱在悄悄

2025年11月08日 0阅读
猜你感兴趣
Project Quantum (QBIT)币今日实时价格行情最新消息2024年04月07日

Project Quantum (QBIT)币今日实时价格行情最新消息2024年04月07日

截止至2024年04月07日,Project Quantum (QBIT)今日实时最新价格是0.00000659美元,约等于人民币0.00004767元。 Project Quantum (QBIT)24H最高价$0.00000662美元,24H最低价$0.0

2024年07月24日 174阅读
NFT 大劫案:潜伏 14 天,10E 抄黑猴,获利 60 倍

NFT 大劫案:潜伏 14 天,10E 抄黑猴,获利 60 倍

撰文:Azuma,Odaily 星球日报 北京时间今日凌晨,编号为 #2386 的 CryptoPunk 于链上完成了换手。 令人诧异的是,CryptoPunk #2386 本次交易的换手价格仅为 10 ETH,即便是在 NFT 行

2024年09月13日 0阅读
BTC突破80500美元

BTC突破80500美元

行情显示,BTC突破80500美元,现报80507.45美元,24小时涨幅达到2.07%,行情波动较大,请做好风险控制。

2025年04月08日 0阅读
RNDR突破9美元

RNDR突破9美元

金色财经报道,行情显示,RNDR突破9美元,现报9.01美元,日内跌幅达到5.06%,行情波动较大,请做好风险控制。

2024年07月24日 1阅读
Rand (RND)币今日实时价格行情最新消息2024年04月07日

Rand (RND)币今日实时价格行情最新消息2024年04月07日

截止至2024年04月07日,Rand (RND)今日实时最新价格是0.1321美元,约等于人民币0.9555元。 Rand (RND)24H最高价$0.1321美元,24H最低价$0.1302美元,24H成交额$273.63美元,换手率。

2024年07月24日 137阅读
Chia币未来价格多少?Chia币在哪些平台交易?

Chia币未来价格多少?Chia币在哪些平台交易?

Chia币未来价格多少?Chia币是近年来备受瞩目的数字货币之一,其采用的独特的Proof of Space和Proof of Time挖矿算法,引起了广泛的关注和讨论。那么Chia币的未来价格会如何发展

2024年07月24日 148阅读