版本锚点
ZooBC 发布版本可以附带一个版本锚点(也称脊链锚点):一个小的公开文件,以高度和哈希指定脊链中的一个区块。启动时,节点把自己的脊链与锚点比较,拒绝在与之矛盾的脊链上运行。锚点为一次安装提供了一个随软件本身一同到来的可信锚,因此伪造的脊链历史在节点基于它构建任何东西之前就会被拒绝。
锚点为什么有用
脊链是节点在两件事上所信任的锚:加载链状态的哪一个快照,以及哪些节点密钥属于注册表(见 快照与快速同步)。一个已经跟随链运行数月的节点有自己的历史,可以据此判断脊链。全新的安装则没有。它必须从某处开始,而如果攻击者能向它提供一整条伪造的脊链,例如用早已退出注册表的节点的旧密钥构建的脊链,就可能把它引向伪造的状态。
锚点堵住了这个缺口。它是运营者所安装的发布版本的一部分,因此新节点在与任何对等节点通信之前,就已经知道至少一个真实的脊链区块。任何不包含这个确切区块的脊链历史都会被拒绝。
锚点是什么
该文件名为 spine-pin.txt,放在节点数据库旁边。它只有一行:一个脊链高度,以及该高度脊链区块的 64 个字符的十六进制哈希。
其中没有任何秘密。它是一个公开的哈希,任何人都可以拿它与自己节点的脊链比较。没有这个文件就没有锚点,脊链的其他防御照常适用。
节点如何使用它
- 启动时,节点把自己存储的、位于锚定高度的脊链区块与锚点比较。如果哈希不同,说明节点处在一条分叉的或被篡改的脊链历史上,不会在其上运行。按照为 0.5.8 版本确定的规则,它随后会从网络重建自身。
- 运行时,与锚点相矛盾的脊链区块在到达时被拒绝。
- 脊链相互竞争时,节点永远不会把自己的脊链回滚到锚点以下。
发布版本如何使用它
发布版本携带锚点的方式受两条规则约束:
- 当发布版本列出了一个安装程序无法获取的锚点时,安装程序会停止。
- 之后的每个发布版本都锚定一个较新的脊链区块,使锚随链一起向前移动。
发布版本本身另有保护。发布机构在链上注册每个发布版本及其清单的哈希,安装程序会对照链上记录检查发布版本的签名和清单哈希,三分之二的席位可以否决一个发布版本(见 发布版本与更新 和 校验下载的文件)。
锚点不是什么
- 它不会把节点绑定到一个固定的对等节点:节点照常从其对等节点同步。
- 它不会冻结节点的软件:更新按运营者的选择继续进行。
- 它不包含任何密钥,无论私钥还是公钥:只有一个区块高度和一个区块哈希。
它在各项防御中的位置
锚点是抵御长程攻击(即试图从遥远的过去改写历史)的多项防御之一。运行中的节点受 720 个区块回滚上限和脊链检查点底线的保护(见 最终性与回滚);新节点则受脊链上三分之二联署签名、脊链自身关于哪些密钥加入和退出的记录,以及锚点的保护。见 参与证明能防御什么。