跳转到主要内容
在测试合约和协议时,如果您想要丢弃到快照位置为止的所有状态变化,回滚状态会很有帮助。
考虑改为 fork 现有的 Virtual Environment,并在一份可丢弃的工作副本上进行测试。

回滚到快照

1
创建快照
2
使用 evm_snapshot 在当前区块上创建快照。 该方法返回可用于回滚的快照 ID。
3
TENDERLY_VIRTUAL_TESTNET_RPC= #...

SNAPSHOT_ID=$(curl $TENDERLY_VIRTUAL_TESTNET_RPC \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
      "jsonrpc": "2.0",
      "method": "evm_snapshot",
      "id": "1234"
    }' \
    | jq -r  '.result')
4
回滚
5
使用 evm_revert 回滚到之前创建的快照(SNAPSHOT_ID)。 从此时起,直到快照之前的所有更改都将被丢弃。
6
read -r -d '' REVERT_REQUEST <<EOF
{
  "jsonrpc": "2.0",
  "method": "evm_revert",
  "params": ["$SNAPSHOT_ID"],
  "id": "1234"
}
EOF

curl $TENDERLY_VIRTUAL_TESTNET_RPC \
    -H "Content-Type: application/json" \
    -d $REVERT_REQUEST

回滚距离限制

单次 evm_revert 最多可回滚 2000 个区块。如果快照比当前区块落后超过 2000 个区块,调用将失败并返回:
revert operation is limited to maximum 2000 blocks
这会影响连续产生区块的 Virtual Environments(例如,定时挖掘区块的作业),此时目标快照可能很快就会超出 2000 个区块的窗口。要回到更早的位置,请改为在目标历史区块处克隆 Virtual Environment,而不是回滚。

在历史区块处克隆

要获得一个状态与特定过去区块匹配的 Virtual Environment,请在那个区块处克隆它。克隆是一个新的、独立的 Virtual Environment,在所选点处 fork,而源不受影响。没有距离限制,因此这是到达超过 2000 个区块之前时间点的方法。 在仪表板中,打开 Activity 选项卡并对您想要回到的区块处的交易使用 clone 操作。新的 Virtual Environment 会以该交易所在区块的状态创建。
Screenshot placeholder: Activity 选项卡上的按交易克隆操作。
当您想要“在特定区块号处 fork”时,也应采用在历史区块处克隆的方法。fork 总是从最新区块开始,而克隆可以针对任何历史区块。