密钥与账户类型
ZooBC 账户由签名控制,从不由用户名、密码或 API 密钥控制。需要哪种签名取决于账户的类型。除了原生的 Ed25519 账户之外,ZooBC 还接受地址按比特币、以太坊、Solana、Polkadot、Cardano、Ripple、Tron 和 Tezos 的写法书写的账户,并用各链自己的方案检查其签名。因此,比特币或以太坊密钥可以控制一个 ZooBC 账户,其地址与该密钥在原链上的地址相同。这个账户是独立的,位于 ZooBC 自己的账本上,持有的是 ZBC。
地址由类型和载荷构成
地址是一个 4 字节的类型编号(小端序),后接载荷,载荷的含义和长度由类型决定(账户与地址)。对于原生账户,载荷就是 Ed25519 公钥本身;对于以太坊账户,它是公钥的 Keccak-256 哈希的最后 20 个字节;对于比特币 P2PKH 账户,它是公钥的 HASH160。
| 类型 | 账户 | 写法 | 能否签名 |
|---|---|---|---|
| 0 | ZooBC,Ed25519 | ZBC_… | 能 |
| 1 | 比特币传统格式(HASH160) | — | 能 |
| 2 | Empty(“无接收方”) | — | 不能 |
| 3 | 爱沙尼亚 eID(保留) | — | 不能 |
| 4 | 以太坊 | 0x… | 能 |
| 5 | 比特币 P2PKH | 1… | 能 |
| 6 | 比特币 P2SH,按 P2SH-P2WPKH 验证 | 3… | 能 |
| 7 | 比特币 P2WPKH | bc1q…,42 个字符 | 能 |
| 8 | 比特币 P2WSH(脚本) | bc1q…,62 个字符 | 不能 |
| 9 | 比特币 Taproot | bc1p… | 能 |
| 10 | 数据对象 | ZBS_… | 不能 |
| 11 | Solana | 与 Solana 上相同 | 能 |
| 12 | Polkadot | 与 Polkadot 上相同 | 能 |
| 13 | Cardano | addr1… | 能 |
| 14 | Ripple | r… | 能 |
| 15 | Tron | T… | 能 |
| 16 | Tezos | tz1… | 能 |
无密钥地址同样不能签名:协议的资金池、账户组和多重签名账户都没有密钥,因此其资金只能按协议规则移动。
原生账户的文本形式是 ZBC_ 后接 56 个 base32 字符,分为七组,每组八个:32 字节的公钥加上一个同样覆盖前缀的 3 字节 SHA3-256 校验和。读取时,分隔符、空格和字母大小写都会被忽略。同一把 32 字节密钥也可以写成节点密钥(ZNK_)、中继密钥(ZBR_)或网关密钥(ZBG_)。
所有方案共用一个摘要
每种账户类型签署的都是同一个链绑定摘要:
digest = SHA3-256("ZBC-TX" ‖ genesis hash ‖ unsigned transaction bytes)
只有这个摘要会被接受;对裸字节的签名会被拒绝。创世哈希把每个签名都绑定到一条链上(链绑定签名)。有些方案会按其原链的要求,对摘要再做一次哈希。
各种方案
- Ed25519,对 32 字节摘要签名,用于 ZooBC(类型 0)和 Solana(11)。Cardano(13)和 Tezos(16)也用 Ed25519 签名,但它们的地址是哈希,因此签名字段还要携带公钥:共 98 字节,由 2 字节长度、公钥和签名组成。公钥通过 BLAKE2b-28(Cardano)或 BLAKE2b-20(Tezos)与地址绑定。
- 比特币式 secp256k1 ECDSA,用于类型 1、5、6、7 以及 Ripple(14)。签名字段携带公钥:2 字节长度、33 或 65 字节的公钥,然后是 64 字节的签名(r 和 s)。公钥的 HASH160 必须等于地址,被签名的消息是对摘要做两次 SHA-256 的结果,并且只接受 low-s 签名。
- 以太坊式 secp256k1 ECDSA,用于以太坊(4)和 Tron(15):对摘要的 Keccak-256 哈希生成 65 字节的签名(r、s 和 v)。公钥从签名中恢复出来,再比较其地址;high-s 签名会被拒绝。
- BIP-340 Schnorr,用于 Taproot(9),使用 x-only 输出密钥;由钱包施加 Taproot 调整(tweak)。
- sr25519,用于 Polkadot(12),签名上下文为“substrate”。
Taproot 账户也可以通过 SendZBC 接收 ZBC,这在每条链上从创世起就适用。
验证一把未被存储的密钥
以太坊式地址只是一个 20 字节的哈希;公钥在链上任何地方都没有存储。以太坊签名是可恢复的:根据被签名的消息和 65 字节的签名,任何人都能算出生成该签名的唯一公钥。节点正是这样做的:它取恢复出的公钥的 Keccak-256 哈希的最后 20 个字节,只有当它们等于地址时才接受签名。由于 high-s 签名会被拒绝,签名无法被篡改成第二种有效形式。不需要注册步骤,也不需要外部查询,0x 账户既能接收,也能同样自由地发送。
内部携带的外部链交易
持有外部链账户的发送方,也可以把其原链的一笔原生交易放进 ZooBC 交易的消息字段。在这条路径上,节点检查的是外部链交易及其签名,而不是 ZooBC 摘要:
- 以太坊(类型 4):一笔访问列表为空的 EIP-1559、EIP-2930 或传统格式(EIP-155)交易。恢复出的签名者必须是发送方,其
to必须是接收方,其以 wei 计的金额除以 10^10 必须等于转账金额(MetaMask 与以太坊式访问)。 - Solana(类型 11):一笔 lamports 数等于转账金额的 System 转账。
- 比特币(类型 7 和 5):一个输入、一到两个输出,矿工费为零;输出 0 支付给接收方,输出 1(如果有)把找零退回给发送方。
这种承载外部链交易的消息最多可达 4,096 字节,并且该交易不得携带存续押金(交易信封)。
派生原生密钥
原生密钥由 BIP-39 助记词派生:先进行 2,048 轮迭代的 PBKDF2-HMAC-SHA512,再按 m/44'/883'/n' 路径进行 SLIP-0010 Ed25519 派生,每一步都是强化派生。883 是 ZooBC 的币种类型。