比特币交易的隐私漏洞之一,是那条被分析公司反复收割的假设:一笔交易的输入默认属于同一个人。混币用一堆互不相干的输入冲淡这条假设,而 2018 年 10 月立项的 BIP-79 走了个轻巧得多的切口:付款的时候,让收款方也掺一手——收款的商家加一个自己的输入进来,共同拼出一笔结构上说不清是谁的交易。协议起名叫 Bustapay,“专门打破分析假设的支付”。状态 Closed,从未部署,但它对”商家侧 UTXO 卫生”的设计切入至今少见。
五步流程:签名权始终在两边手里
第一步,付款方构造一笔完整签好名的”模板交易”——所有输入必须用隔离见证,交易必须达到可被网络中继的条件,但先按住不广播。第二步,模板交易通过 HTTP POST 原样发给商家的 bustapay 接口,请求体是二进制编码。第三步,商家验证这笔交易,确认付款到位后,往交易里加入自己的一个(或多个)“贡献输入”,并相应调大付给自己的那笔输出——一般就加上贡献输入的总额——然后把这份半成品回传。第四步,付款方验证半成品没被动过手脚,只对自己原有的输入重新签名,广播。第五步,商家在链上看到终版交易后,按实际金额(而不是链上看起来的金额)记账;如果付款方迟迟不广播,商家直接把模板交易广播出去——反正它本来就是完全有效的一笔付款。
每个字段背后都站着一个对手
这套流程的每一步都有一段攻防注脚。模板交易要求”已签名可中继”,是为反白嫖:付款方要是中途跑路,商家手里始终有一笔能自己广播的真付款,攻击的代价被绑在一次真实花费上。付款方的红线是只签模板里出现过的输入——商家可能”贡献”一个其实是付款人自己的输入,赌你手滑全签了。商家侧的防线在重复请求上:有人可能不断发来只差一个输入的交易变体,钓出商家的 UTXO 清单,所以规范商家对见过的同一批输入永远返回同一个贡献输入;已花过的收款地址干脆别接受 bustapay,免得被探测归属。接口约定走 BIP-21 编码的 URI 加一个自定义参数 bpu(bitcoin 链接是什么?比特币 URI 语法与 req 参数规则解读 讲过这套 URI 的参数纪律,未知参数可以安全忽略正是这类扩展能活的前提);商家不满意(比如费率太低)用 HTTP 422 带一句人话理由回绝,钱包里没有输入可加就回 500,付款方回退普通支付——提案明说,退回普通交易是必须保留的行为。
对商家真正的甜头:UTXO 只减不增
混币工具常被忽略的一个代价,是把你的 UTXO 数量越混越多,而商家钱包的头号慢性病恰恰是 UTXO 堆积——每一笔进账都在给未来攒花费体积。Bustapay 的构造让收款不新增输出:商家用自己的粉尘或旧余额垫一个输入进来,同时把收款输出合并放大,一笔交易既收了款又做了一次内务整理。交易外形上又没有混币那种标志性结构,分析器无从标注”这是混币”。这也是提案在动机段强调”简单性优先”的原因:不引入协调方、不引入服务器基础设施、不需要混币池,商家只需要在收单接口上加一个 POST 端点。
为什么它还是 Closed
同期另一条协作支付路线 BIP-78 Payjoin(比特币 Payjoin 是什么?BIP78 如何隐藏付款结构泄露)走了”把找零反哺给付款人”的设计,拿到了钱包与服务商的实装;BIP-79 的文档头部也把 78 写进了 Proposed-Replacement 字段,两条路线在 2018 年属于同台竞争,胜负在采用端早已分晓,提案随之关闭。更大图景里它是 CoinJoin 家族(CoinJoin是什么:混币协作交易的原理与协调者时代的变迁)的一次极简变体实验。它留下的问题意识依然锋利:隐私改进如果要求商家换基础设施,成功的概率天然低;把改动压进”一个 POST 加一次重新签名”,哪怕最后也没人部署,也比又一层协议堆栈更接近现实支付。
风险提示:本文是支付协议机制科普,不构成投资建议;协作签名的任何交易在广播前都必须逐项核对自己签过的输入,这条纪律与协议好坏无关。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。