比特币钱包:核心钱包与轻钱包

钱包,是属于比特币系统中的一个前端工具,其最基本的功能就是用来管理用户的比特币地址、发起转账交易、查看交易记录等,在这方面与我们生活中使用的钱包是类似的。一开始的比特币钱包是跟比特币核心客户端一起发布的,1.4.2节介绍比特币核心客户端的时候已经初步做了了解,这个钱包是比特币核心钱包,其使用过程必须要配合完整的区块链数据副本,因此一般也只适合在桌面端使用。

我们在使用比特币钱包的时候,经常会遇到一个名词:比特币地址。通过钱包转账就是将比特币从一个地址转移到另外一个地址,暂且不论这个转移的过程是什么样的,那这个地址到底是什么意思,它又是通过什么来产生的呢?我们先来看一组名词关键字:私钥、公钥和钱包地址。

私钥与公钥来自公开密钥算法的概念,我们常说比特币是一种加密数字货币,之所以这么说,是因为比特币的系统设计中巧妙地使用了现代加密算法,而其中一个运用就是生成比特币地址,比特币地址的生成与公开密钥算法密切相关。什么叫公开密钥算法呢?传统的加密算法,其加密和解密方法是对称的,比如凯撒密码,通过将字母移位来加密,比如字母a替换成c,b替换成d,d替换成f这样,本来是abc的单词就变成了cdf,然而这种加密算法一旦泄露,别人也就知道了解密算法,换句话说,只有一个密钥。针对这种问题,公开密钥算法就应运而生,而公开密钥算法属于一种不对称加密算法,拥有两个密钥:一个是私钥,一个是公钥。公钥可以公开给别人看到,私钥必须要妥善保存,使用私钥加密(通常习惯上将私钥加密称为“私钥签名”)的数据可以用公钥解密,而使用公钥加密的数据可以用私钥解密,两者是互相匹配的。目前使用比较广泛的公开密钥算法主要有RSA算法和椭圆曲线加密算法(ECC),RSA是利用了素数分解难度的原理,ECC是利用了椭圆曲线离散对数的计算难度,比特币中使用的是椭圆曲线加密算法。

这便是比特币地址的生成过程,过程大致是这样的。

1)首先使用随机数发生器生成一个私钥,私钥在比特币中的作用非常重要,可以用来证明用户的身份,也可以签发交易事务。

2)私钥经过SECP256K1算法处理生成了公钥,SECP256K1是一种特定的椭圆曲线算法,需要注意的是,通过算法可以从私钥生成公钥,但是却无法反向从公钥生成私钥,这也是公钥为什么可以公开的原因。

3)公钥接下来先使用SHA256哈希算法计算,再使用RIPEMD160哈希算法计算,计算出公钥哈希。比特币的代码通过2次哈希来计算地址值,这样能进一步确保哈希后的数值唯一性,进一步降低不同数据进行哈希后相同的概率。与SHA256一样,RIPEMD160也是一种哈希算法。

4)将一个地址版本号连接到公钥哈希(比特币主网版本号为0x00),然后对其进行两次SHA256运算,将计算得到的结果取前面4字节作为公钥哈希的校验值。

5)将0x00版本号与公钥哈希以及校验值连接起来,然后进行BASE58编码转换,最终得到了比特币地址。

以上便是比特币地址的生成过程了,我们可以发现比特币的地址其实就是通过公钥转化而来的,将上图简化一下,就是下面这么一个过程:

 

所以,在比特币系统中,本质上并没有一个叫作“地址”的东西,因为“地址”是可以通过公钥转化而来的,可以理解为公钥的另外一种形式,而公钥又是可以通过私钥计算出来的,因此在比特币钱包中,真正需要妥善保存的是生成的私钥数据,这玩意可千万不能弄丢了,一旦丢失,那可比忘记银行卡密码还麻烦。比特币钱包的主要功能就是保管私钥。

比特币的核心钱包是跟核心客户端在一起的,可以完成创建钱包地址、收发比特币、加密钱包、备份钱包等功能,由于核心钱包是与核心客户端在一起使用的,因此在进行转账交易时,可以进行完整的交易验证,当然付出的代价就是必须得带上那么大量的账本数据,到2017年8月份这份数据已经超过了130GB,而且还在持续不断地增长中,因此并不方便用户的实际使用,实际上除了这一点不方便外,在私钥管理上也有麻烦的地方,通过官方的核心钱包可以无限制地创建自己所需数量的钱包地址,然而这些地址对应的私钥管理也就成了问题,如果不小心损坏了某一个私钥数据,那就找不回来了,基于这些问题,发展出了新的解决方案。

