链上看不见金额,钱包为什么看得见
在 Liquid、Elements 这类支持机密交易的链上,区块记录里的金额和资产类型都被承诺值替代,任何旁观者都读不出数字,只有交易各方能解开。Elements 与 Liquid:比特币世界那条做实验的侧链底座 介绍过这条侧链底座的定位,本文解决紧随其后的问题:钱包拿什么解?答案是一整条盲化密钥派生链。2019 年发布的 SLIP-0077(状态 Draft,作者 Roman Zeyde)规定这串密钥必须能从助记词确定性复现——恢复助记词就能恢复读账能力,不需要额外备份盲化钥匙。

每收一笔,换一把读金额的钥匙
机密交易里收发双方用 ECDH 协商一个共享随机数,金额和资产类型就用它来藏与揭。Elements/Liquid 侧接收方的做法是:以主盲化密钥为键、以收款脚本 script_pubkey 为消息做一次 HMAC-SHA256,输出的整数就是这条脚本专属的盲化私钥;再按 secp256k1 算出对应公钥,嵌进 confidential address 给付款人。每个被盲化的输出里还带着付款方的 ECDH 临时公钥,收款方拿自己的盲化私钥就能还原共享随机数。有个容易踩的实现细节:HMAC 出来的 256 位整数必须小于 secp256k1 的群阶,否则这次派生必须宣告失败重来,而不是悄悄取模。
主盲化密钥从助记词里来
SLIP-0077 没有另发明一套派生,直接复用 同一颗助记词能派生加密钥匙吗?SLIP-0021 对称密钥树详解 的对称密钥树:先用固定盐 Symmetric key seed 对种子(按 BIP-0039 规则从助记词加口令生成)做 HMAC-SHA512 得根节点;再以 b”SLIP-0077” 为标签、前面补一个 0x00 字节做消息,对根密钥做 HMAC-SHA512,取结果后 32 字节当 master_blinding_key。标签就是域分隔的护栏:同一颗种子在 SLIP-0015、SLIP-0016、SLIP-0077 上长出的密钥互不相干,一处泄露不连坐全线。这也是确定性钱包的通用哲学——能不备份第二份秘密,就绝不备份第二份。
共享 nonce 的最后一步
还原金额前还有一道哈希:把 ECDH 算出的共享点用压缩公钥形式序列化,再做两次连续的 SHA-256(先哈希压缩点,再对哈希结果哈希一次),得到的值才用于值的掩藏与恢复。双哈希不是玄学,是把椭圆曲线输出拉进均匀随机数空间的常见处理。工程上值得记的教训都在这里:少一次哈希、忘了压缩形式,解出来的就是另一串数字,而且不报错,只会显示成对不上账。
恢复钱包时,读账能力从哪恢复
普通用户最实际的场景是换设备或重新导入助记词。因为整条链从助记词出发是确定性的,新钱包只要实现了同一派生公式,就能立刻重算出同一把主盲化密钥,再用同一批脚本逐条解开历史输出的金额,无需任何额外备份文件。这也解释了一个常见困惑:为什么某些钱包提示导出一个单独的盲化密钥文件?如果该钱包历史版本没按规范派生,那份文件就是它自己打的补丁——恢复顺序因此变成先试助记词自动派生、再考虑历史导出文件,顺序反了可能重复扫描或漏扫。审计方向的思路同构:只交出指定脚本对应的盲化私钥,对方能复算那几笔的共享 nonce,看到金额却签不了任何交易。
给审计留的口子与草案边界
规范专门写了一个用例:把部分或全部盲化私钥交给外部审计,对方能解开指定输出的金额,却动不了钱——因为盲化私钥只负责读,不负责花。对需要合规报表的机构,这是比交出整个钱包强得多的最小授权。清醒剂也要喝:这份 SLIP 状态仍是 Draft,主要落地在 Elements/Liquid 生态的钱包实现里,不是所有隐私链通用(门罗币走的是另一套扫描密钥机制);盲化防的是链上旁观者,不防你设备上的恶意软件。
风险提示
本文为隐私链机制科普,不构成投资建议。使用隐私功能须遵守所在司法辖区法律,隐藏金额不构成隐匿违法资金的合法手段;涉及具体钱包恢复行为,以钱包厂商官方文档为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。