Foundry高级作弊码系列:第三部分 - 断言作弊码

本文是Foundry cheatcodes系列文章的第三部分,主要介绍了 Foundry 中的断言作弊码,包括 vm.expectRevert(用于测试必须抛出的情况)、vm.expectEmit(用于验证事件和topic)和 vm.expectCall(用于断言外部交互)。

图像

开发者和审计员们:想要获得万无一失的智能合约测试吗?学习 Foundry 的断言作弊码,这是 7 部分中的第 3 部分。捕获每个 revert 和 event,在漏洞发生之前避免它们。你的用户会感谢你的。

介绍

再次欢迎来到我们的作弊码深度解析。如果你错过了,上次我们学习了

用 vm.prank 伪造调用者;现在我们将用期望指令来磨练我们的测试武器库,断言 reversions、events 和外部调用,以便你的合约按照预期的方式运行。

1. vm.expectRevert:快速失败的负面测试

vm.expectRevert 是你放置在必须抛出的调用之前的单行保护。如果你不提供任何参数,它会接受任何 revert;如果你提供一个字节字符串或自定义错误选择器,它会坚持使用该确切的原因。该指令仅适用于下一个外部调用,因此你始终将其写在被测语句的正上方。

图像

因为只监视下一个调用,所以将指令放在它正上方。当 revert 依赖于调用者或区块状态时,与 vm.prank 或 vm.roll 结合使用。

为什么要保持简洁?在实践中,expectRevert 是一个单行保护,要么静默通过,要么停止运行;它的语义很简单。

2. vm.expectEmit:验证 events 和主题

当你关心函数是否发出正确的日志时,你可以使用

vm.expectEmit。在内部,Foundry 记录一个模板 event,然后运行真实的调用,然后将实际的日志流与模板按顺序进行比较。四个布尔标志告诉 Forge 哪些索引主题以及非索引数据是否必须匹配,以及一个可选的第五个参数,用于修复预期的发射器地址。

图像

你可以背靠背地发出几个模板;Forge 将它们视为有序的子序列,因此允许它们之间的额外日志,而重新排序是不允许的。这使得验证复杂的多 event 流程变得容易,例如 ERC-4626 存款和取款对、NFT 批量铸造或必须按正确顺序发布 Upgraded 和 AdminChanged 的代理升级信标。

3 vm.expectCall:断言外部交互

vm.expectCall 监视对目标合约的低级 CALL、DELEGATECALL 或 STATICCALL,具有精确的 calldata、可选的 msg.value 和可选的 gas 约束。将指令放在应该触发调用的函数之前;如果下一个外部交互不匹配,则测试中止。

图像

delegate 和 static 变体遵循相同的签名(expectDelegateCall,expectStaticCall)。它们一起让你保证 vault 只转发一次资金,代理真正委托给实现,或者 fallback 不会偷偷进行额外的调用。如果你需要多次监视同一个调用,请传递 count 参数;如果计数不完全匹配,Forge 将失败。

4. Forge-std 断言:快速值检查

除了作弊码之外,标准库还提供了 Solidity 原生助手,例如 assertEq、assertGt、assertApproxEqAbs、assertTrue 和一个简单的 fail()。它们会以清晰的诊断信息进行 revert,并与 Forge 跟踪集成,这意味着你很少在测试中编写原始的 require 语句。

把它放在一起

一个全面的断言层通常以 std-assertions 开始,用于数字状态,使用 expectRevert 用于负面路径,应用 expectEmit 以保证日志完整性,并以 expectCall 结束以确定副作用。因为每个指令都作用于下一个操作,所以意图保持明显,并且没有隐藏的全局状态。通过将这些原语与 vm.prank(用于欺骗调用者)、vm.roll 和 vm.warp(用于时间旅行)以及 vm.deal(用于为帐户提供资金)结合使用,你可以在少数自文档化的行中表达多参与者、时间依赖、事件丰富的场景,这些行会在任何假设被打破时大声失败。

如果你喜欢这种类型的内容,请在 Twitter 上关注 @threesigmaxyz 并浏览我们的博客,以获取更多关于区块链主题的见解。

明天发布第 4 部分:作弊码 vm.roll & vm.warp:时间旅行区块链的区块编号和时间戳

  • 原文链接: x.com/threesigmaxyz/stat...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Three Sigma
Three Sigma
Three Sigma is a blockchain engineering and auditing firm focused on improving Web3 by working closely with projects in the space.