> For the complete documentation index, see [llms.txt](https://docs.termina.technology/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.termina.technology/documentation/developer-docs-zh/liu-cheng/zhong-fang-shi-chang.md).

# 重放市场

{% stepper %}
{% step %}

#### 选择时间窗口

检查目标范围是否匹配预构建的 bundle，这些 bundle 覆盖过去 30 天。如有需要，可以用 `--after <DATE>` 或 `--before <DATE>` 筛选。

```bash
sim ranges
```

```
Start Time (UTC)       End Time (UTC)         Start Slot    End Slot      Bundle Size   Kind            Scope
----------------------------------------------------------------------------------------------------------------------------------
2026-06-30T17:53:10Z   2026-06-30T19:00:53Z   429,926,541   429,936,540   10,000        account_state   global
2026-06-30T18:23:38Z   2026-06-30T18:27:02Z   429,931,041   429,931,540   500           account_state   global
2026-07-19T05:50:16Z   2026-07-19T07:00:13Z   433,838,452   433,848,451   10,000        account_state   global
```

对于超过 30 天的范围，或落在预构建 bundle 之间的范围，请构建自定义 bundle。

```bash
sim bundle build --start-slot 400000000 --end-slot 400001000
```

{% endstep %}

{% step %}

#### 运行基准

启动一个会话来重放交易，并记录现有行为。如果该范围由多个 bundle 覆盖，可使用 `--parallel` 将工作分配到多个并发会话。

```bash
# 基准
sim run \
  --start-slot 400000000 \
  --end-slot 400001000 \
  --program-id <PROGRAM_ID> \
  --output-file baseline.json
```

这会生成一个按行分隔的 JSON 文件，其中包含本次运行的结果。

<details>

<summary>baseline.json</summary>

```json
{
  "metadata": {
    "start_slot": 400000000,
    "end_slot": 400001000,
    "program_id": "<PROGRAM_ID>",
    "session_ids": ["..."],
    "timestamp": "2026-05-29T03:06:07Z"
  },
  "transactions": [
    {
      "slot": 400000042,
      "signature": "<BASE58_SIG>",
      "success": true,
      "error": null,
      "logs": ["Program log: ...", "..."],
      "sol_changes": { "<PUBKEY>": -5000000 },
      "token_changes": { "<PUBKEY>": { "<MINT>": -1000 } },
      "account_diffs": { "<PUBKEY>": { "before": "...", "after": "..." } }
    }
  ],
  "summary": {
    "total": 847,
    "successes": 831,
    "failures": 16
  }
}
```

</details>

`sim` 提供了一个辅助命令，可读取该 JSON 并汇总运行结果。

```bash
sim summarize baseline.json
```

```
File        : baseline.json
Slot range  : 400000000 → 400001000
Program IDs : <PROGRAM_ID>
Session(s)  : 10
Ran at      : 2026-05-29 03:06:07 UTC

i Transactions : 205308 (96972 successes, 108336 failures)
```

```bash
# 追踪特定钱包的余额变化
sim summarize baseline.json --accounts E2gE...
```

```
Account: E2gE...
  SOL  29.455253127 → 29.293640983  (Δ -0.161612144)
```

{% endstep %}

{% step %}

#### 运行实验

构建一个修改后的程序，可以包含参数调整、功能升级或错误修复。用它替换原始二进制文件，并在相同的历史交易流上运行新逻辑。

```bash
# 实验
sim run \
  --start-slot 400000000 \
  --end-slot 400001000 \
  --program-id <PROGRAM_ID> \
  --program-so <PATH_TO_NEW_BINARY> \
  --output-file experiment.json
```

如果新程序需要更多计算单元，请使用 `--extra-compute-units <EXTRA_UNITS>` 提高上限，以避免交易失败。
{% endstep %}

{% step %}

#### 比较结果

基准和实验都完成后，比较这两次运行：

* 回归：原本成功的交易 -> 现在失败
* 改进：原本失败的交易 -> 现在成功
* 余额变化：每个账户的 token 账户中的差额

```bash
sim compare baseline.json experiment.json
```

```bash
# 只显示出问题的部分
sim compare baseline.json experiment.json regressions
```

```bash
# 检查对 P&L 的影响
sim compare baseline.json experiment.json balances
```

{% endstep %}
{% endstepper %}
