比特币放弃的支付协议:BIP70 与 Core 0.20 的删除记录 图 1
比特币放弃的支付协议:BIP70 与 Core 0.20 的删除记录 · 图 1

一个比你以为更早的「扫码支付」

今天扫比特币收款码,你拿到的是一个 bitcoin: 链接加一串地址。但协议史上出现过一套更雄心勃勃的方案:BIP70 支付协议,官方状态至今仍标为 Deployed。它的目标不是传地址,而是传递一份可验证的支付请求:商家服务器生成一条 PaymentRequest 消息,用 Protocol Buffers 编码,声明这笔款付给哪个网络(main 或 test)、付到哪组输出(outputs 里可以直接带退款地址,让商家无需联系客服就能原路退回多付款项)、附给用户看的备注文本,以及一个通常走 https 的 payment_url,钱包付完款后把 Payment 消息发回去换取回执 PaymentACK。

信任从哪来

协议规范要求整条请求用 X.509 证书做认证:商家出示证书链,钱包验证签名,用户屏幕上显示的是「经证书核验的商家名称」而非裸地址。规范还留了一个细节:payment_url 至少要有效到付款期限为止,商家不得提前弄坏它,因为服务端需要能记录错付。对照今天「地址即一切、对错自负」的朴素模型,BIP70 试图搬来的是银行卡收单式的身份与回执体系。

删除现场

比特币核心 0.20 的发布说明在 Build System 一节留下两行并列的记录:其一,OpenSSL 不再被比特币核心使用;其二,BIP70 支持已被彻底移除,--enable-bip70 编译选项保留但配置时直接报错。一份需要证书体系、需要商家服务器、需要钱包持续维护解析器的协议,最终从参考实现里连根拔起。发布说明没有展开理由,但公开讨论里被反复提到的负担包括:X.509 证书基础设施在比特币语境下几乎没有商家部署,TLS 认证体系随行业信任迁移变得不可靠,以及协议解析代码本身的安全维护成本。协议规范仍在 BIP 仓库里,状态字段也还挂着 Deployed——纸面活着与生态活着是两回事,这正是比特币「标准靠采用而非任命」的注脚。

它留下的痕迹

BIP70 并非毫无遗产。多输出请求的思想在批量付款和混币协作里换了形态;「付款前校验收款方信息」的需求,后来由 BIP21 URI 参数、PSBT 的描述符体系乃至 Taproot 时代的收款方案讨论分别接棒。普通用户今天能做的核验仍然朴素而可靠:先在两个独立渠道核对地址前缀与后缀,再核对金额与费率,把「验证地址」当成支付仪式的固定环节。

对现在的你意味着什么

如果你在旧文档或旧版软件里撞见 bip70 字样:升级核心即可绕开,0.20 之后的版本不再编译该代码;如果你在用老收单服务,确认它走的是 URI 还是 PSBT 流程;如果你在评估自建收款,答案是别给这条技术路线投简历——自托管收款的主流方案早已分叉到别处。值得补充的是,bitcoin: 这个 URI 方案(BIP21)活得比 BIP70 好得多:一个链接携带地址与金额参数,无需服务器、无需证书,把「能跑通」三个字贯彻到底。协议竞争史在这里给出的教训很直白:需要额外基础设施的那一方,必须先证明基础设施本身可负担,才轮得到谈体验与安全。

时间线上的两个易混点

第一,BIP70 与 BIP21 不是一回事:前者是带消息结构与证书认证的支付协议,后者只是 bitcoin:地址?amount=数量 风格的链接语法,今天你的钱包扫码解析的大多是后者。第二,OpenSSL 与 BIP70 在同一个版本的构建系统条目里退场,容易让人误以为二者互为因果;更准确的理解是:参考实现同时在给依赖做减法,安全库换成内置实现,冷置多年的协议解析代码一并移除,动机都是缩小攻击面与维护面。

风险提示:本文是协议历史科普,不构成任何支付方案推荐或投资建议;涉及支付集成时以现行官方文档为准。