ZooBC 维基
安全与架构

最终性与回滚

ZooBC 上的区块通过两种方式成为最终确定的区块。一旦它的深度超过 720 个区块(3 小时),任何与网络保持同步的节点都不会再回滚它。而一旦某个由三分之二席位联署的脊链区块把它或其后的某个区块指定为检查点,任何节点都完全不会在它以下进行重组,无论竞争分支声称有多大的权重。最终滞留在这些界限错误一侧的节点不会一直停在那里:它会宣告自己处于卡住状态,并从网络重建自身。

有硬性上限的回滚

ZooBC 节点跟随最重的分支(见 分叉选择与累计难度)。当节点得知一个更重的分支时,它会把自己最近的区块回滚到两个分支分叉的位置,然后应用另一分支的区块,并逐一检查。回滚会根据带版本的行,把每张状态表恢复到目标高度,被移除区块的 coinbase 也包括在内。

这种回滚有一个硬性上限 max_rollback_height:mainnet 上为 720 个区块,按每 15 秒一个区块计算即 3 小时;devnet 上为 60 个区块(15 分钟)。需要更深回滚的分支无论权重多大都会被拒绝。

这一上限是安全的,因为节点从不盲目回滚。它在动自己的链之前,会先获取竞争分支并衡量其权重:找到真正的分叉点,在下载任何内容之前检查深度,逐页衡量分支的权重,在有限次数的尝试后放弃,并且只有在证实该分支更重之后才会回滚。

情形 1:分叉位于最近 720 个区块之内,回滚并应用更重的分支。情形 2:深于 720 个区块的分叉被拒绝;被切断更久的节点进入卡住状态,并在对等节点确认更重的分支后从脊链快照重建。
情形 1:分叉位于最近 720 个区块之内,回滚并应用更重的分支。情形 2:深于 720 个区块的分叉被拒绝;被切断更久的节点进入卡住状态,并在对等节点确认更重的分支后从脊链快照重建。

检查点底线

脊链增加了第二重、更强的保证。每个脊链区块指定一个主链参考区块,并通过其哈希和权重(而不仅仅是高度)精确锁定它。一旦节点存储了一个联署签名足够的脊链区块,该参考高度就成为该链的最终确定高度。

任何重组都不会越过它。对于分叉点位于最终确定高度以下的分叉,节点在获取任何一个区块之前就会拒绝;如果之后被要求移除该高度以下的区块,它会再次拒绝。一个脊链区块需要三分之二已注册席位的联署签名,并且每个签名者都会先把其内容与自己的链核对,因此检查点是注册表整体的声明。每个诚实节点一经存储就将其视为最终确定,无需等待更多脊链区块。

为什么检查点比回滚上限更深

这里有两个数字交汇。节点最多可以回滚 720 个区块。而脊链检查点,就像它所指定的快照一样,描述的是链顶以下 760 个区块处的链(main_snapshot_min_height)。

如果检查点比回滚上限更浅,脊链就可能承诺一个合法重组仍可能替换掉的区块,已签名的检查点与大家所跟随的链就会不一致。因此创世构建器要求 main_snapshot_min_height 比 max_rollback_height 至少大 20 个区块。Mainnet 使用 760 对 720,余量为 40 个区块;devnet 以 80 对 60 保持同样的结构。检查点所指定的每个区块都已超出任何允许的回滚范围。

一把从链顶向后量的尺子:0 至 720 个区块仍可能被回滚,720 至 760 是至少 20 个区块的余量,760 处的检查点和快照标示出已最终确定的部分。Devnet:回滚 60,深度 80。
一把从链顶向后量的尺子:0 至 720 个区块仍可能被回滚,720 至 760 是至少 20 个区块的余量,760 处的检查点和快照标示出已最终确定的部分。Devnet:回滚 60,深度 80。

滞留的节点:卡住与重建

被切断时间超过回滚上限的节点可能会发现,网络的其余部分已经跟随了一个它够不到的更重分支。它不会回滚到那个分支,也不会永远独自继续下去。

当至少三个已注册的对等节点确认存在一个够不到的更重分支时,节点会宣告自己处于卡住状态,并停止在自己的分支上出块。节点自身的卡住检测器(一条本地规则)也会留意以下情况:在同一高度上,针对至少 2 个对等节点,在至少 1,800 秒(30 分钟)内连续 10 次分叉处理失败。当 auto_resync 开启时(从 0.5.8 版本起为默认设置),卡住的节点会丢弃本地链,并从网络重建,起点是脊链检查点和快照(见 快照与快速同步)。

陈旧节点跟随注册表

链顶距今已超过 7,200 秒(2 小时)的节点,不会信任任意一个自称领先的对等节点。它会跟随已注册对等节点样本中至少三分之二所报告的链顶(n 个对等节点中至少 ceil(2 × n / 3) 个,且 n 至少为 3)。

与概率最终性的比较

在工作量证明中,对一个区块的信心随其深度增长,但永远不会变成确定;比特币用户常常等待六个区块,才把一笔付款视为已结算。ZooBC 用规则取代了这种习惯:3 小时的硬性回滚上限,以及大约每天一次的联署检查点,检查点以下的历史不会改变。代价是,在少数分支上被切断超过 3 小时的节点无法通过回滚切换回来,而是改为重建。

另见