ZooBC 维基
集成

密钥与账户类型

ZooBC 账户由签名控制,从不由用户名、密码或 API 密钥控制。需要哪种签名取决于账户的类型。除了原生的 Ed25519 账户之外,ZooBC 还接受地址按比特币、以太坊、Solana、Polkadot、Cardano、Ripple、Tron 和 Tezos 的写法书写的账户,并用各链自己的方案检查其签名。因此,比特币或以太坊密钥可以控制一个 ZooBC 账户,其地址与该密钥在原链上的地址相同。这个账户是独立的,位于 ZooBC 自己的账本上,持有的是 ZBC。

地址由类型和载荷构成

地址是一个 4 字节的类型编号(小端序),后接载荷,载荷的含义和长度由类型决定(账户与地址)。对于原生账户,载荷就是 Ed25519 公钥本身;对于以太坊账户,它是公钥的 Keccak-256 哈希的最后 20 个字节;对于比特币 P2PKH 账户,它是公钥的 HASH160。

类型账户写法能否签名
0ZooBC,Ed25519ZBC_…能
1比特币传统格式(HASH160)—能
2Empty(“无接收方”)—不能
3爱沙尼亚 eID(保留)—不能
4以太坊0x…能
5比特币 P2PKH1…能
6比特币 P2SH,按 P2SH-P2WPKH 验证3…能
7比特币 P2WPKHbc1q…,42 个字符能
8比特币 P2WSH(脚本)bc1q…,62 个字符不能
9比特币 Taprootbc1p…能
10数据对象ZBS_…不能
11Solana与 Solana 上相同能
12Polkadot与 Polkadot 上相同能
13Cardanoaddr1…能
14Rippler…能
15TronT…能
16Tezostz1…能

无密钥地址同样不能签名:协议的资金池、账户组和多重签名账户都没有密钥,因此其资金只能按协议规则移动。

原生账户的文本形式是 ZBC_ 后接 56 个 base32 字符,分为七组,每组八个:32 字节的公钥加上一个同样覆盖前缀的 3 字节 SHA3-256 校验和。读取时,分隔符、空格和字母大小写都会被忽略。同一把 32 字节密钥也可以写成节点密钥(ZNK_)、中继密钥(ZBR_)或网关密钥(ZBG_)。

所有方案共用一个摘要

每种账户类型签署的都是同一个链绑定摘要:

digest = SHA3-256("ZBC-TX" ‖ genesis hash ‖ unsigned transaction bytes)

只有这个摘要会被接受;对裸字节的签名会被拒绝。创世哈希把每个签名都绑定到一条链上(链绑定签名)。有些方案会按其原链的要求,对摘要再做一次哈希。

四种签名方案:ZooBC、Solana、Cardano 和 Tezos 用 Ed25519;比特币、Ripple、以太坊和 Tron 用 secp256k1 ECDSA;Taproot 用 BIP-340 Schnorr;Polkadot 用 sr25519;以及不能签名的地址
四种签名方案:ZooBC、Solana、Cardano 和 Tezos 用 Ed25519;比特币、Ripple、以太坊和 Tron 用 secp256k1 ECDSA;Taproot 用 BIP-340 Schnorr;Polkadot 用 sr25519;以及不能签名的地址

各种方案

  • 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 账户既能接收,也能同样自由地发送。

签名者用 Keccak-256 对 ZBC-TX 摘要做哈希,再用 secp256k1 签名;节点恢复出公钥,对其做哈希,并把最后 20 个字节与地址比较;比特币式则携带公钥并检查其 HASH160
签名者用 Keccak-256 对 ZBC-TX 摘要做哈希,再用 secp256k1 签名;节点恢复出公钥,对其做哈希,并把最后 20 个字节与地址比较;比特币式则携带公钥并检查其 HASH160

内部携带的外部链交易

持有外部链账户的发送方,也可以把其原链的一笔原生交易放进 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 的币种类型。

另见