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

# Forkpoint

> 节点如何持久化共识状态并在启动时恢复

## 概要

Forkpoint 是共识状态的一份保存快照。它使节点能够从已知良好的点重启,而不必从创世块开始重放整个链。它包含节点重新加入共识所需的全部内容:它在区块树中的位置、进入下一轮所需的证明,以及验证该证明所用的验证者集合。

在磁盘上,forkpoint 就是您在安装和[恢复](/zh/node-ops/node-recovery)过程中处理的 `forkpoint.rlp` 和 `forkpoint.toml` 文件对。本页介绍这些文件的内容,以及节点如何在启动时使用它们来同步。

## Forkpoint 包含的内容

Forkpoint 包含三个字段:

* **`root`** — 节点区块树的根,指向其最高已提交的区块。同步从这里开始。
* **`high_certificate`** — 节点见过的最高法定人数证书 (QC) 或超时证书 (TC)。这是节点进入下一轮所需的证明。
* **`validator_sets`** — 用于验证这些证书的验证者集合。通常只有一个,对应当前 epoch。在 epoch 变更期间会有两个,以便节点可以在边界两侧检查证书。

当节点加载 forkpoint 时,它会先检查 `high_certificate` 是否可以根据 `validator_sets` 验证通过,然后才使用它。

## 启动同步

节点加载 forkpoint 后,通过三个步骤同步到网络最新块。

1. **获取到 root 的区块。** 节点使用 [blocksync](/zh/monad-arch/consensus/blocksync) 拉取包括 `root` 在内的 `2 × execution_delay` 个已提交区块。这些是在交易费机制下进行预留余额检查所必需的,并且它们必须先就位,状态才能同步。
2. **Statesync。** 节点将 [MonadDb](/zh/monad-arch/execution/monaddb) 更新到版本 `root − execution_delay`。在此期间,它监听新的提案并将它们暂存到缓冲区中。请参阅 [statesync](/zh/monad-arch/consensus/statesync)。
3. **重放。** 一旦两个同步都完成,节点根据 `root` 和 `high_certificate` 构建区块树,然后重放缓冲的提案以到达最新块。

需要明确的一点:blocksync 承担两种不同的工作。

* **在启动时**,它拉取位于 root *之后*(即 root 之前的历史)的区块,并且在 statesync 之前运行(上述步骤 1)。
* **在正常运行期间**,情况相反:statesync 使节点接近最新块,而 blocksync 获取最后几个区块以缩小差距,就像先进入体育场再找到自己的座位。这种追赶角色正是 [blocksync](/zh/monad-arch/consensus/blocksync) 页面所描述的。

共识在 `high_certificate.round() + 1` 处恢复,因此节点永远不会在它已经投过票的轮次上或以下轮次再次投票。正是这一点使得从 forkpoint 重启是安全的,而不会产生重复投票。

## Forkpoint 如何持久化

节点每次进入新一轮或最终确认一个区块时都会写入一个新的 forkpoint。新一轮不断出现,因此 `forkpoint.toml` 大约每一轮都会变化。

每次写入都会产生两个文件:

* **`forkpoint.rlp`** — 规范的、RLP 编码的形式。
* **`forkpoint.toml`** — 人类可读的、TOML 编码的形式。

节点会加载 `--forkpoint-config` 路径所指向的文件;打包的 systemd unit 指向 `forkpoint.toml`。

两者都是先写入临时文件,然后再重命名,因此写入过程中的进程崩溃不会损坏 forkpoint。每次写入还会保留一份备份副本,以 root 序列号和轮次为键,因此较早的 forkpoint 会保留下来以便恢复。
