概要

这个 BIP 描述了一种通过二维码来签名交易的过程。

假设我们有两个设备。一个拥有交易历史可以生成和发送交易,另一个拥有私钥可以签名交易。

我们定义了一个格式,用来把未签名交易通过二维码传送给后者,后者签名后,再把已签名交易通过二维码传送给前者。

目的

通过这种方式,比特币的私钥就能够安全的存储在离线设备上了。这是保存私钥最安全的方式了。通过二维码,用户还是可以从这些离线存储的私钥上花比特币。

如果在线和离线的比特币客户端都遵循这种方式的话,那么之间将能够更加顺畅的进行沟通。

过程

在离线签名的过程中,有两个需要定义的角色。”热钱包”是拥有交易历史和未花费交易输出的,在线的设备;“冷钱包”是拥有私钥的离线的设备。

1. 热钱包根据未花费交易输出来生成一个未签名交易。不过热钱包没办法对它进行签名。
2. 热钱包把需要签名的内容转换成符合格式的一系列待签名的二维码。热钱包显示这些二维码。
3. 冷钱包扫描热钱包上显示的二维码,得到待签名的内容。
4. 冷钱包根据待签名的内容找到正确的私钥。
5. 冷钱包给待签名的内容进行签名。
6. 冷钱包把签名后的内容转换成符合格式的一些列二维码,显示在屏幕上。
7. 热钱包通过扫描冷钱包上的二维码得到签名好的内容,并把它加到未签名交易上。
8. 热钱包检查交易是否已经被正确的签名了。如果检查通过,就把这笔交易广播给其它节点。

格式

只有二维码都符合一个特定的格式,热钱包和冷钱包才能够顺利地理解对方的意图。

格式如下

未签名的内容

需要签名的内容是交易输入的哈希。另外冷钱包也需要一些相关信息来询问用户是否要对这个交易进行签名。

如下这些部分将会以冒号分隔连接起来,成为未签名二维码的内容

1. 用来发送比特币的地址
2. 交易手续费
3. 用来接收比特币的地址
4. 要发送的比特币(不包含手续费)
5. 冒号分隔的交易输入的 Sha256 哈希的十六进制表示格式

已签名的内容

冷钱包给交易的输入都做了签名之后,根据这个签名生成好交易输入脚本。冷钱包把这些交易输入脚本转换成十六进制的格式,用冒号分隔连接起来,即为已签名二维码的内容。

对于二维码的优化

根据 Information capacity and versions of the QR Code,当一个二维码的内容只有大写字母、数字、和几种标点的时候,这个二维码可以承载更多的内容。我们可以据此来优化二维码的内容。

一下这些规则会用在生成二维码的过程中

1. 所有的字节数组都会以由大写字母构成的十六进制字符串表示
2. 比特币地址会以它 Base58 之前的字节数组的十六进制形式表示
3. 比特币的数量会以聪为单位的十六进制形式表示

二维码的分页

一个交易可能含有多个交易输入。这样一来,未签名或者签名的信息都有可能会变得很长,甚至有可能会超出单个二维码的承载能力。

含有过多信息的单个二维码,如果显示在一个大小受限的显示设备上时,有可能会出现很难扫描的情况。

所以我们需要一个方法来给二维码分页。

根据显示设备的大小不同也会有不同的单个二维码内容的长度。我们发现在智能手机上显示时,328 是一个比较合适的单个二维码内容长度。

当我们需要多页二维码时,我们会在每页二维码的内容前面加上这些字符 (总页数 - 1):(从 0 开始计数的当前页数): 

例如,一共分了3页,第1页就会有这样的开头 2:0:
粤ICP备13045746号