跳转到主要内容
在测试合约和协议时,如果您想要丢弃到快照位置为止的所有状态变化,回滚状态会很有帮助。
考虑改为 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 个区块,调用将失败并返回:
这会影响连续产生区块的 Virtual Environments(例如,定时挖掘区块的作业),此时目标快照可能很快就会超出 2000 个区块的窗口。要回到更早的位置,请改为在目标历史区块处克隆 Virtual Environment,而不是回滚。

在历史区块处克隆

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