准入节奏
ZooBC 每次只向其节点注册表准入一个新节点,所依据的计时器刻意走得很慢。运营者在出块中所占的份额就是其所占席位的份额,因此赢得席位的节奏,也就是任何人获得对链的控制力的节奏。这一节奏由协议固定,任何人都可以监督。
为什么要慢
在工作量证明下,出块份额可以像购买硬件一样快速买到;在权益证明下,则像购买币一样快。在 ZooBC 中,这一份额必须经由准入获得,每个准入周期一个节点,速度由协议设定。因此,突然夺取控制权(例如为了撤销一笔支付)在原理上就不可能,而不仅仅是代价高昂(见 参与证明能防御什么)。
这种慢与链的速度无关。新节点可以从近期快照启动,而不必从全部历史开始;没有人面试运营者;无论有多少节点,链都每 15 秒产出一个区块。
公式
两次准入之间的延迟为:
delay = clamp(base ÷ counted seats, minimum, maximum)
在 mainnet 上,基数为 600 天,最小值为 7 天,最大值为 90 天。Testnet 使用相同的数值。第一个新加入者最早可在创世后 7 天获得准入。计时器读取区块时间戳,每个周期最多准入一个节点,而且绝不在让该节点进入队列的那个区块中准入它。准入哪个节点由队列决定。
到下一次准入的延迟在一个新加入者获得准入时确定,计数的是该新加入者之前的席位。
哪些席位计入
- 创世席位最多计为 11 个(这是一个创世参数,在每条链上都是 11)。
- 新加入者全额计入。
- 被暂停的席位在两组中都不计入。
这一上限防止庞大的创世集合让注册表快速开放。如果没有上限,一条以 100 个创世席位启动的链会算出 600 ÷ 100 = 6 天,再提升到 7 天的最小值,从一开始就每周准入一个新加入者。有了上限,计数从 11 开始,时间表与一条拥有 11 个席位的链相同。不计入被暂停的席位,意味着只有正在工作的席位决定节奏。
时间表
如果队列从不为空且没有人离开,新加入者的到来时间如下:
| 新加入者 | 大约到来时间 |
|---|---|
| 第 1 个 | 第 7 天 |
| 第 2 个 | 第 61.5 天 |
| 第 7 个 | 第 278 天 |
| 第 11 个 | 第 408 天 |
也就是说,第一年有 9 个新加入者,到第 2 年末有 25 个,到第 3 年有 54 个,到第 5 年约有 155 个。从 86 个计入席位起,600 ÷ 86 不足 7 天,于是最小值开始生效:大约从第 77 个新加入者起,即创世后约 3.5 年,准入变为每周一次。一个赢得每一次准入的申请者,要到大约第 437 天才会持有它的第 12 个席位,足以在数量上超过 11 个创世席位。
在由基数项决定延迟的阶段,注册表在每单位时间内按固定比例增长,因为每次准入增加一个席位,而延迟等于基数除以席位数。因此,无论注册表规模多大,使其翻倍大约都需要基数 × ln 2 的时间,在 mainnet 上约为 416 天。
特殊情况
- 小型注册表。 当活跃节点少于
min_registry_size(mainnet 上为 7)个时,最大延迟被限制为 7 天。 - 长时间停滞之后,计时器准入一个节点,然后恢复正常节奏。
- Devnet(开发链)使用相同的公式,基数为 180 秒,最小值为 60 秒,最大值为 300 秒,因此其准入间隔只有几分钟。
所有输入都在链上,因此任何人都可以重新计算下一次准入何时到期。