ZooBC 维基
ZooBC 基础

创世区块

每条 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 起生效。

另见