节点注册表及其席位
节点注册表是链上允许产出 ZooBC 区块的节点列表。每个条目是一个席位。在参与证明中,决定谁出块的是席位,而不是币或硬件:运营者产出下一个区块的机会等于其所占席位的份额。对注册表的每一次变更都是一笔由每个节点验证的交易,任何人都可以读取它。
席位记录什么
对于每个节点,注册表保存:
- 节点 id,一个由节点密钥派生的数:将其前 8 个字节按小端序读作整数,并清除最高位;
- 节点密钥,一把为节点的工作签名的 32 字节 Ed25519 公钥(见 节点的密钥);
- 所有者账户,注册并控制该节点的普通账户;
- 注册高度,节点注册时所在的区块;
- 锁定的质押,所有者作为保证金锁定的 ZBC;
- 状态:已注册(活跃)、排队中或已删除。
节点的参与分数与之并列保存。注册表按区块高度保存版本,因此任何过去高度上的成员构成都可以重建,而每个区块都依据前一区块时的注册表来判定。
为什么是席位
在工作量证明下,出块份额可以像购买硬件一样快速买到;在权益证明下,则像购买币一样快。在 ZooBC 中,它是席位的份额,而席位按协议设定的节奏逐个准入(见 准入节奏)。因此,出块的多数份额无法被快速买下。参与证明与 PoW、PoS 的比较 将三种设计并列比较。
出块者抽签在未被暂停的已注册席位上均匀进行(见 抽签)。无论其所有者锁定了多少,每个席位被抽中的可能性都相同。在 30 个席位中持有 3 个的运营者,大约每十个区块产出一个,无论它的每个席位锁定的是 100 ZBC 还是 10,000 ZBC。
质押的作用
如果质押买不到区块,那它有什么用?
- 它为等待加入的节点队列排序,依据是质押乘以等待时间(见 队列)。
- 它让每个席位都有成本:新加入者必须至少锁定入队最低额(见 注册节点)。
- 它是一笔保证金。如果节点被除名,或在缺席或被暂停时离开,就会损失其中的十分之一;这十分之一进入长效池,长效池支付给正在工作的节点(见 退出注册表)。
质押本身不产生任何收益。奖励同样不考虑质押:coinbase 抽奖按参与分数加权,而只有真正的工作才能提高参与分数(见 成熟与收益)。
创世席位与新加入者
每条链都从 11 个由 ZooBC Foundation 持有的创世席位开始。它们在高度 0 写入注册表,没有锁定的质押,默认分数为 20%,每个节点自己的账户上有 10 ZBC 的运营余额。其他所有人都通过队列加入:没有人挑选申请者,也没有审批步骤。也不存在固定的日程:两次准入之间的间隔取决于计入席位的数量。注册不会过期。
席位的状态如何变化
| 从 | 到 | 原因 |
|---|---|---|
| (无) | 已注册 | 创世,在高度 0 |
| (无)或已删除 | 排队中 | 注册 |
| 排队中 | 已注册 | 准入 |
| 已注册 | 已删除 | 除名、所有者移除或认领 |
| 排队中 | 已删除 | 移除、认领或因缺勤被移出队列 |
暂停不是一种状态。被暂停的节点仍是“已注册”,但在它恢复之前被排除在出块者抽签之外(见 错过轮次、暂停与除名)。
读取注册表
注册表是公开的,读取它不需要任何密钥:
GET /api/v1/nodes?status=all列出每个席位及其所有者和注册高度;创世席位的注册高度保持为 0。GET /api/v1/nodes?status=queued列出队列,包括每个节点的质押和注册高度。GET /api/v1/blockchain/rules列出生效中的规则。
它不是钱包列表:普通账户无需注册即可持有或发送 ZBC。