ZEC 的转门:屏蔽池过账到底暴露了什么
Zcash 把金额藏了起来,但每一次跨屏蔽池的转移都会公开净额。这个数字为什么必须公开,以及 2026 年 Orchard 关停、Ironwood 接替之后它意味着什么。
Zcash 的交易几乎把一切都藏起来:谁发的、谁收的、发了多少。几乎。有一个数字能穿过加密活下来——value balance(价值余额),也就是这笔交易让每个屏蔽池净进或净出了多少。Zcash 把跨池搬价值的交易叫 pool-crossing transfer,把刻意这么做叫 turnstile(转门)。这个比喻是字面的:一次过一个人,而门会数人头。这篇讲的就是计数器上写着什么、设计者为什么故意让它公开,以及 2026 年 Orchard 池被停用、Ironwood 池顶上之后,这件事变成了什么样。 (Zcash 与门罗 2026 对比)
为什么必须留这个计数器。 屏蔽池是一本隐藏单笔记录的密码学账本,但它仍然有余额。如果维持这个余额的数学出了问题——比如证明系统里的可靠性漏洞——有人就能在池内凭空造钱,而外部观察者看不出来,因为每一条记录都是密文。要抓住这种问题,必须有一个「池内账本」与「公开链」对账的位置。ZIP-209 给出的规则是:每个池的链上价值余额永不为负,所有池的合计永不超过 MAX_MONEY(2,100 万 ZEC)。转门让这条规则真正咬合——想把假钱拿出池外花掉,就必须跨过边界,而跨过的瞬间金额变成一个公开数字。 (Zcash 与门罗 2026 对比)
2026 年把这个理论变成了事故报告。 2026-05-29,安全研究员 Taylor Hornby 在对 Orchard 协议做 AI 辅助审计时,报告了 Orchard Action 电路实现里的可靠性漏洞,编号 GHSA-ww9q-8r59-xv46。按 ZIP-257 的记述,它可能导致余额被破坏、资金被盗。响应是直接把 Orchard 停掉:从 2026-06-02 03:30:07 UTC 挖出的第 3,364,326 块起,所有 v5 及以上交易必须不含任何 Orchard 动作。紧急补丁以 zcashd v6.12.5 与 zebra v4.5.3 发布;更早 60 个区块的一次尝试因部分矿池没及时升级而作废。Orchard 在 2026-06-03 04:03:08 UTC 的第 3,364,600 块随 NU6.2 恢复——相隔 274 个区块、24 小时 33 分——修好了变基点标量乘法的器件(halo2_gadgets 0.5.0、orchard 0.14.0),换了新的验证密钥,并加了证明长度必须规范的规则。
接着干脆换了池子。 NU6.3 于 2026-07-28 14:07:23 UTC 在第 3,428,143 块激活(共识分支 0x37A5165B),引入 Ironwood 池:Orchard 协议的继任者,其 note 从设计上可抗量子恢复(ZIP-2005),供给完整性在上线前做了形式化验证。从那一块起,Orchard 池只出不进。coinbase 不得包含 Orchard 动作;每个 Orchard 动作必须关闭跨地址转移;valueBalanceOrchard 必须非负——用共识语言说就是「不许有新价值进入」。价值仍可自由离开,包括跨转门进入 Ironwood。ZIP-326 补上钱包侧规则:激活后不得向任何 Orchard receiver 发款。于是 Orchard 专属地址变成了「只能花、不能收」的地址。
一笔过账在原始字节里长什么样。 我们解了 2026-10-26 13:57 UTC 挖出的第 3,531,339 块里的 v6 交易,看这道门怎么工作。交易 73909deb 长 15,512 字节,带四个 Ironwood 动作,申报 valueBalanceIronwood 为 +2,546,022,971 zats:25.45999971 ZEC 离开该池进入一个透明 t1 输出,其中 25,000 zats 留作手续费。交易 512a113d 长 9,166 字节、两个 Ironwood 动作,价值余额正好 +10,000 zats——一笔可见流动只剩手续费的转移。这些字节里,收款人、备注、note 金额全是密文。公开的只有余额:过账宣告「动了多少」,不宣告「谁动的」。 (门罗费用机制)
手续费,以及区块浏览器的坑。 ZIP-317 按逻辑动作收 5,000 zats,并有「至少算两个」的宽限:常规手续费 = 5,000 × max(2, 逻辑动作数)。NU6.3 起执行的 Revision 1 把 Ironwood 动作按每个一动作计;透明输入输出按 150 与 34 字节折算。于是一笔两动作的屏蔽转移付 10,000 zats(0.0001 ZEC,ZEC 1,217.56 美元时约 12 美分),四动作加一个透明输出付 25,000 zats,约 31 美分。核对时踩到一个坑:我们查的浏览器对上面这几笔交易显示手续费为 0,因为它根本没有 value balance 这个概念。要审计屏蔽交易,请从原始字节里读 valueBalanceOrchard 与 valueBalanceIronwood,别信那些标签。 (门罗费用机制)
为什么迁移看起来这么机械。 ZIP-318(Orchard 到 Ironwood 迁移设计)是这里最有信息量的文档,因为它把隐私代价明码标价。每次跨池的净额都是公开的,天真地迁移等于把你的余额一次性公布。草案于是把迁移交易按「锚点边界」分群——每 144 个区块一个边界,按 75 秒出块约三小时——让你的交易混在所有人的交易里。它只用 n×10^k、n∈{1,2,5} 的规范面额,每笔迁移只花一个 Orchard note、只生成一个 Ironwood 输出,并刻意留下低于阈值的零头不迁,免得奇怪的余数变成指纹。因为每笔互相独立,整份日程可以预先签好再一起广播,不必等前一笔的找零确认。
网络根本不是瓶颈。 我们拉了连续 600 个区块(高度 3,530,741 到 3,531,340,跨 12.45 小时):区块大小中位 14,133 字节(上限 2 MB),最大 889,107 字节;600 块里有 181 块(30.2%)只有一笔或零笔交易;平均出块间隔 74.8 秒。NU6.3 以来链上新增 103,197 个区块,用时 89 天 23 小时 53 分,平均 75.35 秒,对 75 秒的目标几乎正中。迁移流量没在跟任何东西抢空间:过一笔账几美分,队列是空的。
真去兑换时,这意味着什么。 第一,收款地址要用 NU6.3 之后钱包生成的——最好是当前版本钱包的统一地址——因为 Orchard 专属字符串已经收不到钱。第二,金额的公开方式与地址不同:从透明 t1 地址付,入金在链上完全可见;从 Ironwood 付,地址保住了,但跨池金额仍会以 value balance 的形式公布。屏蔽来源不等于看不见的数字。第三,下单前先报价。2026-10-26 14:02 至 14:06 UTC 我们的 ZEC 报价是:下限 26.797546 USDT,100 USDT 换 0.06616125 ZEC,5,000 换 4.00967624,20,000 换 16.08030112。折算下来,100 USDT 档是 1,511.46 USDT/ZEC,20,000 档是 1,243.76,而现货是 1,217.56——小额那头的差距是每单约 15 到 18 美元的固定计费,不是网络手续费。ZEC→XMR 报 2.0254,XMR→ZEC 报 0.47483,一来一回差 3.8%。汇率会动,报价页才是唯一权威。 (XMR 换 USDT 退出路线)
你究竟在信任什么。 三件事:电路确实如审计所说那样工作——这正是 2026 年 5 月那份报告和修正后的验证密钥比任何宣传语更重要的原因;ZIP-209 的余额不变量由每一个节点强制执行,而不只是贴在某个看板上;以及 Ironwood 池在接收价值之前就完成了供给完整性验证。再加上一条:拿着你私钥的人得靠谱,因为上述一切都不保护被入侵钱包泄露出去的 note。转门不做的事:藏住过账金额、让透明那一跳变私密、或者帮你跳过迁移。它做的事只有一件——在不公布任何资产负债表的前提下,让屏蔽池的账保持诚实。2026 年,这个性质在十二周里被考了两次。