很多时候,我们在进行支付的时候,只是想通过一个支付验证,知道支付已经成功发起就可以了。对于完整的交易验证(需要在完整的账本数据上校验,比如是否包含足够的余额,是否双花等)可以交给核心节点,这样就可以将钱包功能部分剥离出来,由此产生了SPV钱包,事实上这个概念在比特币白皮书中就介绍过了,我们来看下它的原理是什么,SPV钱包的大致过程如下所示。

1)首先下载完整的区块头数据,注意是区块头,而不是所有的区块链数据,这样可以大大减少需要获取的账本数据量,区块头中包含有区块的梅克尔根,SPV方式主要就是靠它来实现的。

2)如果想要验证某笔支付交易,则计算出这笔交易事务的哈希值txHash。

3)找到txHash所在的区块,验证一下所在区块的区块头是否包含在账本数据中。

4)获得所在区块中计算梅克尔根所需要的哈希值。

5)计算出梅克尔根。

6)若计算结果与所在区块的梅克尔根相等,则支付交易是存在的。

7)根据该区块所处的高度位置,还可以确定该交易得到了多少个确认。

我们看到了,SPV原理的钱包就是使用了梅克尔树来验证支付是否已经发生,这也是为什么称之为简单支付验证的原因,不过我们也可以发现,支付验证所做的事情很少,仅仅能看到当前的支付交易是否被发起而已,并不能保证这笔交易事务最终会进入到主链中,也就是说还需要等待核心节点进行全面的交易验证并且矿工打包到区块后进入主链。在这个过程中是有可能发生失败的,所以SPV钱包虽然带来了便捷性但也牺牲了安全性。时至今日,已经出现了各种各样的比特币钱包,在bitcoin.org网站上我们可以一见端倪:

 

我们可以看到有各种类型的钱包可以使用,大家在选用自己的钱包时,务必了解清楚钱包的功能和来源,以免遭受损失。

接下来我们再来介绍一种管理多个私钥的钱包技术,即分层确定性钱包(Hierarchical Deterministic Wallets,有时也简称为HD Wallets),这个在比特币开发的BIP32[1]中有专门的建议论述。简单地说,分层确定性钱包具有如下的特点。

1)用一个随机数来生成根私钥,这与任何一个比特币钱包生成私钥没有区别;

2)用一个确定的、不可逆的算法,基于根私钥生成任意数量的子私钥。

比如比特币中使用的SHA256就是一个确定不可逆的算法,可以很容易使用SHA256设计出一个HD模型:SHA256(seed+n),这个就算是类型1确定性钱包了。实际上,分层确定性钱包是确定性钱包的一种,目前分层确定性钱包有Type1、Type2,还有BIP32规范几种类型,这些都是为了实现同一目的而制定的不同实现方法,基本原理都是类似的。

所谓的分层,除了私钥由主私钥来生成逐层的私钥以外,公钥也一样,通过主公钥生成所有的子公钥。实际上,生成的密钥本身,都可以作为根来继续生成子密钥,这就是所谓的分层了。注意,这里通过公钥生成子公钥,不需要私钥的参与,无论是主私钥还是子私钥都不需要参与。我们来看下示意图,如下:

这个特性是非常有用的,在一定程度上,隔离了私钥和公钥,可以带来不少的便捷性,具体如下。

1)备份只需要备份主私钥就行了,新增地址无须再次备份私钥。

2)可以保证主私钥的冷存储,无论增加多少个地址,只需要主公钥就可以了。

3)方便审计,只需要提供主公钥或者某个分支的子公钥,就可以查看下级的数据而又保证不能被交易。

4)有了这棵树,还可以配合权限,设定不同层级的权限,能查看余额还是能交易等。当然啦,便捷性往往都是要牺牲安全性的,缺点很明显,这种钱包,由于私钥之间是具有固定关系的,不那么随机了,因此只要暴露任何一个私钥,再加上主公钥做关联分析,就很有可能使整个树状密钥结构都泄露。

posted @ 2018-04-09 10:14  大雨天空  阅读(723)  评论(0编辑  收藏  举报