ZooBC 维基
参与证明 (PoP)

轮次、时间与窗口

ZooBC 的目标是每 15 秒产出一个区块。每个区块之后,时间被切分为 15 秒的轮次,抽签为每一轮指定一个出块者。区块的时间戳决定它落在哪一轮,只有在该轮或前一轮被抽中的节点才可以产出它。这条规则给链一个稳定的节奏,并确保一个缺席的出块者只会让下一个区块延迟 15 秒,绝不会更多。

轮次与目标时间

设 P 为前一个区块的时间戳。第 r 轮的目标时间为 P + 15 × r:第 1 轮在前一个区块之后 15 秒,第 2 轮在 30 秒,第 3 轮在 45 秒,依此类推。第 1 轮的出块者力求在其目标时间为区块盖上时间戳。如果它保持沉默,就由第 2 轮的出块者产出区块,目标为 30 秒;名单上的后续出块者依此类推。

高度从不被跳过。当一个出块者缺席时,下一个区块只是晚 15 秒到达,高度相同,由顺位的下一个出块者产出。每个在实际出块者之前被抽中的节点都会记一次错过轮次(见 错过轮次、暂停与除名)。

前一个区块之后的时间线:+15 秒的第 1 轮保持沉默,记一次错过;+30 秒的第 2 轮产出区块;不需要第 3 轮。
前一个区块之后的时间线:+15 秒的第 1 轮保持沉默,记一次错过;+30 秒的第 2 轮产出区块;不需要第 3 轮。

每个出块者有两个轮次

在第 i 轮被抽中的出块者可以产出第 i 轮或第 i + 1 轮的区块。因此,迟到的第 1 轮节点仍可以在第 2 轮期间交出区块,而此时第 2 轮节点同样有资格。在任何时刻都有两个被抽中的节点有资格出块,链从不等待单个节点。链也不会等待任何节点被暂停:暂停需要连续错过四次,而且只是把节点排除在未来的抽签之外。

第 1、2、3 轮分别是围绕 +15 秒、+30 秒和 +45 秒的区间;第 1 轮节点仍可以在第 2 轮期间交出区块,而第 2 轮的替补在 +30 秒盖上时间戳。
第 1、2、3 轮分别是围绕 +15 秒、+30 秒和 +45 秒的区间;第 1 轮节点仍可以在第 2 轮期间交出区块,而第 2 轮的替补在 +30 秒盖上时间戳。

时间戳落在哪一轮

在时间 T 盖上时间戳的区块,其轮次为:

round(T) = 1 + floor((T − P − 15 + 7) / 15)     (and never less than 1)

每一轮还有一个 14 秒的接受窗口,从其目标时间前 7 秒到目标时间后不足 7 秒。按整秒计:

轮次目标时间公式计入的秒数接受窗口(目标时间 ± 7 秒)
1P + 15至 P + 22P + 8 至 P + 21
2P + 30P + 23 至 P + 37P + 23 至 P + 36
3P + 45P + 38 至 P + 52P + 38 至 P + 51
4P + 60P + 53 至 P + 67P + 53 至 P + 66

公式分配给每一轮的最后一秒(P + 22、P + 37、P + 52……)比该轮的窗口晚一秒。验证者在对照区块所在轮次的窗口检查其时间戳时有 2 秒的容差,因此这些接缝处的秒数也会被接受。

轮次在两方面有意义。它决定谁可以产出该区块,并为该区块在分叉选择中的权重设定上限:区块的权重永远不会优于其时间戳所落入的轮次,因此在第 2 轮被抽中、时间戳却落入第 3 轮的出块者,其权重不超过一个第 3 轮区块。

从父区块 P 开始的时间轴,第 1 到第 4 轮为相邻的区间;P + 50 的时间戳落在第 3 轮,因此其权重至少按 3 次抽签计算。
从父区块 P 开始的时间轴,第 1 到第 4 轮为相邻的区间;P + 50 的时间戳落在第 3 轮,因此其权重至少按 3 次抽签计算。

每个节点都执行的时钟规则

  • 时间戳距其父区块不足 13 秒的区块会因出块过快而被拒绝(15 秒的间隔减去 2 秒的容差)。因此,一发现空档就立即盖戳出块是不可能的。
  • 时间戳比节点自身时钟超前 7,200 秒(2 小时)以上的区块,会被该节点拒绝,直到其时钟赶上为止。
  • 在停滞超过一小时之后(3,600 秒的恢复限制),只要区块来自抽签所预期的出块者,它仍会被接受,因此已停止的链可以重新启动。

这里涉及两种窗口。在第 i 轮被抽中的出块者必须在该轮的创建窗口内为其区块盖上时间戳,该窗口从该轮目标时间前 7 秒到目标时间后 27 秒,会延伸到下一轮。验证者还要求时间戳位于其所落入轮次的接受窗口内,并有 2 秒的容差。

本地时间策略

有两项时间安排属于每个节点自己的策略,而不是共识规则。第一个被抽中的出块者在 P + 15 发送其区块;其他出块者在其轮次窗口结束前 5 秒发送(且从不早于 P + 15)。另外,大约每秒一次,每个节点会在其持有的候选区块中,应用窗口已开启且位次最低的那个区块。

作为比较,比特币的目标是每十分钟一个区块。ZooBC 的 15 秒节奏在每条 ZooBC 链上都相同:一天为 5,760 个区块(见 区块与时间)。

另见