钱包
钱包技术概述
两种主要类型的钱包,区别在于它们包含的多个密钥是否相互关联。
- 第一种类型是非确定性钱包(nondeterministic wallet),其中每个密钥都是从随机数独立生成的。密钥彼此无关。这种钱包也被称为“Just a Bunch Of Keys(一堆密钥)”,简称JBOK钱包。
- 第二种类型是确定性钱包(deterministic wallet),其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分级确定性钱包或HD钱包。
确定性钱包由种子Seed衍生创造,为了便于使用,种子被编码为英文单词,称为助记词。
分层确定性钱包(HD Wallets)
确定性钱包被开发成更容易从单个“种子”中生成许多密钥。确定性钱包的最高级形式是通过BIP0032标准定义的HD钱包。
HD钱包包含以树状结构衍生的密钥,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。下图展示了树状结构。
相比较随机(不确定性)密钥,HD钱包有两个主要的优势。第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易收入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被用在企业环境中,这就可以支配不同的分支部门、子公司、具体功能以及会计类别。
HD钱包的第二个好处就是它可以允许使用者去建立一个公共密钥的序列而不需要访问相对应的私钥。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,而在服务器中不需要可用来支付的私钥。
钱包程序
钱包组件三大块:一个公钥发布程序,一个签名程序,一个网络程序。
发布公钥是一种通称,并不是把公钥发布出去,而是在大多数情况下,P2PKH或者P2PHde哈希值会被发布出去。只有当需要接收比特币的时候,
把公钥地址发布出去。
比特币钱包同时需要与点对点网络做交互,从而通过区块链获取信息以及广播新的交易。用来发布公钥的程序以及签名交易的程序其自身并不需要与点对点网络做交互。
完整服务的钱包
如果包括上面三大组件的最简单的钱包:生成私钥,生成对应的公钥,按照需要对公钥进行发布,监听以这些公钥作为输出的交易,创建交易并对其进行广播,广播已经签名的交易。
image几乎所有的钱包都可以作为完整服务的钱包。
全服务钱包的好处是很便于使用。一个单一的程序满足了用户接收和花费比特币的所有需求。
全服务钱包的主要坏处是它们将一台存储私钥的设备连接到了网络。这些设备上的存在弱点是很常见的,而且网络连接使得从存在弱点的设备传输私钥到攻击者更为容易。
为了阻止偷窃,很多钱包程序提供给用户对包含密钥的钱包文件进行加密的选项。当钱包没有在使用时,这种保护是有效的,但是它无法对抗专门截获加密密码或者从内存中读取已解密私钥的攻击。
只用于签名的钱包
为了提升安全性,私钥可以在更为安全的环境中由有单独的程序生成并做存储。只用于签名的钱包与一个可以进行点对点网络交互的钱包协同工作。
只用于签名的钱包通常使用确定性密钥创建方式来创建父私钥和公钥,之后还可以再创建子私钥和公钥。
image当第一次运行时,只签名的钱包创建一个父私钥并将其对应的公钥传输给联网的钱包。
网络钱包使用父公钥生成子公钥们,可以作为可选操作将其发布,监听这些公钥的输出,创建花费比特币的未签名交易,然后将未签名的交易传输给签名的钱包。
通常,用户有机会使用签名钱包对未签名交易的细节(特别是输出细节)做审核。
在可选的审核步骤之后,签名钱包使用父私钥生成相关的子私钥来对交易做签名,再将已签名的交易送回给联网钱包。
然后联网钱包将已签名交易广播至点对点网络。
离线钱包
一些完整服务的钱包也是按照两个分离的钱包程序来运行的:一个程序扮演只用于签名的钱包(通常被叫做“离线钱包”),另一个程序扮演网络钱包(通称被叫做“在线钱包”或“监听钱包”)。
离线钱包的得名因为它是运行在一台不联网的设备上,极大程度的抵御了攻击的媒介。按照这样的方式,通常需要用户通过可移除的媒介,比如 USB 驱动,来控制所有数据的传输。用户操作的流程大致是这样的:
- 1.(离线)在一台设备上禁用所有的网络并安装钱包软件。在离线模式下开启钱包软件,用来创建父私钥和公钥。复制父公钥到可移除的媒介。
- 2.(在线)在另一台设备安装钱包软件,这一台设备是联网的,然后从可移除的媒介导入父公钥。如同一个完整钱包一样,发布公钥来接收付款。当准备花费接收到的比特币时,通过钱包填写输出的细节然后生成未签名的交易,将其保存至可移除媒介。
- 3.(离线)在离线这端打开未签名的交易,审核交易的输出细节确保数目和地址都是正确的。这阻止了在线钱包中的恶意软件欺骗用户将交易信息发送给攻击者。审核过后,签名交易并将其保存至可移除媒介。
- 4.(在线)在在线钱包中打开交易,以便其在点对点网络中广播。
离线钱包的主要好处是它比完整一个钱包提供了安全性。因为离线钱包未被危害到(或破坏),用户在签名前都审核所有的交易信息,那么用户的比特币就是安全的,就算在线钱包已经被危害到。
离线钱包主要的弊端就是它很麻烦。为了最大的安全性,它需要用户为了离线的事务贡献一台电脑。为了花费比特币,离线设备必须开启,用户必须在离线设备与在线设备间手动的拷贝数据。
硬件钱包
硬件钱包是实用单独的硬件来运行的只用于签名的钱包。因为其只运行钱包使得它可以消除很多操作系统为了日常使用而设计时存在的潜在危害,这允许它可以安全直接的与其它设备进行沟通而不需要用户手动的传输数据。用户的流程大致如下:
- 1.(硬件钱包)创建父私钥及公钥。连接硬件钱包到联网设备使之可以获取到公钥。
- 2.(联网设备)如同一个完整的钱包一样,发布公钥来接收付款。当准备花费接收到的比特币时,填写交易的细节,连接硬件钱包,点击发送。在线钱包会自动的发送交易信息给硬件钱包。
- 3.(硬件钱包)在硬件钱包的屏幕上审核交易信息。一些硬件钱包会要求密码或者 PIN 码。硬件钱包签名交易并将其传输给在线钱包。
- 4.(联网设备)在线钱包接收到来自硬件钱包的已签名交易,并将其广播至网络。
硬件钱包的主要好处是它在保证了如同离线钱包的安全性同时还没有离线钱包那么麻烦。
硬件钱包的主要弊端还是其用起来会有些麻烦。即便它已经比离线钱包好很多,但是用户仍然要购买一个硬件设备,无论如何都要携带着它以便支付时使用。
另一个弊端(期望只是暂时的)就是只有非常少的钱包支持了硬件钱包,尽管大部分钱包程序生成至少会支持一种硬件钱包。
只用于发布的钱包
在类似 webserver 这种无法保证安全的环境中运行的钱包程序,可以被设计为只发布公钥(包括 P2PKH 或者 P2SH 地址),然后其他什么都不做。有两种常用的方式来设计这种极简的钱包:
image- 提前生成一个包含一定数目公钥或地址的数据库,然后使用数据库内的一条记录发布一个请求脚本或地址。为了避免重复使用密钥,webserver 应该持续跟踪已使用的密钥并确保不会使公钥用完。这会比第二种方式中使用父公钥的方式简单不少。
- 使用一个父公钥来创建子公钥。为了避免密钥的重复,需要一个方法来确保一个公钥不会被发布两次。这可以是数据库中每个已发布密钥的记录或者一个递增的数字来作为密钥的索引值。