节点的密钥
ZooBC 节点运营者使用两把密钥。节点密钥是机器的身份:它存放在节点上,为节点全天所做的工作签名。所有者密钥是运营者钱包中的一个普通账户:它控制席位和质押。两者分开保管,意味着服务器被入侵并不会交出运营者的钱包。
节点密钥
节点密钥是一把 32 字节的 Ed25519 密钥,书写时带有前缀 ZNK_。它保存在节点的配置文件 node.conf 中,签署以下内容:
- 节点产出的区块,以及每个区块种子背后的证明(见 区块种子(VRF));
- 它从对等节点收到的区块和交易的回执(见 回执与网络拓扑);
- 发给对等节点的消息,包括开启每个连接的握手;
- 它在脊链上的签名;
- 见证和投票,例如价格投票和对发布版本的否决;
- 它持有去中心化存储分片的证明(见 去中心化存储池)。
由于 node.conf 存有私钥,如果机器上的其他用户能读取该文件,节点会拒绝启动;当文件归节点所有时,节点会自行将文件权限设为 0600。
节点自己的账户
同样的 32 个字节加上前缀 ZBC_ 书写,就是一个普通账户:节点自己的账户。它以恰好为 0 的手续费发送节点的职责交易,例如存储证明、见证和投票(见 手续费)。每个创世席位的这一账户初始有 10 ZBC。
同一把密钥的两种文本在前缀之后的前 51 个字符相同,只有最后五个字符不同,因为末尾 3 字节的校验和也覆盖了前缀。因此,手动把 ZNK 换成 ZBC 会破坏校验和,修改后的文本会被拒绝(见 账户与地址)。
所有者密钥
所有者密钥是运营者钱包中的一个普通 ZBC_ 账户。它签署注册表交易:
- NodeRegistration(类型 2),注册节点并锁定其质押;
- 增加质押;
- NodeRegistrationUpdate(类型 258),将席位转移到新的节点密钥;
- RemoveNodeRegistration(类型 514),移除节点;
- ClaimNodeRegistration(类型 770),认领质押。
质押来自这个账户,节点的抽奖奖金也支付回这个账户。节点从不持有其所有者的密钥。
绑定在一起:所有权证明
注册需要两把密钥。节点密钥对一条写明所有者账户和一个近期区块的简短消息签名,所有者密钥则对携带这条消息的交易签名。任何一把密钥都无法单独注册这一对,也没有人能把别人的节点注册到自己的账户名下。增加质押和认领质押时也需要同样的证明。其确切格式见 注册节点。
两把密钥都由运营者自己创建。没有任何东西是签发的,也没有其他人持有副本。
将席位转移到新的节点密钥
如果节点密钥泄露,或者更换了机器,所有者可以将席位转移到新的节点密钥,而无需重新注册。NodeRegistrationUpdate 携带新的 32 字节密钥,以及一份由新密钥签名的所有权证明。节点保留其 id、分数、队列状态和准入资格。该变更在包含它的区块之后 120 个区块(30 分钟)生效。
节点密钥也能转移质押
要像保管钱包密钥一样小心地保管节点密钥。任何持有它的人都可以用 ClaimNodeRegistration 把席位的质押认领到自己控制的账户。所有者本人的认领按移除处理,同样有 7 天的冷却期。其他任何人的认领则先公告,并在 40,320 个区块(7 天)之后执行,除非所有者先移除节点,因此关注链的所有者有一周的时间作出反应(见 退出注册表)。这也是失去所有者账户访问权的所有者可走的途径:此时认领来自另一个账户,因此同样在 7 天之后执行。
其他密钥
原生密钥可以沿 m/44'/883'/n' 从助记词派生,同一把 32 字节密钥也可以写成中继密钥(ZBR_)或网关密钥(ZBG_)(见 密钥与账户类型)。协议的四把角色密钥(发布机构、页面机构、国库和做市商)是存放在不同设备上的不同密钥(见 ZooBC Foundation);运营者一把都不需要。