Zcash 透明池与屏蔽池:一笔资金在两种隐私形态之间怎么搬家 讲的是资金在两种形态之间搬家,本文讲的是另一件让人频繁出错的事:对方到底给了你哪一种地址。在 Canopy 升级为止,Zcash 支持透明地址(P2PKH 与 P2SH)、Sprout 地址和 Sapling 地址三类收款形态,Orchard 提案又加了第四类。每一类都有自己的字符串编码和二维码,用户被迫记住“对方钱包支持哪一种”,收款方则可能要生成好几条地址分别发给不同的人。ZIP-316 定义的统一地址(Unified Address,简称 UA)把这条负担反转:一条地址里打包多个接收器(Receiver),发送方按自己的能力和固定优先级从中挑一个把钱付出去。
地址串里排的是什么
提案给接收器定了整数类型码:0x03 是 Orchard 原始地址,0x02 是 Sapling 原始地址,0x01 是透明 P2SH,0x00 是透明 P2PKH。原始编码是把每个接收器写成类型码、长度、地址字节三段依次拼接,再按类型码升序排列,类型码和长度字段的取值都必须小于等于 0x2000000。透明接收器存的是 160 位的脚本哈希或验钥哈希,屏蔽接收器存的是对应屏蔽支付地址的原始编码。一个钱包可以只包含一个接收器,也可以同时装着屏蔽与透明两类。

谁决定最后落到哪一类
优先级是写死在规范里的固定列表:Orchard 高于 Sapling 高于透明。规范用了强制措辞:给统一地址付款的发送方,必须使用这一组接收器里它所支持的最高偏好类型。举例说,一个只支持发到 Orchard、且没有更偏好类型可发的钱包,拿到同时含 Orchard 和其他接收器的地址时,就必须发到 Orchard。钱包可以让用户配置自己能向哪些接收器类型付款,但规范明确禁止让用户调换这个优先级顺序,只能选择是否加入实验性用法。这意味着同一条地址,别人用什么钱包、什么版本给你付款,链上落成的形态可能完全不同,你的“隐私等级”并不完全由你给出去的那条串决定。
肉眼看不出来,必须解码
统一地址的可读形态不是把几类地址前后拼起来。规范把拼接好的字节先做一次 F4Jumble 打散,再交给 Bech32m 编码,选 Bech32m 而不是 Bech32 正是为了更好处理可变长度输入。打散时还会把人类可读部分按 US-ASCII 补零到 16 字节追加在末尾,解码方要先按同一规则重算才能校验。解码的正确流程因此是四步:Bech32m 解码并拒绝校验和错的串、施加 F4Jumble 逆运算、检查末尾是否等于补零后的人类可读部分、再按原始编码逐段解析,任何一段解析不上就整体拒绝。也就是说,你不能靠“看着像不像”判断一条地址里有几种收款方式,也请不要把截图里被折行的地址手敲回去。
前缀有三种,还有一次被撤回的修订
人类可读部分按修订与形态区分:修订二之前统一用 u,从修订二起,只含屏蔽接收器的地址用 zu,允许含透明接收器的用 tu,测试网在对应前缀后面接 test。这个前缀变化不是装饰,它是版本与隐私取向的信号:规范解释,把带强制理解类型码的地址钉在修订二的前缀上,是为了让不认识 zu 与 tu 的旧客户端直接拒绝,而不是误当成旧格式处理。值得一提的是,修订一曾提出一个和修订二 tu 相近的变体,因为共享出去之后难以判断隐私含义而遭到社区反对,最终被撤回。就规范状态而言,修订一是撤回、修订二是草案,写“统一地址已全面启用修订二”这类说法目前还下不了口。
查看密钥也打包,前缀换了两次
和统一地址对称的,还有统一完整查看密钥(UFVK)与统一入向查看密钥(UIVK)。它们的前缀同样按修订划分:修订二之前分别是 uview 与 uivk,修订二起改为 uvf 与 uvi,测试网一律再加 test 后缀。修订二还取消了一条旧限制:完整查看密钥不必非含至少一个屏蔽项不可,并且支持按 BIP 388 钱包策略表达的 P2SH 查看密钥项。对想把只读权限交给审计或对账工具的人来说,导出的应该就是这类查看密钥,它的可读形态同样要能被工具解码,不要凭长度猜类型。
地址可以带到期时间
修订二为地址加了两种可选的元数据类型码:0xE0 存一个无符号 32 位小端整数,表示地址到期高度,链的高度超过它这条地址就算过期;0xE1 存一个无符号 64 位小端整数,表示按 Unix 纪元时间计的到期时刻。发送方一旦支持修订二,往带到期高度的统一地址付款时就必须在交易里写入非零的 nExpiryHeight;如果自己原本算出的过期高度会大于地址要求的到期高度,这笔付款就不该发出。只给了到期时刻时,规范建议把过期高度控制在当前时间起 24 小时之内。地址已经过期时,钱包该给用户的提示也被写明了:建议去拿一个当前有效的地址,而不是一遍遍重试。
落到操作上的核对顺序
先把这条标准放回它该在的位置:统一地址解决的只是“收款方向发送方一次讲清自己能收哪些形态”的协商问题,它不会把一笔付款变成隐形的,也不会替你判断对方能不能收屏蔽款。给别人收款地址时,如果对方是只认透明地址的老服务,可以直接给透明地址或按修订二给 tu 形态;给自己人则 zu 或屏蔽地址更干净。动手前照旧把链上转账前必查清单:网络选择、最小单位与 Memo 注意事项走完一遍,收到钱之后再用浏览器或钱包界面确认它落在哪一层,本文提到的编码、状态与实现细节以你操作时官方提案与钱包现文为准,与具体金额无关的价格判断也不在本文范围内,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。