协议演进 / BIP/比特币改进提案 / BIP-121

BIP-121 付款证明 URI 方案

定义 btcpop: URI 方案,把付款证明请求(回送地址与一次性随机数)编码成可扫码或经 NFC 传递的链接。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-121
标题Proof of Payment URI scheme
作者Kalle Rosenbaum <[email protected]>
指定日期2015-07-27
层级Applications(应用)
类型Specification(规范类)
状态Closed(已关闭)
阅读版https://bips.dev/121
官方原文https://github.com/bitcoin/bips/blob/master/bip-0121.mediawiki

二、放在哪一族

应用层的 URI 方案族,是 BIP-120(Proof of Payment)的配套传输层。BIP-120 明确把“请求如何送达钱包”留给单独规范,BIP-121 就是那份规范。

它的骨架直接沿用比特币支付链接 BIP-21:同样的查询参数风格、同样的 UTF-8 与百分号编码规则、同样的扩展规则,只是换了 scheme 与必填参数。同族还有为区块链引用设计的 BIP-122(blockchain: 方案),两者都是“用一条链接把意图递给用户自己的钱包/工具”的思路。

三、它要解决什么

BIP-120 的流程第一步是:想验证付款的一方把 PoP 请求送到付款人的钱包。请求里有回送地址、一次性 nonce、以及定位交易的提示——这些信息怎么递过去,需要一个钱包能统一识别的载体。

本提案的答案是 URI:把请求编码成一条 btcpop: 链接,可以印成二维码让钱包扫,也可以经 NFC 传递。钱包一打开链接,就知道要为哪笔付款生成证明、把证明发到哪里、用哪个 nonce。

四、规则本身

4.1 与 BIP-21 的四点差异

规范主体与 BIP-21 相同,差异只有四处:

可选参数 txid 给出要证明的交易哈希,同样用 Base58 编码。除 p 与 n 外,所有参数都只是帮钱包定位交易的提示。BIP-21 的可扩展性同样适用(例如将来可加 date、toaddr 参数);req- 前缀参数的规则不变:钱包不支持某个 req- 参数时,必须视该 URI 为无效。

4.2 为什么强调 URI 要短

二维码太长,镜头有划痕或分辨率低时就扫不稳。因此 nonce 与 txid 都用 Base58 而非十六进制:txid 由此从 64 个字符压到 44 个。p 参数也不应无谓地长。

4.3 钱包如何解读提示

钱包用 URI 中的提示过滤自己的交易集:label、amount、message 若出现,必须与原付款的对应数据精确匹配(label 对应 BIP-21 的 label 或 BIP-70 PaymentDetails 的 memo;amount 对应原付款输出金额之和;message 在 BIP-70 中无对应项);txid 必须与付款的交易哈希一致。

过滤后把候选交易展示给用户选择;恰好剩一笔时可以自动选中,但必须保留让用户在匹配项中自由选择的方式。候选为空时要提示无匹配;作为兜底,还必须允许用户无视全部提示、从钱包里任选一笔交易——以防钱包元数据因恢复备份等原因丢失。

4.4 PoP 如何回送

p 指向 http: 或 https: 时,钱包必须支持,且须用 POST 发送:PoP 以二进制序列化的交易作为请求体,Content-Type 设为 application/bitcoin-pop。p 也可以是其他类型的 URI(例如 mailto:)。

原文示例的结构如:btcpop:?p=https://www.example.com/pop/352&n=zgWTm8yH&label=video%2042923——回送到示例站点、带 nonce 与标签提示,全文可到原文核对三则完整示例。

五、谁必须动

普通持币人:无协议层面变化。多见的动作只是扫一个 btcpop: 二维码、在钱包里确认要证明的那笔付款。

钱包开发者:需注册处理 btcpop: scheme,按 4.3 实现提示过滤与兜底选择,并按 4.4 实现 http/https 的 POST 回送。

服务端开发者:需生成合规的 btcpop: URI(必填 p 与 n、nonce 每次随机),并准备好接收端点;其后的验证流程属 BIP-120。

全节点与矿工/共识层:完全不动。这是纯应用层的链接格式约定。

六、现在算不算数,以及一个常见误读

状态为 Closed(已关闭)。它依赖的 BIP-120 同样已关闭,btcpop: 没有成为钱包普遍注册的 scheme;原文给出的参考实现仍是当年的演示服务器与 Mycelium 分支钱包。

常见误读:“btcpop: 链接是用来付款的。”不对。它与 bitcoin: 支付链接长得像,但路径(地址)部分恒为空、根本不指定收款方;它传递的是一份“请证明你付过款”的请求。扫它不会转出任何比特币,真正签出的 PoP 也被 BIP-120 设计为不能上链成交。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。