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

# 创世重放

> 重新执行历史区块以重建状态

创世重放(Genesis replay)会重新执行历史区块,以便在任意时间点获得额外的状态副本。以往,区块以静态归档格式存储。该流程会下载这些区块并通过 EVM 重放它们以重建完整状态。

## 前置条件

* monad 版本 `0.12.3` 或更高
* 用于从您所选的归档来源(AWS、R2、MongoDB、MinIO 等)读取的凭证与配置。这些凭证与 `monad-archiver` 所使用的相同;详情请参阅[运行归档服务器](/zh/node-ops/archive-data/running-an-archive-server)。

## 设置

### 1. 准备区块数据库目录

选择一个目录用于存储 EVM 格式的历史区块。本指南将其称为 `block-db`。

### 2. 初始化 triedb

创建一个空的 `triedb`:

```bash theme={null}
monad-mpt \
    --storage /dev/triedb \
    --root-offsets-chunk-count 16 \
    --create-empty
```

### 3. 启动区块写入器

在 `tmux` 中运行或创建一个 systemd 服务以持续下载区块:

```bash theme={null}
monad-block-writer stream \
    --block-data-source <your source string> \
    --dest-path <your block-db path>
```

来源字符串使用与 `monad-archiver` 相同的格式,例如 `"aws mainnet-deu-009-0"` 或 `"mongodb ..."`。

区块写入器将:

1. 从数据源下载所有区块
2. 将其转换为 EVM 格式
3. 使用 Brotli 压缩数据
4. 将区块写入形如 `block-db/XM/<block_number>` 的子目录,其中 `X = block_number / 1_000_000`(每个目录一百万个区块)

**恢复行为:** 写入器会在 `block-db` 目录下保存一个 `latest` 文件。如果进程停止,下次启动时会读取 `latest` 并与 `--block-data-source` 中可用的最新区块进行比较,然后从该处继续。

<Tip>
  如果您只需要特定范围的区块,请运行 `monad-block-writer stream --help` 查看范围选项。
</Tip>

### 4. 配置重放服务

在 `monad-block-writer` 运行的同时,在另一个终端中为 `monad-execution` 添加以下 systemd 覆盖配置:

```bash theme={null}
sudo systemctl edit monad-execution
```

```ini theme={null}
[Service]
ExecStart=
ExecStart=/usr/local/bin/monad \
    --chain "$CHAIN" \
    --as_eth_blocks \
    --block_db <your block-db path> \
    --nblocks 0 \
    --db /dev/triedb \
    --no-compaction \
    --trace_calls \
    --block-db-timeout 60

AllowedCPUs=
CPUAffinity=
Restart=
Restart=always
```

<Note>
  请确保 `$CHAIN` 已在环境中定义。有效选项:

  * `ethereum_mainnet`
  * `monad_devnet`
  * `monad_testnet`
  * `monad_mainnet`
</Note>

**`--block-db-timeout`** 设置重放服务等待新区块出现在区块数据库中的秒数。如果超时后仍无新区块,重放服务将崩溃并由 systemd 重启。如果发生这种情况,请检查第 3 步中的区块写入器是否仍在运行并向磁盘写入区块。将其设为 `0` 可禁用重试。

### 5. 重新加载并启动

```bash theme={null}
sudo systemctl daemon-reload
sudo systemctl restart monad-execution
```

## 在重放主机上运行 RPC

如果您希望在此主机上运行 `monad-rpc`,则必须从 `monad-rpc` 的 systemd 配置中移除 `--ipc-path` 标志。
