优先轮次、空区块与前一个出块者
有两条规则决定被抽中的出块者可以在区块中放入什么,以及何时可以。只有前十个轮次的出块者可以包含交易;后面的出块者只能产出空区块。此外,产出前一个区块的节点在下一次抽签中会被降级,因此它只能作为较晚的后备者产出下一个区块。这两条规则让链无论发生什么都能继续前进,同时把重要的选择留给抽签排在最前面的出块者。
优先轮次
每个出块者都有一个位次:指定它的那次抽签的序号,从 0 开始计数。参数 max_priority_blocksmiths 为 10,因此:
- 位次 0 到 9,即第 1 到第 10 轮,可以携带交易;
- 从位次 10 起(第 11 轮及以后),区块必须不含任何交易。它仍然可以携带回执。
这条规则在区块产出时、在每个节点的候选区块池中,以及由每个验证者进行检查。包含交易的迟到区块会被拒绝。
这条规则平衡了两个目标。活性永远不依赖于排名靠前的出块者在线:即使许多被抽中的节点都宕机,名单上更靠后的某个节点也能让链继续增长。但挑选交易的权利仍留在优先级最高的出块者手中,因此排名靠后的节点抢先把一个满载的区块、或一个装着精心挑选的交易的区块推上链,并不能得到任何好处。
空区块是完整的区块
空区块完全有效。它携带其出块者赚得的回执,因此出块者的转发工作仍然计入其参与分数。它也像其他任何区块一样,支付按其时间安排的 coinbase:从 0.5.8 版本起,每个区块的 coinbase 都必须与发行计划完全一致,因此 coinbase 抽奖 永远不会漏过任何区块(见 供应量与发行)。
待处理的交易不会丢失。它们在节点的交易池中等待下一个其出块者可以包含它们的区块。
前一个出块者被降级
区块 N 的出块者仍留在区块 N+1 的抽签中,但其抽签结果被视为不早于第 10 轮,即最后一个可以携带交易的轮次。它的区块权重也以同样方式设上限:在权重公式中,它的抽签次数 k 永远不小于 10,因此如果它确实作为后备者产出了区块 N+1,该区块最多只增加第一轮区块十分之一的权重(见 分叉选择与累计难度)。实际上,只要有其他被抽中的节点能够出块,区块 N+1 就由那个节点产出。
降级不是惩罚。被降级的抽签绝不会被算作错过轮次,节点保留其席位和分数。
为什么不让它连续出块两次?
区块 N+1 的种子用于裁定依赖于区块 N 的抽签,例如链上游戏和投注的结果(见 区块种子(VRF) 和 ZooBC 上的应用)。同时产出这两个区块的节点会同时掌握一个区块的内容和裁定这些内容的种子。规则是:只要还有其他节点能够应答,任何人都不应同时拥有一笔投注和裁定它的种子。
为什么不把它移出抽签?
移除前一个出块者会使只有两个节点的链在两个节点之间严格交替出块,并使只剩一个正常工作节点的链完全无法出块。由于是降级而非移除,前一个出块者仍是最后的出块者:如果没有其他人交出区块,它仍可以从第 10 轮起产出该区块,而第 10 轮的目标时间是前一个区块之后 150 秒。链永远不会因为这条规则而停止。