Skip to main content

概要

Forkpoint 是共识状态的一份保存快照。它使节点能够从已知良好的点重启,而不必从创世块开始重放整个链。它包含节点重新加入共识所需的全部内容:它在区块树中的位置、进入下一轮所需的证明,以及验证该证明所用的验证者集合。 在磁盘上,forkpoint 就是您在安装和恢复过程中处理的 forkpoint.rlpforkpoint.toml 文件对。本页介绍这些文件的内容,以及节点如何在启动时使用它们来同步。

Forkpoint 包含的内容

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

启动同步

节点加载 forkpoint 后,通过三个步骤同步到网络最新块。
  1. 获取到 root 的区块。 节点使用 blocksync 拉取包括 root 在内的 2 × execution_delay 个已提交区块。这些是在交易费机制下进行预留余额检查所必需的,并且它们必须先就位,状态才能同步。
  2. Statesync。 节点将 MonadDb 更新到版本 root − execution_delay。在此期间,它监听新的提案并将它们暂存到缓冲区中。请参阅 statesync
  3. 重放。 一旦两个同步都完成,节点根据 roothigh_certificate 构建区块树,然后重放缓冲的提案以到达最新块。
需要明确的一点:blocksync 承担两种不同的工作。
  • 在启动时,它拉取位于 root 之后(即 root 之前的历史)的区块,并且在 statesync 之前运行(上述步骤 1)。
  • 在正常运行期间,情况相反:statesync 使节点接近最新块,而 blocksync 获取最后几个区块以缩小差距,就像先进入体育场再找到自己的座位。这种追赶角色正是 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 会保留下来以便恢复。