资讯动态

拆解Pashov Skills的Fizz框架代码:Clamped Handlers、Ghost变量与Snapshot快照设计原理

发布时间:2026/10/14 0:44:30 来源:尧图企业网站定制
【免费下载链接】skillsPashov Audit Group Skills项目地址https://gitcode.com/gh_mirrors/skills20/skills点击查看免费下载Pashov Skills 仓库中的Fizz是一个 Solidity 模糊测试fuzz testing技能一条命令即可为你的智能合约自动生成兼容 Echidna 与 Medusa 的完整测试套件。本文带你拆解 Fizz 框架的三大核心代码设计——Clamped Handlers 双层输入收敛、Ghost 变量状态追踪与Snapshot 快照机制理解这套模糊测试框架背后的设计原理。一、Fizz 是什么从合约代码到模糊测试套件的流水线Fizz 面向想做模糊测试但没空搭环境的 Solidity 开发者与安全研究员。它的完整工作流定义在 fizz/SKILL.md 中共 11 个步骤环境校验→ 检查 Foundry、Medusa、Echidna 是否就绪编译与 ABI 提取→ 生成合约函数清单协议理解→ 优先读取x-ray分析结果入口点选择→ 过滤出最有价值的函数区分 Primary/Secondary 两级脚手架生成→ 拷贝模板骨架到test/fizz/Setup 布线→ 部署合约、注入演员actors、授权与余额Handler 生成→ 为每个合约生成双层 HandlerMedusa 覆盖率迭代→ 按合约角色设定动态覆盖率目标不变量生成→ 5 个并行发现 Agent Synthesizer 2 个实现 AgentFuzzing 战役→ Medusa 或 Echidna 长时运行复现与报告→ 每个违规自动生成 Foundry 确定性复现测试整个套件通过一条清晰的继承链组织见 fizz/templates/README.mdBaseStringUtils Clamp Deployer Math └─► Snapshotsbefore/after 状态快照 └─► Properties不变量断言 └─► ContractHandler每个目标合约一个 └─► Handlers聚合器 执行者切换 ├─► FuzzTesterEchidna/Medusa 入口 └─► FoundryTesterFoundry 快速调试入口两个入口点各司其职FuzzTester.sol 只负责在构造函数里调用setup()把全部能力暴露给 FuzzerFoundryTester.sol 则用于快速调试和复现违规序列。二、Clamped Handlers双层设计如何驯服随机输入Fuzzer 生成的随机输入大多是垃圾值——直接传给协议几乎必然触发无意义的 revert。Fizz 的解法是每个 Handler 文件分为Clamped与Unclamped两个区段规范见 fizz/references/handler-patterns.md区段职责关键点Unclamped原始调用层直接调用目标函数保留asActor/asAdmin等角色修饰器Fuzzer 也可直接调用它以探索边界Clamped收敛输入层把任意值归一化为高信号调用保持薄层完成参数准备后转发到 Unclamped 版本Clamped 层的核心思想是语义边界而非机械截断。例如存款金额应受当前代币余额约束任意地址应映射到已知演员。这些工具函数全部来自 fizz/templates/utils/Clamp.sol 的clampBetween、clampLte、clampLt等每次截断还会通过 Logger 事件输出可追溯日志。一个典型的 Handler 对// Clamped收敛输入后转发 function vault_deposit_clamped(uint256 amount) public { uint256 balance token.balanceOf(actor); if (balance 0) return; amount clampBetween(amount, 1, balance); vault_deposit(amount); } // Unclamped原始调用 角色修饰器 function vault_deposit(uint256 amount) public asActor { vault.deposit(amount); }此外还有三个精巧设计边界压力变体针对每个 Clamped Handler 按需生成三类 Stress 变体——近零值除法截断区、全额操作整余额/整供应、类型边界写入uint80等窄类型存储的截断风险。因为 Bug 恰恰聚集在 Clamped 层过滤掉的边界上。Dispatcher 分发器Secondary 级函数管理设置、暂停等低频操作折叠到一个uint8 selector入口后Fuzzer 随机选中的概率天然降低了其调用频率。捐赠 Handler协议管理原生币或 ERC20 时自动生成donateETH/donateERC20变体覆盖外部注入资金这一类特殊攻击面。三、Ghost 变量追踪合约看不见的累计状态有些状态合约并不直接暴露但对写不变量至关重要——比如历史总存款。合约内部只有当前余额没有累计流水。Fizz 的答案是Ghost幽灵变量存放在 fizz/templates/Base.sol 的Ghosts结构体中的影子状态由测试框架自行记账。典型示例ghosts.totalDeposited— 所有演员的累计存款ghosts.totalWithdrawn— 累计取款ghosts.totalMinted— 累计铸造量更新规则有两条铁律见 fizz/references/property-generation.md放在外部调用之后——只有调用成功才记账避免虚记放在 Unclamped Handler 中——因为无论是 Clamped 转发还是 Fuzzer 直连最终都流经这里一处更新即可覆盖全部路径。Ghost 的价值在断言时体现property_ghostAccounting只需一条ghosts.totalDeposited ghosts.totalWithdrawn就能抓住提取得比存入多这类守恒性破坏。同时规范明确要求只为至少一个属性服务的状态添加 Ghost不做投机性扩展。四、Snapshot 快照before/after 状态差驱动增量断言如果说 Ghost 回答累计发生了什么Snapshot 则回答这一次调用改变了多少。fizz/templates/Snapshots.sol 维护一个State结构体与两份实例stateBefore/stateAfter通过snapshotBefore()与snapshotAfter()在协议调用前后各采集一次演员代币余额、协议totalAssets/totalSupply等关键状态。Handler 中的完整布线顺序是snapshotBefore()→ 协议调用 →snapshotAfter()→ Ghost 更新 → 属性断言这样就能写出精确的增量断言例如存款后 vault 总资产恰好增加 X演员余额减少量恰好等于存款额。⚠️ 两条纪律值得注意快照读取绝不允许 revert可能失败的调用要用 try/catch 包裹且不要给每个 Handler 都加快照——快照消耗 gas、拖慢 Fuzzing 速度只加在存在增量型属性的路径上。五、三者协作一次调用的完整链路与覆盖率把三层机制串起来一次 Fuzzing 调用的生命周期是Clamped Handler 用clampBetween/toActor把随机输入整形为合法高信号参数转发进 Unclamped Handler以正确角色执行真实协议调用调用前后 Snapshot 采集状态差成功后 Ghost 记账断言Handler 末尾调用 specific 属性internalFuzzer 则在每一轮所有调用后直接调用 global 属性property_前缀的 public 函数定义在 fizz/templates/Properties.sol断言由 fizz/templates/utils/PropertiesAsserts.sol 的eq/gte/lt等助手完成——失败时先发出带原因说明的事件再assert(false)触发 revert让 Fuzzer 能捕获到可读的失败现场。生成的属性还带有Guarantee 标签SHOULD-HOLD文档/数学恒等式明确保证违反即确认 Bug与EXPLORATORY推断性质违反仅作人工审查线索。这让违规分诊不再靠事后猜严重等级。战役阶段由 Medusa 或 Echidna 长时运行覆盖率按合约角色设定动态目标核心协议逻辑 80%、访问控制 60%、周边辅助 50%未达标则回到 Handler 塑形循环。发现违规后Fizz 会把收缩后的调用序列转写成 Foundry 的确定性复现测试——Fuzzing 的输出从此变成一条命令可验证的证明。六、关键文件导航 ️模块路径作用完整工作流fizz/SKILL.md11 步流水线定义Handler 规范fizz/references/handler-patterns.mdClamped/Unclamped 结构与边界变体属性生成规范fizz/references/property-generation.mdGhost 变量与 Snapshot 布线规则模板地图fizz/references/template-map.md文件职责与生成阶段状态与快照fizz/templates/Base.sol、fizz/templates/Snapshots.solGhosts 结构体、before/after 采集断言助手fizz/templates/utils/PropertiesAsserts.sol带事件日志的比较断言五路发现 Agentfizz/agents/invariant-discovery/守恒审计、往返取整、状态迁移、对抗获利、协议类型专家七、总结Fizz 框架的精髓在于把资深审计员的模糊测试方法论编码成了可复用的代码骨架Clamped Handlers用双层结构平衡信号密度与边界探索Ghost 变量为不透明的累计状态补上记账视角Snapshot 快照则让增量断言成为可能。三者沿 Base → Snapshots → Properties → Handlers 的继承链严丝合缝地协作最终把写一套高质量模糊测试套件从数周的工作压缩到数分钟。想深入了解每个生成阶段的细节建议按 fizz/templates/README.md 给出的阅读顺序通读一遍模板源码。赞分享【免费下载链接】skillsPashov Audit Group Skills项目地址https://gitcode.com/gh_mirrors/skills20/skills点击查看免费下载相关推荐Ghost Core End-to-End 测试框架实战指南从 Request Agents、Fixtures 到 Snapshot 快照Ghost Core End to End 测试框架实战指南从 Request Agents、Fixtures 到 Snapshot 快照 在 Ghost 这CMS后端前端终极指南深入解析Villain C2框架的代码架构设计原理终极指南深入解析Villain C2框架的代码架构设计原理 Villain是一款高级C2命令与控制框架支持处理多个反向TCP和基于HoaxShell的s齊伋體明代雕版印刷的數字復活革命齊伋體明代雕版印刷的數字復活革命 在数字时代如何让数百年前的明代雕版印刷字体重获新生 齊伋體 qiji font 给出了完美答案这款开源字体项目通过创新计算机视觉人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