术语表 /开发者参考
URI 二维码
- URI 二维码是什么?
- URI 二维码是编码 bitcoin: URI 的方形黑白图案,相机可以读取其中的地址和金额,免去手动输入。
扫描免去了手动输入,而差错正是出在输入环节。以大写字母书写的 bech32 地址适用二维码的字母数字模式,BIP173 指出该模式比字节模式紧凑约45%,因此大写的二维码模块更少,扫描也更可靠。二维码无法做到的是,告诉您其中的地址是否属于您以为的那个人。
运作方式
二维码是一种通用数据容器,标准为 ISO/IEC 18004,比特币只是在其中放入一段文本形式的 URI。
该格式提供多种编码模式。字母数字模式涵盖45个字符的字符集:数字、大写字母、空格和九个标点符号,每两个字符占11位。字节模式可容纳任何内容,但每个字符占用完整的8位。字母数字字符集不含小写字母,所以钱包常把整段字符串以大写形式呈现,如 BITCOIN:BC1Q...。URI 方案不区分大小写,bech32 地址只要不混用大小写,两种写法都有效,因此改用大写是安全的,还能缩小方格。
以1或3开头的 Base58 地址没有这个选项,因为其字符集区分大小写,改动一个字母就会改变地址。这是 bech32 一个细小而具体的优势,却很少被提及。
纠错级别在生成时选定。四个级别大约可恢复受损二维码的7%、15%、25%和30%。暴露在风雨中的印刷贴纸适合采用最高级别,屏幕则无此必要。容量在这里从来不是限制因素:最大版本的二维码可容纳4,296个字母数字字符,而典型的比特币 URI 长度在50至120个字符之间。
在哪里会遇到它
每天有四种场景会生成比特币二维码,其可信程度并不相同。
交易所的充币页面会为其希望您充币的地址生成一个二维码。硬件钱包自带的屏幕会为其内部派生的地址生成一个二维码,这是唯一能核实来源的版本。商户结账页面会印出一个统一二维码,同时包含链上地址和闪电网络发票。比特币 ATM 在购买时显示一个二维码,通常附有倒计时。
第二种场景与其余几种的区别,正是硬件钱包安全论证的全部所在。控制了您屏幕的恶意软件可以重绘二维码,却无法重绘 Trezor 或 Ledger 屏幕上的那一个。请在设备上生成二维码,再核对设备同时印在其下方的字符。
实体二维码更容易成为攻击目标。FBI 的 Internet Crime Complaint Center 于2022年1月18日发布公共服务公告,提醒犯罪分子把自己的二维码贴纸贴在合法二维码之上,这种手法至今仍在。对于公共场所纸上印刷的任何二维码,在目标地址与您另行预期的信息相符之前,都应视为未经核实。
还有一种无害的用途值得了解。物理隔离的签名设备通过动态的二维码序列(每秒循环数帧)传入和传出部分签名的交易,因为相机和屏幕构成的数据通道没有线缆,也没有可供攻击的 USB 协议栈。
URI 二维码 vs 地址
地址是文本,URI 二维码则是一段更长文本的图像,其中碰巧包含一个地址。扫描只含纯地址的二维码,钱包得到的只有收款目标,金额仍需手动输入。扫描含完整 URI 的二维码,则会自动填入金额、标签,有时还有闪电网络发票。两者在肉眼看来完全一样,因此,扫描后显示已预填总额的钱包,是在向您说明它实际读到了什么。