创世区块
每条 ZooBC 链都始于一个创世区块,即区块 0。它不是一条消息,也不携带任何交易:它代表链的全部起始状态,从有资金的账户到每一项共识参数。所有这些都被提交到一个哈希中,而这个哈希就是链的身份。哪怕只改动一个余额,你得到的就是另一条链。
由一份配置构建
链是根据一个配置文件离线创建的。不存在创世交易:配置就是状态。它设定:
- 有资金的账户及其余额,包括为 应用池 提供资金的应用国库(如有);
- 创世代币及其余额:每条链都有相同的 14 种创世币,例如 ZUSD 和 ZBTC(代币与市场);
- 归属计划;
- 已注册节点,即创世席位:每条链 11 个,由 ZooBC Foundation 持有,每个节点自己的账户上各有 10 ZBC 的运营余额;
- 共识参数(从区块间隔到起始价格),以及每条规则的激活高度;
- 具有角色的密钥,例如发布机构(发布版本与更新),以及跨链桥封装币的保管地址(跨链桥与封装币)。
创世构建器会把每一笔入账加总,如果总额会超过 33,333,333.33333333 ZBC 的供应上限,就拒绝写出该创世。它没有分配出去的部分成为 coinbase 池,在 15 年内释放(供应量与发行)。高度 0 和 1 不支付 coinbase。
整个起点只有一个哈希
构建器把所有重要内容折叠进一个配置哈希。创世哈希随后由区块的版本、高度、时间戳、一个全零的前一哈希和该配置哈希派生而来。创世区块本身携带全零的种子、出块者密钥、签名和前一哈希,它的哈希是由配置派生出的那个值,而不是对其自身字节计算的哈希。有两个值会被读取但不被提交:total_supply 和 node_operating_balance。
改动任何一个被提交的值,都会得到新的创世哈希,从而形成一条不同的链。
链的身份
创世哈希是链唯一的身份:不存在网络 id 字节。
- 节点在连接时比较创世哈希,并拒绝哈希不同的对等节点。
- 每个交易签名都覆盖它。签名者签署的是 SHA3-256("ZBC-TX" ‖ 创世哈希 ‖ 未签名的交易字节),因此为一条链签名的交易在其他任何链上都无效(链绑定签名)。
- 节点在
/api/v1/node/info中以genesis_hash报告它,因此钱包能分辨自己正在与哪条链通信。 - 重新启动的测试网络会得到一个新的哈希。
这就是 devnet、testnet 和 mainnet 既不共享余额、也不共享签名的原因(devnet、testnet 与 mainnet)。
节点从不自己构建创世:它启动时,区块 0 必须已经在其数据库中(运行节点)。
没有主密钥
创世中不包含任何日后可以改写链的密钥。规则和参数只会通过两种途径改变:一是新的发布版本,它们携带各条规则开始适用的高度;二是注册表席位在限定范围内的价格投票(价格投票)。没有任何密钥能通过签署一条消息来更改规则、参数或余额;如果节点二进制文件与为其所在链记录的规则高度不一致,它会拒绝运行。从 0.5.8 版本起,全部 121 条共识规则都从高度 0 起生效。