Foundry作弊码第四部分:使用vm.roll和vm.warp控制时间

本文主要讲解Foundry的作弊码vm.rollvm.warp,分别用于控制Solidity测试中的区块编号和时间戳。vm.roll允许将区块链的区块编号跳转到指定高度,而vm.warp则允许设置当前区块的时间戳,这对于测试基于时间或区块的逻辑非常有用,例如截止日期、锁仓计划和基于区块的锁。

高级 Foundry 作弊码系列:第 4 部分 - 作弊码 vm.roll & vm.warp:

使用 vm.roll 和 vm.warp 控制 Solidity 测试中的区块时间戳和编号。在无需等待的情况下测试截止日期、归属和基于时间的逻辑。

Advanced Foundry Cheatcodes Series: Part 4 - Cheatcodes vm.roll & vm.warp:

Foundry

引言

在本系列的前一集中(第 3 部分),我们掌握了负面测试和事件验证。今天,我们将扮演时间领主:vm.rollvm.warp 让你的测试可以跳转到任何区块编号或时间戳,非常适合截止日期、归属计划和基于区块的锁。

作弊码 vm.roll,控制区块编号

vm.roll(uint256 newHeight) 将区块链的区块编号跳转到 newHeight (保持时间戳不变)。这对于测试基于时间和基于区块的逻辑非常有用。例如,许多合约会锁定功能直到某个区块,或者只允许在 n 个区块过去后才执行操作。你可以轻松地模拟这种情况:

image

在测试中,在 N 部署后,你可以这样做:

image

由于 Forge 使用确定性的 EVM,因此上述调用实际上会看到 block.numberunlockBlock,从而允许操作成功。相反,如果你滚动到一个较小的数字,它会恢复。

重要的是,vm.roll 仅设置区块编号,而区块时间戳 ( block.timestamp) 保持不变。 Foundry 还提供了 vm.warp 来设置时间戳(参见下一节)。通常,结合使用时,你可以同时推进编号和时间来模拟进度。这些作弊码可以让你轻松地“将 block.timestampblock.number 推向未来”。(例如,Foundry 上关于彩票合约的教程,背靠背地使用 vm.warp(...)vm.roll(...) 来模拟彩票间隔的过去。)

因为 block.number 通常是单调的,所以 vm.roll 也可以通过给出一个较小的数字来缩小(倒回)区块高度,但需要小心,因为合约可能会假设区块正在增加。

高级提示: 不变量或模糊测试可能会在内部使用 roll 来探索区块时间不变性。此外,如果你 fork 了主网,Forge 的区块操作可以在 forks 上无缝工作,vm.roll 仍然会覆盖你的测试环境的编号。总的来说,vm.roll 解锁了任何必须满足特定区块编号条件的情况,而无需实时等待。

作弊码 vm.warp,控制区块时间戳

vm.roll 类似,vm.warp(uint256 newTime) 将区块链的当前 block.timestamp 设置为 newTime。这对于测试基于时间的逻辑(截止日期、归属、利息累积等)至关重要。例如,考虑一个时间锁:

  • 原文链接: threesigma.xyz/blog/foun...
  • 登链社区 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.