ZooBC 维基
ZooBC 基础

账户与地址

在 ZooBC 上,你的密钥就是你的账户。原生账户由其 Ed25519 公钥标识,写成一个以 ZBC_ 开头、长 66 个字符的地址。没有人负责发放地址:钱包从你的密钥推导出你的地址,而且可以离线完成。每个地址都带有校验和,因此抄错的地址会在发出任何东西之前就被拒绝。

地址是什么样子

原生地址由前缀 ZBC、一个下划线和 56 个字符组成,这 56 个字符分为七组,每组八个:

ZBC_57J5D5QV_OPO4JILA_RQW2JC77_OOIDM4VM_BHFCLTKB_2DOFOR4L_Z24K7SFR

这个示例是为 zoobc.how 测验从一个哈希生成的。没有人持有它的密钥,所以千万不要向它发送币。

这 56 个字符是以 base32 书写的 35 个字节,base32 的字母表由大写字母 A 到 Z 和数字 2 到 7 组成:其中 32 个字节标识账户,后面跟着 3 个字节的校验和。

32 字节的公钥加上 3 字节的校验和构成 35 个字节;base32(A-Z、2-7)把它们变成 56 个字符;加上 ZBC_ 并每 8 个字符分为一组,就得到完整的地址。
32 字节的公钥加上 3 字节的校验和构成 35 个字节;base32(A-Z、2-7)把它们变成 56 个字符;加上 ZBC_ 并每 8 个字符分为一组,就得到完整的地址。

这 32 个字节就是密钥

在链内部,账户不是文本,而是一个 4 字节的类型编号,后面跟着一段载荷,载荷的长度由类型决定。类型 0 是原生 ZooBC 账户,其载荷就是该账户的 Ed25519 公钥本身,而不是公钥的哈希。因此任何人都能直接从地址读出公钥:从 0.5.8 版本起,节点的 API 对原生账户仅凭地址就能回答 /api/v1/accounts/<address>/pubkey。

其他链的做法不同,而 ZooBC 在使用它们的地址时沿用它们的做法。以太坊账户的载荷是公钥 Keccak-256 哈希的最后 20 个字节,经典比特币(P2PKH)账户的载荷则是公钥的 20 字节 HASH160。ZooBC 接受比特币、以太坊、Solana、Polkadot、Cardano、Ripple、Tron 和 Tezos 的账户,每种账户都按其原链的方式书写,并用其原链的签名方案验证(密钥与账户类型)。

校验和能发现笔误

校验和是对 32 字节载荷后接三个前缀字母计算的 SHA3-256 的前 3 个字节。无论是钱包、命令行工具 还是节点的 API,凡是解码地址的程序都会重新计算它,并在不匹配时拒绝该地址。随机的笔误大约每 2^24 次(即约 1670 万次)尝试才会产生另一个有效地址。作为对测验的检验,上面示例地址全部 1,736 种单字符改动都被逐一尝试过,每一种都被拒绝了。

拒绝发生在交易构建之前,所以什么都不会发出。共识本身从不解码文本:交易以字节形式携带地址,校验和由把文本转换为字节的工具来检查。没有“最接近的账户”查找功能,而发送到错误但有效的地址的币也不会自己回来。

书写地址

解码遵循“有效字符”规则:所有下划线、连字符和空白字符(包括换行符)都会被去掉,剩下的部分转为大写。因此,ZBC_57J5D5QV_…、zbc-57j5d5qv-…、完全不带分隔符的地址,以及在电子邮件中被折成两行的地址,都会解码为同样的 32 个字节,随后照常检查校验和。分隔符和大写只是为了方便人们阅读和复制。

前缀

前缀的三个字母说明密钥的用途:

前缀含义
ZBC_账户(类型 0)
ZNK_节点密钥(节点的密钥)
ZBR_中继密钥(中继)
ZBG_网关密钥(网关)
ZBS_数据集对象(类型 10,数据集)

API 还接受用于交易 id 的 ZTX_ 形式。

由于校验和覆盖前缀,同样的 32 个字节在两个前缀下,前缀之后的前 51 个字符相同,只有最后五个字符不同。示例密钥写成节点密钥时,以 …_2DOFOR4L_Z24FR5JM 结尾,而不是 …_2DOFOR4L_Z24K7SFR。手动替换前缀而不重新计算结尾,会破坏校验和,因此这种改动会被发现。节点自己的账户就是其节点密钥的 ZBC_ 形式。

同一个密钥分别写成 ZBC_ 和 ZNK_:前缀之后的 51 个字符相同(即密钥),最后五个字符不同,因为校验和覆盖前缀。
同一个密钥分别写成 ZBC_ 和 ZNK_:前缀之后的 51 个字符相同(即密钥),最后五个字符不同,因为校验和覆盖前缀。

没有密钥的地址

有些原生地址根本不是密钥。没有任何私钥与它们对应,因此任何签名都无法从中支出,它们的币只能按协议自身的规则转移:

  • 协议的资金池:长效池 ZBCLONGV、存储池 ZBCSTORE 和应用池 ZBCAPPS,每个都是用零填充到 32 字节的 ASCII 名称(资金池);
  • 账户组,以创立它的交易的哈希命名(账户组);
  • 多重签名账户,即其阈值和参与方的哈希(多重签名);
  • 数据集对象,即创建它的交易的哈希(数据集)。

一切都是公开的

每个节点都保存完整的状态,其 API 回答任何人的请求,不需要账户、密钥,也不需要 API 密钥。GET /api/v1/accounts/<address> 返回余额,其下的 /history、/transactions 和 /movements 这几个路由则列出该账户做过的事情,以及余额的每一次变动及其原因,包括已支付的租金和赢得的奖励。区块浏览器以网页形式展示同样的数据(区块浏览器与归档节点)。

链上不记录的是你是谁。地址是一把密钥,而不是一个名字,除非有人主动建立关联,否则链上没有任何东西把它与某个人联系起来。因此,ZooBC 上的隐私来自你使用地址的方式,而不是来自隐藏的余额。操作需要密钥,查看从不需要。

持有 ZBC 的账户要支付少量租金,余额不足以支付租金的账户会被清理(账户租金与清理)。

另见