> ## 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.

# 通过重放历史区块回测代币头寸

> 在过去的区块处 fork 网络并建立收益型代币头寸，使用 Network Mirror Mode 按顺序重放真实的 mainnet 历史区块，读取该头寸在整个期间实际赚取的收益，适用于任何收益型代币的历史回测，示例采用 Franklin BENJI 货币基金代币。

[Network Mirror Mode](/virtual-environments/network-mirror-mode) 会将父网络的真实区块重放到 Virtual Environment 上。当 Virtual Environment 在**过去的区块**处 fork 时，重放覆盖的就是真实历史：从 fork 点开始的每一笔 mainnet 交易都会按顺序在您的私有副本上重新执行。本指南利用这一重放机制来回测头寸：在过去的日期处 fork，购入收益型代币，向前重放历史，然后读取该头寸在此期间实际赚取的收益。

示例使用 Ethereum Mainnet 上的 Franklin OnChain U.S. Government Money Fund 代币（`BENJI`）。相同的流程适用于任何收益型代币。

<Note>
  Network Mirror Mode 在付费计划中提供。要为您的账户启用它，请[联系我们的销售团队](https://tenderly.co/contact-us)。
</Note>

<Steps>
  ### 在过去的区块处创建 Virtual Environment

  在您的项目中创建一个新的 Virtual Environment。在创建表单中设置：

  * **Networks**：Ethereum Mainnet
  * **Network mode**：**Network mirror**（完整的逐区块 mainnet 重放）
  * 取消勾选 **Start from latest block**，将参考点类型设为 **Block Number**，然后输入头寸起始日期对应的区块号。**Fork from block** 列显示每个所选网络的 fork 区块。

  <Frame caption="Create Virtual Environment 表单：已选择 Network mirror 模式，取消勾选 Start from latest block，并将过去的区块号设为参考点。">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-create.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=eee8be67183659b356bdaf46dad8203b" alt="Create Virtual Environment form with Ethereum Mainnet, Network mirror mode, and a past fork block number entered" width="1600" height="1330" data-path="images/testnets/mirror-backtest-create.webp" />
  </Frame>

  创建 Virtual Environment，打开它，然后进入 **Network sync** 标签页。**Network sync status** 面板会显示 mainnet 头部区块、Virtual Environment 头部区块（停在您的 fork 区块处），以及 Virtual Environment 落后 mainnet 多少个区块。这个差距就是重放将要覆盖的历史区间。

  <Frame caption="Network sync status 面板：mainnet 头部区块、位于 fork 区块处的 Virtual Environment 头部区块，以及落后区块计数。">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-sync-status.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=0cb57769a10ffac34ebbf7a652f02f59" alt="Network sync status panel showing Mainnet head 25,638,816, Virtual Environment head 25,634,161, and 4,655 blocks behind mainnet" width="1600" height="1000" data-path="images/testnets/mirror-backtest-sync-status.webp" />
  </Frame>

  ### 为钱包充值并建立头寸

  fork 区块时刻的真实网络状态已在 Virtual Environment 上生效，因此基金的代币合约及其交易所在的资金池都已就位。

  [同步激活期间 Admin RPC cheatcodes 被禁用](/virtual-environments/network-mirror-mode#cheatcode-behavior)，所以请在启动重放之前完成所有设置。确认同步处于暂停状态：状态面板显示 **Start auto-sync**，而不是正在运行的计时器。

  1. 使用右上角的 **RPC Cheatcodes** 为投资者钱包充值：用 [`tenderly_setBalance`](/virtual-environments/admin-rpc#tenderly_setbalance) 设置 gas 所需的 ETH，用 [`tenderly_setErc20Balance`](/virtual-environments/admin-rpc#tenderly_seterc20balance) 设置用于投资的稳定币。
  2. 以投资者的方式获取基金代币：通过 swap 换取，或通过基金的链上流程认购。钱包现在持有以 fork 日期为准的头寸。

  ### 追踪头寸余额

  仍在 **Network sync** 标签页中，将下方面板从 **Sync operations** 切换到 **State drift**，然后打开 **Balance** 子标签页。

  点击 **Track balance**，在 **Track wallet balance** 对话框中填写：

  * **Wallet**：投资者钱包
  * **Token**：基金代币（`BENJI`：`0x3DDc84940Ab509C11B20B76B466933f40b750dc9`）

  随后会出现一张卡片，显示钱包、代币和 **Diff** 计数。在区块重放之前，卡片显示 "No balance drift data yet"。

  <Frame caption="Track wallet balance 对话框：投资者钱包和 BENJI 基金代币。">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-track-dialog.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=b59d880652741ac8ac914a80c078958b" alt="Track wallet balance dialog with a wallet address and the BENJI token on Mainnet selected" width="528" height="304" data-path="images/testnets/mirror-backtest-track-dialog.webp" />
  </Frame>

  ### 向前重放历史

  在 **Network sync status** 面板中：

  1. 打开同步按钮旁的速度下拉菜单，选择 **4×**（每 3 秒一个区块；参见[速度设置](/virtual-environments/network-mirror-mode#time-controls)）。
  2. 按下 **Start auto-sync**。

  Virtual Environment 会将真实的 mainnet 区块重放到 fork 上。Virtual Environment 头部区块不断攀升，落后区块计数不断缩小，该期间的每一笔真实交易都按顺序重新执行，包括基金的链上收益分配。

  在 **Balance** 卡片上，每重放一次收益发放，图表上被追踪的余额就阶梯式上升一次。让重放运行到覆盖您想测量的期间为止，然后按 **Stop auto-sync**。

  <Frame caption="重放后的 Balance 卡片：被追踪的 BENJI 余额在基金分配重新执行的区块处阶梯式上升。">
    <img src="https://mintcdn.com/tenderly/AwV2r8yQqTyCkRCK/images/testnets/mirror-backtest-drift-step.webp?fit=max&auto=format&n=AwV2r8yQqTyCkRCK&q=85&s=1c7dceeba8d7b143abca2a721c2a0403" alt="State drift Balance card showing a flat BENJI balance line stepping up sharply at block 25,634,222" width="700" height="380" data-path="images/testnets/mirror-backtest-drift-step.webp" />
  </Frame>

  ### 读取已实现收益

  **Balance** 卡片现在给出结果：

  * 图表绘制每个重放区块处被追踪的余额。每次分配都表现为一次阶梯上升；重放窗口起点与终点的余额之差就是该期间的已实现收益。对于 NAV 为 \$1.00 的基金，这就是以美元计的收益。
  * 将鼠标悬停在图表上，可读取任意区块处的余额。
  * **Diff** 计数显示被追踪余额与同一区块高度的 mainnet 相差多少。在重放原样重新执行 mainnet 历史时它保持 `0.000`；当您在 Virtual Environment 上发送的交易改变了头寸相对于 mainnet 的状态时，它才会变化。

  年化计算：设重放历史 *D* 天内本金 *P* 获得收益 *G*，则 `APY ≈ (1 + G/P)^(365/D) − 1`。

  ### 比较场景（可选）

  * **Rewind** 会撤销最近同步的区块，以便重新运行一段历史。
  * **Sync block** 精确推进一个区块，便于恰好停在某一次收益发放处并单独读取它。
  * 在不同的 fork 区块或以不同的头寸规模创建第二个 Virtual Environment，并排比较结果。
</Steps>

## 实用说明

* **收益在基金的真实收益交易重放时出现。** rebase 型代币的持有余额会自动增长。对于向注册持有人分配收益的基金，请追踪一个持有人头寸，以便分配落在该头寸上。
* **Cheatcodes 随同步一起暂停。** 在同步暂停期间完成所有设置（充值、建立头寸），然后再启动重放。
* **每个环境只有一个网络。** Network Mirror Mode 针对单一父网络运行；它不能与 [multichain Virtual Environments](/virtual-environments/multichain/overview) 组合使用。
* **重放受真实区块数量限制。** 覆盖较长的期间意味着重放大量区块。要快速捕获收益，可在已知的收益发放前不久处 fork，或重放一个有代表性的窗口后再年化。

## 后续步骤

* 追踪存储槽而非余额（**State drift → State → Track variable**），以跟踪重放期间任意合约变量的变化。
* 将 dapp 的 RPC 指向该 Virtual Environment，从您自己的 UI 驱动同一重放。参见 [Stage dapps](/virtual-environments/ci-cd/stage-dapps)。
* 阅读 [Network Mirror Mode](/virtual-environments/network-mirror-mode) 概念页面，了解同步机制、时间控制和 cheatcode 行为。
