区块与时间
ZooBC 在每个网络上都大约每 15 秒向链上添加一个区块。协议以区块来计量时间:当规则说“一天”时,指的是 5,760 个区块。了解这个换算,本维基上的大多数数字就很容易读懂。
每 15 秒一个区块
15 秒的间隔是每条链创世中的一个参数(min_block_interval),在 devnet、testnet 和 mainnet 上都相同。每个区块之后,都会进行一次抽签,按顺序指定可以产出下一个区块的节点(抽签)。第一个被抽中的节点拥有第一轮,其目标时间是前一区块之后 15 秒。如果它迟到或离线,被抽中下一轮的节点可以在 15 秒后产出该区块,依此类推,因此某个出块者缺位只会推迟一个区块,而不会让链停下(轮次、时间与窗口)。
在父区块之后不到 13 秒到达的区块会以“出块过快”为由被拒绝,因此没有出块者能让链加速。
空区块依然有用
无论是否有人发送交易,区块都会持续产生。没有交易的区块仍然在做事:
新 ZBC 的释放跟随时钟,而不是区块数:一个区块的 coinbase 是 15 年发行计划在前一区块时间戳与本区块时间戳之间释放的数量(供应量与发行)。一段较慢的区块不会让一天中铸造的币变少,一阵快速出块也不会让铸造的币变多。
以区块计的时长
由于间隔是固定的,协议把时长写成区块数。下面是常用的换算,以及本维基各处出现的一些时长(mainnet 的数值):
| 区块数 | 时间 | 出现之处 |
|---|---|---|
| 120 | 30 分钟 | 节点密钥更换生效之前的延迟(节点的密钥) |
| 240 | 1 小时 | 一个存储证明纪元(去中心化存储池) |
| 720 | 3 小时 | 回滚上限(最终性与回滚) |
| 2,880 | 12 小时 | 节点少于 2,880 个时分数时钟的单位(错过轮次、暂停与除名) |
| 5,760 | 1 天 | 排队节点的出勤窗口(队列) |
| 11,520 | 2 天 | 自动更新的节点安装发布版本之前的默认等待时间(发布版本与更新) |
| 40,320 | 1 周 | 节点质押退出时的冷却期(退出注册表) |
| 172,800 | 30 天 | 一个快照周期,也是账户租金和价格投票的周期(账户租金与清理、价格投票) |
有几个限制则以秒计,因为它们比较的是时间戳。例如,一笔交易默认可以在其自身时间戳之后最多一小时内被打包进区块(有效期与时间戳)。
脊链:每天一个区块
除主链之外,每个节点还保存脊链,这是一条缓慢的、由检查点构成的伴随链,不携带任何交易(脊链)。它在 testnet 和 mainnet 上每天产生一个区块(每 86,400 秒),在 devnet 上每小时一个。每个脊链区块都由已注册节点联署,并指定一个位于 760 个区块(3 小时 10 分钟)深处的主链区块,从而为主链设定一条任何重组都不得越过的底线(最终性与回滚)。
Devnet 的时间参数
Devnet,即开发网络,保留 15 秒的区块间隔,但缩短了上述许多时长,例如回滚上限(60 个区块)和快照周期(240 个区块),使它们的效果在几分钟或几小时内就能显现。Testnet 和 mainnet 使用相同的数值。完整的对比见 devnet、testnet 与 mainnet。