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

BIP-20 URI 方案

最早成文的 bitcoin: 支付链接规范:带版本号、可用十六进制与指数写金额,甚至能用 send 参数传私钥——这套复杂语法很快被 BIP-21 简化取代。本 BIP 目前处于已关闭状态。

一、档案卡

档案卡
编号BIP-20
标题URI Scheme
作者Luke Dashjr <[email protected]>
指定日期2011-01-10
层级Applications(应用)
类型Specification(规范类)
状态Closed(已关闭)
接替文档Proposed-Replacement: BIP-21
阅读版https://bips.dev/20
官方原文https://github.com/bitcoin/bips/blob/master/bip-0020.mediawiki

二、放在哪一族

bitcoin: URI(支付链接)族的第一份正式文本。它基于 Nils Schneider 的一篇更早文档写成,原文开头即注明:本 BIP 已被 BIP-21 取代。

这条链条是:BIP-20(本页,语法最全也最重)→ BIP-21(砍掉备选金额写法、简化为十进制 BTC)→ 再后来由 BIP-321 接替 BIP-21。日常扫码付款、点链接付款用的都是这条线后代的形式;本页是这条线的源头档案,能看清最早的设计者想把多少功能塞进一条链接里——包括后来被一致认为不该留的东西。

与地址、多签等族不同,URI 族完全在应用层:它不碰共识、不碰脚本,只规定“一条付款请求链接应该长什么样、客户端拿到链接后必须怎么做”。

三、它要解决什么

目的很朴素:让用户点一下网页链接、或扫一下 QR 码,就能发起一笔付款,不用手抄地址、不用手输金额。

设计上有两条贯穿全文的立场,后来被 BIP-21 完整继承:

原文还专设 “Forward compatibility” 一节:希望 2011 年生成的 URI 到 2036 年还能用,所以要留足扩展余地;同时也写明这只是当下能做到的最好版本,不应被视为一成不变,后人应能在不打碎旧 URI 的前提下改进它。

四、规则本身

4.1 通用处理规则(原文标为“重要”)

图形客户端应默认把自己注册为 “bitcoin:” 方案的处理程序(若尚无其他处理程序);若已有,则首次运行时可以提示用户是否改选自己。

4.2 语法(BNF)

bitcoin:<address>[;version=1.0][?amount=<amount>][?label=<label>][?message=<message>][?send=<private key>]

正式文法中地址为 Base58 字符串,参数部分可包含:amount(金额)、label(收款方名称等标签)、message(扫码后展示给用户看的消息)、send(用于“发送”而非“请求”比特币),以及为将来扩展保留的其他参数。字符须正确做 URI 编码。

例:只有地址 bitcoin:1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L;请求 20.30 BTC 并标注收款人 …?amount=20.3X8&label=Luke-Jr。

4.3 金额:十进制、十六进制与指数

这是本版最复杂、也最先被砍掉的部分。金额可以:

于是同一笔请求能写成 amount=50X8、amount=x400X4(400 TBC)等多种形态。客户端显示金额时可以选用任何不欺骗用户的格式,应以“最不易混淆”为首要原则;在多数用户以 BTC 计价时,默认按 BTC 显示。

4.4 send 参数:经链接“发送”比特币

原文还规定了一种今天看来相当异质的功能:付款人先生成一对新密钥,把要送出的金额打到对应地址,在 URI 中以 send=<Base58 编码的私钥> 把私钥随链接交给对方;对方钱包凭此找到那笔输出、构造领取交易即可把钱领走。原文特别注明:在领取交易确认之前,发送方可以把这笔钱取回。

五、谁必须动

普通用户:任何 bitcoin: 链接都不能自动扣款——客户端必须先征得本人批准。这一条是全文的安全底线。

钱包 / 客户端开发者:注册系统级 “bitcoin:” 处理程序;正确解析 4.2、4.3 的文法(含十六进制与指数金额);显示金额时不得误导;若实现 send,须处理“领取前发送方可取回”的语义。

商户与付款请求生成方:按文法生成链接,label、message 等字段须正确做 URI 编码,并为未来扩展留出其他参数的位置。

共识层 / 全节点:无任何关系。URI 是纯应用层的约定,节点不感知链接的存在。

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

状态为 Closed,已被 BIP-21 取代。BIP-21 原文交代得很清楚:它修改自本页,本页的备选金额写法(十六进制、指数那一整套)已被移除,金额一律只用十进制 BTC。因此今天遇到的 bitcoin: 链接,应按 BIP-21(及其后续 BIP-321)的简化语法理解;本页的 version 段、x 前缀、X 指数与 send 私钥参数都是历史设计,不再是现行规范的一部分。

它仍值得读:用户授权不得缺位、支付标识而非个人标识、为几十年后的兼容留扩展位——这些立场全部被后代继承,删掉的只是过重的语法。

常见误读:

“bitcoin: 链接里的金额可以用 amount=x400X4 这种十六进制写法。”

那只是 BIP-20 的旧规定。本页状态已是 Closed,取代它的 BIP-21 明确移除了全部备选金额表示,规定金额必须用十进制 BTC。拿旧文法去解析今天的链接,或按旧文法生成链接,都会出错。

七、延伸

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