BIP-0021 详细说明
BIP: 21
Layer: Applications
Title: URI方案
Author: Nils Schneider
Matt Corallo
Comments-Summary: No comments yet.
Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0021
Status: Final
Type: Standards Track
Created: 2012-01-29
这个BIP是Luke Dashjr早期BIP 0020的一个修改。 BIP 0020基于Nils Schneider早期的文件。 BIP 0020中的替代支付金额已被删除。
摘要 这个BIP提出了一个用于支付比特币的URI方案。
动机 这个URI方案的目的是让用户只需点击网页上的链接或扫描QR码即可轻松付款。
规范 处理的一般规则(重要!)
比特币客户端不得在未获得用户授权的情况下对URI进行操作。 他们应该要求用户手动批准每个付款,但在某些情况下,他们可能会允许用户自动做出这个决定。
操作系统集成
图形比特币客户端应该注册自己作为默认的“比特币:”URI方案的处理程序,如果没有其他处理程序已经注册。 如果已经有一个注册处理程序,它们可能会提示用户在第一次运行客户程序时更改一次。
一般格式
比特币URI遵循RFC 3986中规定的URI的通用格式。路径组件由比特币地址组成,查询组件提供额外的支付选项。
查询组件的元素可能包含有效范围之外的字符。 这些必须首先根据UTF-8进行编码,然后按照RFC 3986中所述,相应的UTF-8序列的每个八位字节必须进行百分比编码。
ABNF语法
bitcoinurn= "bitcoin:" bitcoinaddress [ "?" bitcoinparams ]
bitcoinaddress = *base58
bitcoinparams= bitcoinparam [ "&" bitcoinparams ]
bitcoinparam= [ amountparam / labelparam / messageparam / otherparam / reqparam ]
amountparam= "amount=" *digit [ "." *digit ]
labelparam= "label=" *qchar
messageparam= "message=" *qchar
otherparam= qchar *qchar [ "=" *qchar ]
reqparam= "req-" qchar *qchar [ "=" *qchar ]
这里,“qchar”对应于RFC 3986 URI查询组件的有效字符,不包括此BIP作为分隔符的“=”和“&”字符。
计划组件(“比特币:”)不区分大小写,实现必须接受大写和小写字母的任意组合。 其余的URI区分大小写,包括查询参数键。
查询键
- 标签:该地址的标签(例如,接收者的姓名)
- 地址:比特币地址
- 消息:向用户描述交易的消息(请参阅下面的示例)
- 大小:基础比特币单位数量(见下文)
- (其他):可选,用于将来的扩展
比特币客户端可以以任何形式来显示金额,而不是用来欺骗用户的。 他们应该选择一种最容易混淆的格式,只有在最合理的情况下才能提供所要求的金额。 例如,只要大多数用户以BTC为单位工作,即使mBTC或TBC会对数量进行更合理的解释,也应始终在BTC中显示值。
原理 付款标识符,而不是个人标识符
【区块链技术|【比特币】BIP-0021 详细说明】目前的最佳做法是每个交易都应该使用一个独特的地址。 因此,URI方案不应该代表个人信息的交换,而应该是一次性支付。
可访问性(URI方案名称)
如果外部的人碰巧看到这样的URI,那么URI方案名称就已经给出了描述。 然后快速搜索,以帮助他们找到支付所需的资源。 其他提出的名字听起来更加神秘; 有人因为好奇而谷歌浏览器的机会要小得多。 另外,很可能,他会发现大部分技术规格 - 而不是比特币的最佳介绍。
向前兼容
被认为需要前缀的变量被认为是必需的。 如果一个客户没有实现任何以req-为前缀的变量,它必须考虑整个URI是无效的。 任何其他没有实现的变量,但是没有以req-开头的前缀,都可以被安全的忽略。
向后兼容
在写这个BIP时,有几个客户已经实现了一个类似于这个的比特币:URI方案,但是通常没有额外的“req-”前缀要求。 因此,为了让客户开发人员能够发布新的版本,建议在完成本BIP的6个月的宽限期之后,以任务关键的方式使用前缀的附加变量,以及 老客户升级。
附录 简单的语法
本部分是非规范性的,并不涵盖所有可能的语法。 请参阅上面的BNF语法的规范语法。
[foo]表示可选,是占位符
bitcoin:[?amount=][?label=
例子
只有地址:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W
带着名字:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?label=Luke-Jr
请求20.30 BTC到“Luke-Jr”:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=20.3&label=Luke-Jr
请求50 BTC的消息:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=50&label=Luke-Jr&message=Donation%20for%20project%20xyz
一些未来版本的变量是(当前)不了解和要求,因此是无效的:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-somethingyoudontunderstand=50&req-somethingelseyoudontget=999
一些未来版本的变量,(当前)不明白,但不是必需的,因此是有效的:
bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?somethingyoudontunderstand=50&somethingelseyoudontget=999
字符必须是正确的URI编码。
参考实现 比特币客户端
- Bitcoin-Qt支持旧版本的比特币URI(即没有req-前缀),与Windows和KDE集成为70f55355e29c8e45b607e782c5d76609d23cc858。
- Javascript - https://github.com/bitcoinjs/bip21
- Java - https://github.com/SandroMachado/BitcoinPaymentURI
- Swift - https://github.com/SandroMachado/BitcoinPaymentURISwift
- http://wiki.jabbercn.org/RFC3986
推荐阅读
- 数据结构和算法|LeetCode 的正确使用方式
- #|7.分布式事务管理
- #|算法设计与分析(Java实现)——贪心算法(集合覆盖案例)
- #|算法设计与分析(Java实现)—— 动态规划 (0-1 背包问题)
- #|阿尔法点亮LED灯(一)汇编语言
- #|Multimedia
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- 基础课|使用深度优先搜索(DFS)、广度优先搜索(BFS)、A* 搜索算法求解 (n^2 -1) 数码难题,耗时与内存占用(时空复杂度)对比(附((n^2 - 1) 数码问题控
- #|学习笔记 | Ch05 Pandas数据清洗 —— 缺失值、重复值、异常值
- win10|搏一搏 单车变摩托,是时候捣鼓一下家中的小米电视机啦。