术语表 /开发者参考
r 参数
- r 参数是什么?
- r 参数是 BIP72 为比特币 URI 增加的参数,它以一个 URL 取代支付地址,您的钱包应从该 URL 获取已签名的支付请求。
规定于 BIP-72。
扫描带有 r 参数的二维码,会让您的钱包在向您显示任何内容之前先获取一个网页。BIP72 于2013年7月29日发布,使用的是单独的 r,而非为必选参数保留的 req-r 写法,因此旧版钱包可以忽略它,转而向该地址付款。如今您遇到的任何结账页面都不会再向您提供这样的参数。
运作方式
r 参数是一个查询参数,其值为经百分号编码的 HTTPS URL,BIP72 为它定义了两种形式。兼容形式在 URI 中保留一个正常地址,并把该参数附加在地址之后:从未听说过支付协议的钱包会向该地址付款,而理解 r 的钱包会忽略该地址并获取支付请求。精简形式则完全省略地址,形如 bitcoin:?r=https://store.example/i/8f3a,旧版软件根本无法对其付款。
将该参数设为可选,是对 BIP21 的有意解读:其语法把无法识别的参数分为两类,带 req- 前缀的任何参数必须使钱包拒绝该 URI,其他参数则可以跳过。因此把该字段命名为 r 而非 req-r,选择的是平稳降级。BIP72 也写明了相反的行为:确实无法接受直接向地址付款的商家,可以写成 req-r,迫使不兼容的钱包停止操作,而不是发送结账系统无法对账的资金。
该 URL 返回的是一个 protocol buffer,以 BIP71 为其注册的 MIME 类型提供。BIP73 随后加入了内容协商:同一个链接,可根据客户端发送的 Accept 标头,向钱包返回支付请求,向浏览器返回供人阅读的普通网页。
在哪里会遇到它
目前的实际使用中已找不到 r 参数。Bitcoin Core 在0.20.0版本移除支付协议支持后,不再跟随这类 URL;曾经生成它们的商家工具,也已被签发普通 BIP21 URI 和闪电网络发票的软件取代。仍然生成 r 参数的支付页面,运行的是多年无人维护的集成,合理的做法是改用其他方式付款。
这个字段留给您的习惯,比字段本身存续得更久。二维码无法被人直接读懂,因此扫描二维码就是对其来源的一种信任:可能是屏幕、打印的发票,或贴在机器上的贴纸。r 参数把这一点变得直白:它交给您的钱包一个要去联系的 URL,这也使您的 IP 地址在您同意任何事情之前就暴露给了商家的服务器。普通地址二维码若被人悄悄调换,也存在同样的暴露,只是形式更平淡。请在扫描设备无法控制的显示屏上确认收款地址,对硬件钱包而言就是设备自带的屏幕,并核对足够多的字符以确保无误,而不是只瞥一眼前四位。
r 参数 vs 比特币 URI
比特币 URI 是整个字符串,r 参数只是其中一个可选参数。两者的区别在于权限的方向。amount、label 和 message 等参数是对 URI 中已有目的地的补充,钱包忽略其中任何一个,仍会把资金发往正确的地方。r 参数则颠倒了这种关系:凡是理解它的地方,它都会完全覆盖地址,把资金去向的决定权从您眼前的字符串转移到了别处的服务器。