把币锁进时间换身份:BIP-46 时间锁保真债券的派生方案 图 1
把币锁进时间换身份:BIP-46 时间锁保真债券的派生方案 · 图 1

混币协议有个先天软肋:协调者(或者任何观察者)很难区分”真实的独立用户”和”一个人装成一百个人”——这就是女巫攻击。JoinMarket 社区给出的防线之一是保真债券:故意把一笔比特币锁进一个长期时间锁地址,锁到期的时间价值就是烧掉的成本,谁也无法伪造”我已经等了三年”这件事。2022 年 4 月立项的 BIP-46(作者 Chris Belcher,状态 Draft)把这套做法标准化了一半:它不规定债券本身怎么用,只规定这些时间锁地址应该从一个 HD 钱包按固定路径派生出来,并附带证书签名的操作建议。

先说清楚保真债券的身份结构。一个债券的地址背后是一对密钥,公开的 UTXO 出点、地址的见证脚本、以及用该私钥对某条消息(比如”本债券归属某某身份,有效期至某日”)的签名,三者合起来构成可验证的证明:任何人拿全节点都能核对那笔锁仓真实存在、锁到期时间确如所述、签名确由该密钥所出。被牺牲的是时间价值——这笔钱即使一直涨,持有者在锁期内也动不了它。锁越久、金额越大,这个身份的建造成本越高,而成本”可以被任何人客观验证”这一点,和工作量证明的精神一脉相承。

没有派生方案时,每个债券密钥都要单独备份,私钥散落、恢复全靠运气。BIP-46 的解法借用 BIP-84 的账户结构,派生路径写成 m/84’/0’/0’/2/index——变化分支固定为 2,和常规收款/找零链分开,index 从 0 一路编到 959,共 960 个地址,钱包必须一次性生成全部 960 个并逐个检查余额与历史,不留间隙极限。最妙的是 index 的双重身份:它同时决定密钥和时间锁。序号对 12 取余定月份、除以 12 定年份,从 2020 年 1 月起算、到 2099 年 12 月为止,80 年乘 12 个月正好 960 档,每档的时间锁取该月第一秒的 UNIX 时间戳。地址脚本是 P2WSH,见证脚本就一行:OP_CHECKLOCKTIMEVERIFY、OP_DROP、OP_CHECKSIG——先验时间锁到没到期,再验派生密钥的签名。设计与序号都从种子推出,用户只需备份种子加一句”用 BIP-46 方案”,连”每个地址锁到哪年哪月”都能重放出来。

和 BIP-49 家族一样,它有意不向后兼容别的钱包:换一个不认识这个方案的钱包导入种子,根本发现不了这些债券地址,用户会立刻意识到”钱不见了”而不是被静默漏掉。原文把这当成特性——漏报比误报更容易被察觉和修复。对冷存储里的债券,提案建议走证书流程:债券密钥(冷端)对一个日常活跃公钥做一次签名背书,证书消息由固定字串、被授权公钥与到期编号三段拼成,到期编号按 2016 块一个周期计数,密钥若泄露,证书到期自然失效;此后热端代为签名时出示证书加自身签名,验证者用这层绑定代替现场扫描锁仓。

它停在哪里?BIP-46 至今是 Draft,实现集中在 JoinMarket 一个生态:钱包内建债券创建与证明功能,协调者在选币时可以用债券重量加权。它没有走向通用协议,原因不难理解:债券是某个协议自己的经济道具,派生标准解决的是”这个生态的用户如何省心”,而不是全网共识。也因此读它时要分清两层——时间锁地址本身靠 CLTV(BIP-65)那套共识规则支撑,是比特币的通用能力;派生路径与证书流程则是应用约定,换生态就不一定认。

常见误区有三。其一,以为债券到期前完全无用:锁仓不花掉,但债券带来的身份加权在锁期内持续生效,这正是设计的价值。其二,以为锁定期能改:时间锁写进脚本,到期前无法动用,也无法”续锁”成另一个到期日,想要新期限要另建新债券。其三,以为这套方案抗女巫是”金额决定一切”:锁定时长同样进入成本函数,一年的一枚币和二十年的同一枚币成本完全不同。

快速问答。问:BIP-46 的债券在别的混币或匿名场景也自动有效吗?答:不,证明的采信规则由各协议自定,派生标准只保证同一生态内可复现。问:种子丢了怎么办?答:与所有 HD 方案一样种子即全部,这正是把密钥集中到种子的代价。问:协调者能伪造别人的债券吗?答:不能,债券证明用债券私钥签名,伪造需要先花掉锁仓成本。

风险提示:锁仓意味着流动性牺牲;本文是机制科普,不构成投资建议,也不构成对任何混币服务的使用建议。

把币锁进时间换身份:BIP-46 时间锁保真债券的派生方案 图 2
把币锁进时间换身份:BIP-46 时间锁保真债券的派生方案 · 图 2