协议演进 / BIP/比特币改进提案 / BIP-20
BIP-20
最早成文的 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 完整继承:
- 支付标识,不是个人标识:当时的最佳实践是每笔交易用一个新地址。所以 URI 表达的应是一次性付款,而不是某个人的长期身份信息。
- 名字本身要能自解释:方案名就叫 “bitcoin:”,路人看到也能猜出用途、搜得到资料;过于晦涩的名字会挡住新用户。
原文还专设 “Forward compatibility” 一节:希望 2011 年生成的 URI 到 2036 年还能用,所以要留足扩展余地;同时也写明这只是当下能做到的最好版本,不应被视为一成不变,后人应能在不打碎旧 URI 的前提下改进它。
四、规则本身
4.1 通用处理规则(原文标为“重要”)
- 客户端不得在未取得用户授权时对 URI 采取行动;
- 客户端应要求用户逐笔手动批准付款;在某些情形下,可以允许用户预先设定自动批准。
图形客户端应默认把自己注册为 “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 金额:十进制、十六进制与指数
这是本版最复杂、也最先被砍掉的部分。金额可以:
- 用十进制写,表示标准 BTC 单位;
- 用单个 “x” 前缀改走十六进制,表示 ᵇTBC 单位(原文注:等值于 42.94967296 BTC);
- 在数字后加 “X<数字>” 表示指数乘数:如 “X8” 即乘以 100,000,000。十进制缺省按 X8 理解,十六进制缺省按 X4;表示比特币基础单位时应用 “X0”。
于是同一笔请求能写成 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。拿旧文法去解析今天的链接,或按旧文法生成链接,都会出错。
七、延伸
- 阅读版:https://bips.dev/20
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0020.mediawiki
- 相关:BIP-21 URI 方案(取代本页)、BIP-321(接替 BIP-21)
- 仓库总目录:https://github.com/bitcoin/bips
