跨链桥与封装币
跨链桥把 ZooBC 与比特币和以太坊连接起来。存入这些链上保管地址的币,会一比一地以封装币的形式出现在 ZooBC 上,也可以按同样的方式送回。没有任何单一方运营它:由已注册节点投票,只有当未被暂停的席位中有三分之二同意时,链才会铸造或销毁。
跨链桥从 0.5.8 版本起就是 ZooBC 的一部分:守护者见证存款和提款,链根据它们的投票铸造和销毁封装币。各条链以 0.5.8 版本重新启动时,不会启动跨链桥服务。
桥接币
十四种创世币中有四种是桥接币:
| 币 | 代表 |
|---|---|
| ZBTC | 比特币 |
| ZETH | 以太币 |
| ZUSDC | USDC,以太坊上的一种 ERC-20 代币 |
| ZUSDT | USDT,以太坊上的一种 ERC-20 代币 |
每种桥接币在其原链上都有一个保管地址,在创世时固定,并被纳入创世哈希。GET /api/v1/bridge/coins 会列出这四种币。其余十种创世币没有保管地址。以 Z 开头或结尾的 4 或 5 个字符的符号保留给这一命名空间,因此没有用户代币能使用桥接币的名称(见 发行代币)。
守护者与投票
ZooBC 节点不监视任何外部链。一个独立的守护者程序 zbc-bridge 运行在具有跨链桥配置的节点旁边。它监视保管地址,并在 ZooBC 上用 AttestEvent 交易投票(见 触发器与见证):存款投票的事件 id 以 ZBRDEP1: 开头,提款投票的事件 id 以 ZBWDR1: 开头。每次投票都是一笔免手续费的职责交易,以恰好为 0 的手续费从节点自己的密钥发出。
存款:币的转入
- 用户把币发送到比特币或以太坊上的保管地址。
- 每个看到这笔已确认存款的守护者都发送一份见证,注明这笔存款和一个值:代币、数量以及 ZooBC 上的接收方。
- 在每个区块结束时,链统计这些投票。当三分之二的计入席位,即未被暂停的已注册节点(例如 11 个中的 8 个),见证了完全相同的值时,每个节点都把该数量一比一地铸造给接收方,不收跨链桥手续费,并永久关闭该事件。
被暂停的席位既不投票也不计入。此外还有两项保护措施:
- 每日上限。 如果一笔存款会使某种币一天内的铸造量(最近 5,760 个区块)超过一整枚币与其供应量 10% 两者中的较大者,则每个未被暂停的席位都必须同意,且同意的席位永远不少于全部席位的三分之二。
- 注册表下限。 当注册表的席位数和不同所有者数低于下限 max(3,
min_registry_size) 时,任何跨链桥决定都不会被裁定(见 三分之二规则)。
提款:币的转出
- 用户用一笔普通的 TransferToken 把封装币发送到保管账户,附带消息
ZBW1|,后接目的地址。这笔转账就是请求:不涉及 BurnToken,用户也无需在外部链上发送任何东西。 - 守护者只在请求达到最终性之后才行动,这需要在其区块之后约 3 小时到约 27 小时(见 最终性与回滚);守护者从它处理过的最后一个已最终确定的区块开始扫描链。每个守护者的投票注明该请求、代币、数量和目的地址,并附有该守护者针对外部链的签名。
- 当三分之二同意时,每个节点都会再次检查该请求,并从保管账户中销毁这些单位。
- 守护者收集到的签名可以通过 API 读取,用于授权把币释放到目的地址。
在 720 个区块(3 小时)内没有收到新见证的事件不再被考虑。
ZooBC 上的封装币
封装币一经铸造,就是一种普通的、有 8 位小数的创世代币:它可以被发送、托管、流式支付、在兑换报价中提供或在市场上交易。它的供应量只通过跨链桥改变,对它执行 MintToken 和 BurnToken 都会被拒绝。跨链桥铸造不会按接收方的分账策略分账(见 分账策略与交易策略)。封装币的销毁计入链上的销毁统计,而 ZBC 本身的销毁统计保持为零。