> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# 回滚状态

> 将 Virtual Environment 回滚到先前的状态，以便从已知检查点重新运行交易和测试。

在测试合约和协议时，如果您想要丢弃到快照位置为止的所有状态变化，回滚状态会很有帮助。

<Note>
  考虑改为 [fork 现有的 Virtual Environment](/virtual-environments/develop/fork-testnet)，并在一份可丢弃的工作副本上进行测试。
</Note>

<img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/testnets/revert-state.png?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=2b20e08cfbcc34550e8deb540a3a37b4" alt="" width="1920" height="850" data-path="images/testnets/revert-state.png" />

## 回滚到快照

<Steps>
  ### 创建快照

  使用 [`evm_snapshot`](/virtual-environments/admin-rpc#evm_snapshot) 在当前区块上创建快照。
  该方法返回可用于回滚的快照 ID。

  ```bash title="snapshot.sh" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  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')
  ```

  ### 回滚

  使用 [`evm_revert`](/virtual-environments/admin-rpc#evm_revert) 回滚到之前创建的快照（`SNAPSHOT_ID`）。
  从此时起，直到快照之前的所有更改都将被丢弃。

  ```bash title="revert.sh" showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  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
  ```
</Steps>

## 回滚距离限制

单次 [`evm_revert`](/virtual-environments/admin-rpc#evm_revert) 最多可回滚 2000 个区块。如果快照比当前区块落后超过 2000 个区块，调用将失败并返回：

```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
revert operation is limited to maximum 2000 blocks
```

这会影响连续产生区块的 Virtual Environments（例如，定时挖掘区块的作业），此时目标快照可能很快就会超出 2000 个区块的窗口。要回到更早的位置，请改为在目标历史区块处克隆 Virtual Environment，而不是回滚。

## 在历史区块处克隆

要获得一个状态与特定过去区块匹配的 Virtual Environment，请在那个区块处克隆它。克隆是一个新的、独立的 Virtual Environment，在所选点处 fork，而源不受影响。没有距离限制，因此这是到达超过 2000 个区块之前时间点的方法。

在仪表板中，打开 **Activity** 选项卡并对您想要回到的区块处的交易使用 clone 操作。新的 Virtual Environment 会以该交易所在区块的状态创建。

<Note>**Screenshot placeholder：** Activity 选项卡上的按交易克隆操作。</Note>

当您想要“在特定区块号处 fork”时，也应采用在历史区块处克隆的方法。[fork](/virtual-environments/develop/fork-testnet) 总是从最新区块开始，而克隆可以针对任何历史区块。
