三分之二规则
ZooBC 上发生的大多数事情根本不需要投票:每个区块由一个被抽中的出块者签名,每个节点都会检查它。但有些决定代表整个注册表:使历史最终确定的检查点、为另一条链上的存款而铸造的币、对有缺陷的发布版本的否决。对于这些决定,ZooBC 使用同一个门槛:三分之二的已注册席位。有 11 个席位时,就是 8 个。
三分之二适用于哪些场合
| 决策 | 需要什么 |
|---|---|
| 存储一个脊链区块 | 完整签名者名单中 67% 的联署签名,向上取整(11 个中的 8 个);只有在 3 个脊链周期都没有脊链区块之后才降为过半数(11 个中的 6 个);永远不少于 5 个 |
| 为跨链桥存款入账、放行跨链桥提款 | 注册表中三分之二的见证,每个见证都用节点密钥签名 |
| 超过每日上限的跨链桥铸造 | 每个未被暂停的席位 |
| 裁定触发付款的预言机事实 | 活跃注册表中三分之二见证同一个值 |
| 否决一个发布版本 | 三分之二的已注册席位见证否决 |
| 更换发布机构 | 同样的三分之二法定人数,只有在其最早的一票满一周后才计入 |
| 启用一组新规则 | 至少三分之二的已注册出块者最近用新版本产出过区块 |
更详细地说:
- 脊链区块。 门槛是 max(
spine_min_signatures, ceil(n × 67 / 100)),其中 n 是脊链签名者名单上的席位数:即名单的 67%,向上取整。每个签名者在签名之前都会把区块内容与自己的链核对。见 脊链。 - 跨链桥。 其规则从 0.5.8 版本起就是节点的一部分。节点旁边运行的守护者程序会监视另一条链上的保管地址,并以免手续费的见证进行投票。当三分之二的计入席位(即未被暂停的已注册节点)见证了相同的代币、金额和接收方时,存款会按一比一铸造,不收跨链桥手续费。如果一种币一天内的铸造量将超过“一整枚币”与“其供应量的 10%”两者中的较大者,则需要每个未被暂停的席位同意。各条链以 0.5.8 版本重新启动时,不会启动跨链桥服务。见 跨链桥与封装币。
- 预言机事实。 已注册节点见证事件;当活跃注册表中三分之二见证同一个值时,该事件即被裁定,并向每个指向它的待处理触发器付款。见 触发器与见证。
- 发布版本。 由三分之二席位见证的否决会撤销一个发布版本,效果与发布机构自己撤销完全相同。指定新发布机构的投票,只有在其最早的一票满一周(40,320 个区块)之后才计入,这样现任持有者能预先看到它的到来。见 发布版本与更新。
- 就绪门槛。 一组新的共识规则只有在以下条件满足后才会启用:在最近 max(720, 5 × n) 个区块的窗口内,至少有 ceil(2 × R / 3) 个不同的已注册出块者用新版本产出过区块;并且不早于该发布版本注册满一天。其中 R 是未被暂停的已注册席位数,n 是已注册节点数。
被暂停的席位如何计算
从 0.5.8 版本起,被暂停的席位(见 错过轮次、暂停与除名)退出每一项三分之二计数:它们既不投票,也不计入总数。脊链是唯一一个有意为之的例外。它继续计入其签名者名单上的每一个席位,无论是否被暂停,从而使脊链检查点始终代表全部席位的三分之二。
注册表下限
覆盖整个注册表的决定还有一个下限:当注册表的席位数或不同所有者账户数少于 max(3, min_registry_size) 时(mainnet 上为 7),任何覆盖整个注册表的见证都不会得到裁定。就所有者数量而言,同一运营者的两个席位只算一个声音。
哪些事项不需要三分之二
- 普通区块。 由种子抽中的一个出块者签名,每个节点都会检查它(见 抽签)。
- 可投票的价格,例如账户租金或转账手续费。每个周期一次,每项价格移动到计入席位投票的平均值,每一票事先都被限制为最多上调 20% 或下调一半(见 价格投票)。
节点自己做的一些检查也使用三分之二或接近三分之二的门槛,但它们是本地策略,而非共识:链顶陈旧的节点跟随已注册对等节点样本中三分之二所报告的链顶;快照检查的扩大轮次需要三分之二的应答对等节点一致(见 快照与快速同步);节点的分叉投票需要至少 0.66 的参与投票的对等节点,略低于三分之二。
三分之二的另一面
三分之二的门槛意味着,只要略多于三分之一的席位联合起来,或者干脆不投票,就能阻止一项决定。对于脊链,这一点因三个空闲周期后降为过半数的后备规则而得到缓和。就绪门槛没有截止期限:略多于三分之一的席位就能阻止一次升级。