术语表 /开发者参考
Bitcoin URI
又称 BIP21。
- Bitcoin URI 是什么?
- Bitcoin URI 将一笔付款的详细信息整合为一个可点击的字符串,该字符串以 bitcoin:开头,可包含地址、金额和标签。
规定于 BIP-21。
Bitcoin URI 是一个链接,点击后会打开您的钱包,并自动填好付款信息。BIP21 于2012年1月29日确定了其格式:协议头 bitcoin:,随后是一个地址,再之后是问号后面的可选参数。收到 URI 而不是单独的地址,可以让金额不再是您必须正确复制的内容之一。
运作方式
BIP21 的语法刻意保持精简,这是该格式十多年来始终没有变化的主要原因。
一个完整的 URI 形如bitcoin:bc1q...w5mdq?amount=0.00042&label=Coffee%20Shop&message=Order%20118。冒号和问号之间的全部内容是收款地址。问号之后是一组以 & 符号连接的name=value键值对,而 BIP21 只定义了三个:
amount是以比特币为单位的十进制数,不是聪,用句点书写,不带逗号和货币符号。amount=0.01表示一个比特币的百分之一,即1,000,000聪。label写明收款方,例如商店或个人。message说明这笔付款的用途。
两个文本字段均采用百分号编码的 UTF-8,因此空格变为 %20,标签内的 & 符号变为 %26。
有两条规则保证了格式的可扩展性。未知参数会被忽略,这使旧版钱包读取新的 URI 时不会出错。带有req-前缀的参数是例外:钱包若不理解此类参数,必须拒绝整个 URI,而不是猜测其用意。这一条规则就是全部的升级机制,此后所有扩展都靠它实现,而未破坏旧版软件。
如今该格式真正的活力体现在这些扩展上:
r=由 BIP72 新增,指向 BIP70 付款请求。这条路径已经失效。pj=来自 BIP78,指明一个 PayJoin 端点,使付款方和收款方能够共同构建一笔协作交易。lightning=在链上地址之外附带一张 BOLT11 发票。能识别它的钱包通过闪电网络付款,不能识别的钱包则回退到使用该地址,商户结账页面会把结果打印成一个统一的二维码。- BIP353 把完整的 URI 发布在
_bitcoin-payment标签下经 DNSSEC 签名的 TXT 记录中,使人类可读的名称能够解析为付款指示。
地址本身是可选的。BIP21 的语法允许地址字符为零个,bitcoin:?r=...就是这样运作的,如今仅含要约(offer)的 URI 也是如此。
购买比特币时为何重要
Bitcoin URI 最重要的时刻是提币:这时比特币从您无法控制的交易所转出,进入您自己掌控的地方。
本站收录的几乎所有交易所,从 Kraken 和 River 到 Relai 和 Bitpanda,都只提供一个纯文本框用于填写收款地址。这个框需要的是地址,而不是 URI。把bitcoin:bc1q...粘贴进去,通常会出现验证错误,偶尔还会出现字段被悄然截断并导致提币失败的情况。请取冒号和问号之间的内容,只粘贴这一部分。
反方向同样如此。您自己硬件钱包的收款界面、商户结账页面和点对点交易,给到您的都是 URI,而不是单独的地址。URI 只在一个方面更安全:金额随之一并传递,因此您不会输错总额。但在最关键的方面,它并没有更安全。URI 中没有任何内容带有签名。label字段是由构建该字符串的人任意填写的文本,因此钓鱼页面可以写入label=Kraken%20Withdrawal,您的钱包会原样显示这些文字,不做任何提示。
这正是硬件钱包屏幕才是关键防线的原因。无论 URI 声称什么,签名设备都会在剪贴板恶意软件无法改写的屏幕上,显示它即将付款的地址。请在设备上核对地址的开头和结尾字符,而不是在生成该链接的浏览器标签页中核对。
实例:支付咖啡店账单
假设收银台打印出一个二维码,您的手机读取到bitcoin:bc1q...w5mdq?amount=0.00042&label=Kaffeehaus&message=Table%207。
您的钱包从中解析出三项信息:支付0.00042比特币,发送到该地址,并在确认界面显示 Kaffeehaus 和 Table 7这些字样。随后它会做几件 URI 从未要求的事:选择花费您的哪些未花费输出,根据自己所见的内存池情况估算费率,添加一个找零输出,然后等待您批准。
它不会对收款方做任何验证。它没有核实该店铺是否控制这个地址、0.00042比特币是否为约定价格,也没有核实标签是否属实。这些核查要由您自己完成。一杯咖啡的风险只是损失一杯咖啡。若是五位数金额的转账,则值得在批准前,在签名设备上以四个字符为一组逐组读出地址。
Bitcoin URI vs 地址
地址只是单独的收款目的地,不附带任何指示。现代 bech32 地址的长度,单密钥 segwit 输出为42个字符,taproot 输出为62个字符,它并不说明应发送多少,也不说明发给谁。URI 则是一个容器:一个地址,加上可选的金额、标签和信息。您始终可以通过读取协议头与第一个问号之间的文本,从 URI 中取回地址。反过来则不行,因为地址从一开始就不带金额。
Bitcoin URI vs BOLT11 发票
BOLT11 发票是闪电网络上的对应物,在三个重要方面表现不同。它只能使用一次,它承诺的是支付哈希而不是地址,并且会过期,商户未设置时默认为3,600秒。Bitcoin URI 永不过期,可以被支付两次,这在捐赠页面是优点,在账单上则是隐患。统一二维码的做法是把一个 BOLT11 字符串放入普通 URI 的lightning=参数中,从而无需二选一,各钱包可使用自己支持的支付通道。