一串字符装下「哪条链的哪个地址」:CAIP-50 多链同址编码怎么读 图 1
一串字符装下「哪条链的哪个地址」:CAIP-50 多链同址编码怎么读 · 图 1

两段式写法的一个不便

CAIP-10账户ID为什么必须带链? 讲过账户为什么必须带着链标识一起说:CAIP-10 把这件事写成「地址@命名空间:链号」,人读清楚,机器也能解析。但有些传输场景只想塞一个字段——一个二维码、一段备注、一个数据库主键——两段式就有点占地方。编号 50 的多链账户标识(MCAI)给出的答案是:把链命名空间、链号和地址用 multicodec 风格的变长编码压进单一字符串,开头一个 z 表示 base58btc 编码。写作时该提案状态仍是 Draft。

一串字符装下「哪条链的哪个地址」:CAIP-50 多链同址编码怎么读 图 2
一串字符装下「哪条链的哪个地址」:CAIP-50 多链同址编码怎么读 · 图 2

字节构成从外到内

按规范的语法式,一串标识依次是:multibase 前缀、标识协议号、链命名空间号、链号长度、链号、地址长度、地址、校验字节。前三个数字都按 varint 编码,其中协议号计划在 multicodec 表上注册,示例里暂用 0xCA 且明说可能变更。链号与地址的字面格式由命名空间自己定:比特币主网那条示例,链号是十六进制创世块哈希转字节、地址从 base58btc 转字节;以太坊那条,链号是整数 1、地址是十六进制转字节。同一个以太坊账户,CAIP-10 写法是 0xde30da39c46104798bb5aa3fe8b9e0e1f348163f@eip155:1,CAIP-50 写法是一串 zUJWDxUnc8… 打头的字符。规范顺手推荐做人类可读的拆解工具,思路与内容寻址标识的在线解码器一致。

命名空间注册表与扩展位置

规范附了一张代码对照表:bip122 是 0x00、eip155 是 0x01、cosmos 是 0x02、polkadot 是 0x03、filecoin 是 0x04、lip9 是 0x05、eosio 是 0x06、tezos 是 0x07,后续命名空间追加登记。值得注意的是,命名空间的权威定义并不在这份提案里,而是引用各自的 CAIP 编号——这份表更像编译期的枚举表,链号本身的口径以对应命名空间规范和 CAIP-2链标识应该怎么解析? 讲的链标识规则为准。协议号预留自 multicodec 表,也是「这个字符串属于哪族编码」的注册习惯法。

校验字节能拦什么、拦不住什么

末位是一个奇偶校验字节:把前面所有字节逐字节异或,得一个字节缀在尾部。它能拦的是随机抄错、少一位串一位这类「无心之失」——改动几乎必然破坏异或结果。它拦不住的是「改得工整」的蓄意篡改:攻击者替换地址后把校验字节一起重算即可,这一点与比特币 Base58Check 里取前四位哈希做校验的思路不同,防篡改性更弱。把标识贴进公告或表单的人应当把它当「防手滑」信号,而不是完整性保证;真要防替换,还得回到对照多个来源核验的纪律。

边界:草案年代与今天的用法

遇到一串不认识的多链标识怎么办?按这份规范的思路可以先做三个动作。第一步看首字符:以 z 开头说明主体用 base58btc 编码,其他前缀意味着另一族 multibase,别用错解码器。第二步解出协议号与命名空间号,对照注册表确认它宣称自己是哪族编码、哪条链系,再按长度字段切出链号与地址两段;解不出干净的字段边界,说明这串东西至少不符合这份规范,来路存疑。第三步把解出的地址拿去对应链的浏览器独立查证一次,确认「编码里说的链」和「地址真实所在的链」是同一件事——编码只是信封,信封上写的收件链不作数。对普通用户更省事的替代方案始终是:在钱包或交易界面里靠显式的链选择器和完整地址比对,而不是靠肉眼解读压缩编码。

该提案 2020 年年中起草,早于后来更活跃的链无关标识讨论,规范里 cosmos、polkadot 等命名空间的编码细节仍写着 TODO,示例只有比特币与以太坊两条,正文也没有收敛出一个被广泛采用的实现清单。读它的正确姿势:把它当作「用单串编码承载多链账户」的一次系统尝试——字段构成、注册表、校验字节的取舍都写得完整,落地程度则不要高估。今天实践中两段式 CAIP-10 仍是主流表达;需要单串的场景,各链原生地址加显式链选择器更常见。对读者而言,这份提案最有迁移价值的是一条通用常识:任何声称能「一个串说清多链身份」的编码,都至少要看协议注册、命名空间定义、校验强度这三处。