本文主要讲解Foundry的作弊码vm.roll
和vm.warp
,分别用于控制Solidity测试中的区块编号和时间戳。vm.roll
允许将区块链的区块编号跳转到指定高度,而vm.warp
则允许设置当前区块的时间戳,这对于测试基于时间或区块的逻辑非常有用,例如截止日期、锁仓计划和基于区块的锁。
使用 vm.roll 和 vm.warp 控制 Solidity 测试中的区块时间戳和编号。在无需等待的情况下测试截止日期、归属和基于时间的逻辑。
Foundry
在本系列的前一集中(第 3 部分),我们掌握了负面测试和事件验证。今天,我们将扮演时间领主:vm.roll
和 vm.warp
让你的测试可以跳转到任何区块编号或时间戳,非常适合截止日期、归属计划和基于区块的锁。
vm.roll
,控制区块编号vm.roll(uint256 newHeight)
将区块链的区块编号跳转到 newHeight
(保持时间戳不变)。这对于测试基于时间和基于区块的逻辑非常有用。例如,许多合约会锁定功能直到某个区块,或者只允许在 n 个区块过去后才执行操作。你可以轻松地模拟这种情况:
在测试中,在 N 部署后,你可以这样做:
由于 Forge 使用确定性的 EVM,因此上述调用实际上会看到 block.number
≥ unlockBlock
,从而允许操作成功。相反,如果你滚动到一个较小的数字,它会恢复。
重要的是,vm.roll
仅设置区块编号,而区块时间戳 ( block.timestamp
) 保持不变。 Foundry 还提供了 vm.warp
来设置时间戳(参见下一节)。通常,结合使用时,你可以同时推进编号和时间来模拟进度。这些作弊码可以让你轻松地“将 block.timestamp
和 block.number
推向未来”。(例如,Foundry 上关于彩票合约的教程,背靠背地使用 vm.warp(...)
和 vm.roll(...)
来模拟彩票间隔的过去。)
因为 block.number
通常是单调的,所以 vm.roll
也可以通过给出一个较小的数字来缩小(倒回)区块高度,但需要小心,因为合约可能会假设区块正在增加。
高级提示: 不变量或模糊测试可能会在内部使用 roll
来探索区块时间不变性。此外,如果你 fork 了主网,Forge 的区块操作可以在 forks 上无缝工作,vm.roll
仍然会覆盖你的测试环境的编号。总的来说,vm.roll
解锁了任何必须满足特定区块编号条件的情况,而无需实时等待。
与 vm.roll
类似,vm.warp(uint256 newTime)
将区块链的当前 block.timestamp
设置为 newTime
。这对于测试基于时间的逻辑(截止日期、归属、利息累积等)至关重要。例如,考虑一个时间锁:
- 原文链接: threesigma.xyz/blog/foun...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!