Zcash 每次升级都会使钱包签名交易失效——开发者探讨解决方案
要点速览
- •Zcash 的 NU7 升级在区块 3,543,405 激活,未改变交易格式,但每个钱包仍需发布新版本或固件,用户才能再次花费。
- •开发者 ValarDragon 提议将移除共识分支 ID 更新列为 NU8 升级七项目标之一,旨在终结每次激活时钱包损坏的模式。
- •每笔 Zcash 签名都提交至由 ZIP 200 引入、用于分叉重放保护的共识分支 ID,因此升级一旦激活,以旧 ID 签名的交易立即失效。
- •Konclave 金库开发者 Daniel Gorgonha 解释说,受约 50 分钟默认过期窗口限制的门限签名工作流,若升级在收集中途发生将整体作废,因此他请求引入拟议的可选择退出方案。
- •Electric Coin Company 工程师指出重放保护是交易所提出的硬性要求,而 nuttycom 提议的 ZIP 248 退出变体将以部分重放保护以及可能缩小的匿名集为代价,换取能跨越升级存续的交易。

在注重隐私的加密货币 Zcash 的贡献者中,一项正在流传的提案主张移除每次网络升级(NU)时使待处理已签名交易失效的机制——此前最近一次激活导致钱包无法花费,直到其发布新版本或固件。
新的抱怨,新的实例
在11月9日的论坛帖子中,开发者 ValarDragon 将移除共识分支 ID 更新列为下一次升级 NU8 的七项目标之一,其明确目的是终结"每次 NU 都弄坏钱包"的模式。
这一抱怨背后有最新的实例。NU7 上周在区块 3,543,405 激活,并未触及交易格式,但正如论坛成员 strahncryptography 在同一帖子中指出的那样,每个钱包仍然需要发布新版本或新固件才能再次花费。任何使用隔离手机或不受支持设备的用户都被困住了。
到第二天早上,该帖子已形成三种立场:放弃该机制、保留它但允许用户选择退出,或者接受真正的问题在于钱包过时而非签名过期。随后一位金库开发者说明了为什么这一选择并非纸上谈兵。
实际失效的是什么
每笔 Zcash 签名都提交至一个共识分支 ID——即对当前生效规则集的标记。ZIP 200(规定协议规则的 Zcash 改进提案(ZIP)之一)引入了这一机制,使为一条链签名的交易无法在共享相同历史的分叉上重放。当升级激活时,ID 发生变化,任何以旧 ID 签名的内容在生效瞬间即告失效。
NU7 部署 ZIP 明确说明了刚刚发生的这次升级的情况:版本 5 和版本 6 交易保留了其结构,但由于交易的签名绑定了分支 ID,交易在激活前后仍然无法保持有效。文件还指出,已保存和离线签名的交易需要与在线交易相同的激活检查。
这就是为什么钱包必须为一个在交易构建方式上毫无改动的升级发布更新。不知道新 ID 的钱包实际上是在为一条已不存在的链签名。
无法及时完成签名的金库
在 Deega Labs 构建 Konclave t-of-n 金库的 Daniel Gorgonha 稍后在帖子中描述了实际代价。Konclave 先构建交易,之后再收集门限签名,因此每个必需的签名者都必须在交易的过期窗口(约 50 分钟)内行动。如果升级恰好落在该窗口中间,整个流程就会作废。
50 分钟这一数字来自 ZIP 203,它在三次区块时间变更中一直将默认过期时间保持在大约这一长度。自 NU7 起,这意味着在 25 秒目标出块间隔下为 120 个区块。这是钱包的默认值,可按节点配置,而且通过将该字段设为零,交易也可以完全不带过期时间。
因此计时器问题已经可以解决——至少在钱包暴露该设置的情况下。而升级边界则不然。金库可以给成员一周时间签名,但在分支 ID 更替的那一刻仍会失去交易。Gorgonha 所请求的正是 nuttycom 刚刚提出的可选择退出方案,这样群组就可以在自担风险的情况下用数小时或数天收集签名。
三条出路,各有代价
移除分支 ID 承诺。 这是 ValarDragon 的原始提案。Electric Coin Company(ECC)工程师 str4d 回应称,在编写 ZIP 200 时,重放保护是交易所和其他生态系统参与者的硬性要求,因此任何移除都需要替代机制,理想情况下还应涵盖纯粹为扰乱主链而创建的恶意分叉。
保留为默认,允许用户选择退出。 同样来自 ECC 的 nuttycom 提出了在 ZIP 248 下跳过分支 ID 和过期高度的签名变体。选择这些变体的用户放弃部分重放保护,换取能跨越升级存续的交易。nuttycom 表示,对绝大多数交易而言运行良好的现有算法将继续作为安全默认值。str4d 已经指出,一旦 ZIP 248 激活,定义这样的变体会很容易。
质疑这是否真正解决了钱包的问题。 strahncryptography 认为这些变体解决的是交易寿命问题而非过时问题:如果分支 ID 不是硬编码的,用户就必须自行提供正确的 ID,这将同样的负担重新压回钱包软件上。他写道,针对友好分叉的重放保护有其价值,但应权衡其收益。
该帖子尚未解决这一分歧。它所做的,是将问题缩小为:是否值得为有需要的用户构建可选择加入的变体,以及这些用户将放弃什么。
选择退出的代价
重放风险在刚刚发生的升级中最容易理解。仅针对 NU7,ZIP 259 豁免了旧节点软件在激活前自行弃用的常规要求,这意味着从未升级的运营者可以保持在线并继续跟随 NU7 之前的分支。签名不绑定任何分支的交易,恰恰是可能在两条链上都被接受的类型。
暴露的是授权的范围,而非其背后的密钥。被重放的交易会在签名者从未打算使用的另一条链上花费相同的输入;它不会让任何人伪造新的交易。
从签名中去掉过期高度还有第二个影响:一笔已授权的支付可以在其输入未被花费期间一直处于未确认状态。这正是金库想要的特性,也是个人用户可能察觉不到的风险。
nuttycom 还指出匿名集可能缩小。在屏蔽系统中,隐私依赖于一笔交易看起来与其他所有交易一样;使用一种很少使用的变体签名的交易,其可供隐藏的人群会更小。该帖子并未量化这一影响,且尚无变体被具体定义。
更长寿命的签名并不能更新旧设备
ZIP 248——这一切所依赖的可扩展交易格式——仍处于草案阶段。str4d 表示其设计已稳定超过半年,并且他过去一周一直在针对此后部署的共识变更更新该文件。它尚未被分配到任何升级,可选择退出的变体也尚未在其中存在。
即使这些变体出现,硬件钱包或离线签名器仍需要能理解新格式的软件。ZIP 248 禁止钱包构建或签名其无法解析的组件。兼容性收益是真实的,但它通过钱包发布来实现——而 strahncryptography 表示这一步一直在失败。
这一切也帮不了已退役格式中的交易。ZIP 259 指出,NU7 对版本 4 交易的禁令涵盖透明和 Sapling 花费以及 Sprout,而且重新签名无法挽救它们;唯一的解决办法是在受支持的版本中重建支付。Coindoo 上周报道了更棘手的情况——完全没有替代格式的 Sprout 币。
Konclave 也有自己未完成的部分。其关于异步签名的开放 issue 将随时间收集的批准与金库目前运行的交互式门限仪式区分开来。一笔能在升级中存续的交易消除了一个障碍;而让成员在他们上线时即可参与的工作流仍有待编写和审查。
实用建议
如果你运营一个群组钱包:
- 激活是区块高度而非日期;每次升级的部署 ZIP 会提前公布该高度。
- 不要开启可能跨越该高度的签名轮次。
- 激活前准备的任何内容在激活后都必须重建,即使尚无人签名。
如果你在旧设备上持有币:
- 在尝试花费之前,检查其固件或应用是否已提供 NU7 支持。
- 来自受支持资金池的卡住花费是钱包问题,并非资金丢失。
- 11 月 6 日之前保存的版本 4 交易无法通过重新签名恢复有效。
Coindoo 此前对钱包端支付改进的报道涵盖了构建交易与确认交易之间的空白。这一帖子在其间增加了第三个阶段:在人员和设备跟进期间保持授权有效。
接下来会怎样
1 月下旬是 ValarDragon 的目标,而非既定日程。str4d 在同一帖子中质疑两个半月的时间对同一清单上的 Tachyon 池是否足够,而分支 ID 这一项在七项目标中遭到的反对最为强烈。NU8 究竟会附带可选择退出机制、重放保护的替代方案,还是两者都没有,将由 ZIP 流程而非论坛决定。