Foundry 高级作弊码系列:第二部分 - 作弊码 vm.prank,模拟调用

本文介绍了 Foundry 的一个非常有用的 Cheatcode:vm.prank,它允许开发者在测试中模拟任何地址作为 msg.sender,从而方便地测试访问控制和各种边界情况。

图像

Advanced Foundry Cheatcodes Series: Part 2 - Cheatcode vm.prank, 模拟调用

想要掌握 Solidity 测试吗?我们的 Foundry Cheatcodes 系列的第 2 部分揭示了 vm.prank 如何让你模拟任何地址,这对于快速测试访问控制和边缘情况至关重要。 了解如何操作。👀

介绍

这是我们的 Foundry Cheatcodes 系列的第 2 部分,共 7 部分。在第 1 部分 中,我们将 Foundry 与 Hardhat 进行了比较,并为更快的、Solidity 原生的测试奠定了基础;今天我们将深入探讨 vm.prank,这个技巧可以让你的测试伪装成任何地址,以探测访问控制的边缘情况。

是否曾经需要测试访问控制或模拟来自不同用户的调用?Foundry 的 vm.prank 可以让你轻松地模拟任何地址并验证你的合约逻辑。

vm.prank(address) cheatcode 使下一个合约调用看起来像是来自不同的地址(它设置了 msg.sender)。这在测试依赖于调用者的逻辑时至关重要。例如,如果只有所有者才能调用一个函数,你可以 prank 一个非所有者并验证它是否失败。在 Foundry 的 forge-std Test 合约中,你只需这样做:

图像

在这里,vm.prank(0xBEEF) 强制下一个对 c.privileged() 的调用来自 0xBEEF。然后 Foundry 验证了预期的 revert。在幕后,Foundry 调用一个特殊的地址 0x7109...DD12 来执行 cheat。每当 Solidity 代码调用该地址时,Forge 的自定义 EVM 都会 hook 它,解码 calldata,并将其路由到本地 Rust 处理程序,该处理程序会改变内存中的链状态。实际上没有部署任何合约,一切都发生在测试运行器内部,因此 bytecode 保持精简,并且 cheatcode 在生产构建中消失。如果你在 mainnet 上运行编译后的测试,相同的调用只会 revert,因为在 Forge 之外的 0x7109…DD12 处不存在任何东西。

对于多次调用,使用 vm.startPrank(addr) 在后续调用中保持伪造的身份,并使用 vm.stopPrank() 结束它。例如:

图像

这些 cheatcode 允许你模拟任何用户或合约作为调用者。正如 Forge cheat sheet 显示的那样:vm.prank(address)、vm.startPrank(address) 和 vm.stopPrank() 是原语。因为 Foundry 测试在 Anvil 上确定性地运行,所以 vm.prank 比启动另一个帐户或像在 Hardhat 中那样使用 ethers.js.impersonate 简单得多。真实的测试通常将 prank 与其他 cheat 结合使用:例如,将 vm.prank 与 vm.expectRevert(如上)或时间操作链接起来。这种“掩盖”调用者的能力使得高级场景测试(多用户流程、权限检查、抢先交易测试等)无需繁重的设置即可进行。

还有一个重载 vm.prank(address msgSender, address txOrigin),当需要在单个调用中 spoof msg.sender 和 tx.origin 时,这对于测试 meta-tx 路径或委托调用边缘情况非常有用。

接下来:如何使用 vm.expectRevert 断言 reverts 并提升你的负面测试游戏。在那之前,请在 Three Sigma 博客上更深入地了解智能合约测试。

为什么 Foundry 胜出(以及接下来是什么)

Foundry 的速度、单语言测试工作流程以及内置的 fuzz/invariant 引擎使其成为我在安全或深度协议测试方面需要考虑的首选工具。Hardhat 的生态系统非常庞大,其 JS 插件非常方便,但是一旦团队感受到编译和测试循环从几秒钟降到几毫秒,并且意识到他们可以完全抛弃 TypeScript 测试工具,这种转变就很难逆转。Rust 级别的性能,Solidity 级别的人体工程学。

在下一期中,我们将继续深入研究 cheat-code:第 3 部分将介绍基于 expect 的断言三重奏,vm.expectRevert、vm.expectEmit 和 vm.expectCall,展示如何在它们发生之前锁定 reverts、events 和外部调用。每天都会发布一篇新的 cheat-code 文章,直到我们完成整个集合。

  • 原文链接: 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.