上一次我们介绍了区块链的背景,区块链、以太坊、智能合约到底是什么,但我们并不止步于此,为了实现最终的目标:“完成区块链钱包的设计并顺利毕业”,我们还要来了解一下有关钱包的相关理论。
什么是区块链钱包
钱包其实就是一个用来管理私钥的工具,用来存储数字资产。我再直白一点,大家都知道现在的比特币单价很高,近20w一个,假设说,你拥有20个比特币,那么20个比特币应该存储在哪里呢?如果你想买一个新手机,该怎么用比特币进行交易转账呢?其实也很简单,想在银行里存钱,那就需要先去开个户,数字货币也一样,想在钱包里存钱,那就先去开个户吧。在市面上的钱包里,都支持创建一个新账户的操作,这样,我们就可以先拥有一个账户了,跟这个账户一同创建的,还有一个私钥和账户地址,私钥相当于账户的密码,地址相当于银行卡号。
总结一下,数字钱包用来存储数字资产,在区块链中,我们的数字资产都会对应到一个账户地址上, 只有拥有账户私钥才可以对资产进行消费,即用私钥对消费交易进行签名。私钥、公钥与地址之间的关系如下:
私钥单向生产公钥,公钥单向生产地址,均不能反向推导,也就是说,如果你丢失了私钥,那么账户里的一切,你都丢失了,包括数字加密资产!
区块链钱包分类
我先pou一张图,这张图并没有完全包含所有钱包的种类,大家看到其他的可以继续补充哈
目前的钱包若按照私钥存储方式,可分为中心化钱包和去中心化钱包。中心化钱包又称托管钱包,是指用户对第三方服务器高度信任,不必自己保存私钥,私钥由第三方服务器进行保管,优势在于用户使用简洁,不必保存钱包信息,不必担心忘记私钥或者助记词,但劣势也正因此产生——第三方可携款潜逃,服务器也会因为携有大量数字资产而成为被攻击的对象,从而造成单点失效问题。相对于中心化钱包,在去中心化钱包中,账号秘钥的管理,交易的签名,都是在客户端完成,即私钥相关的信息都是在用户手中,钱包的开发者接触不到私钥信息。
按照钱包是否联网可分为冷钱包(也称为离线钱包)和热钱包。冷钱包是指不联网使用的钱包,根据实现方式的不同,又可分为硬件钱包、纸钱包和脑钱包等。硬件钱包用来生成和保存密钥,设备本身不会泄密,但使用流程繁琐且价格昂贵。纸钱包是指用户将钱包信息记到纸上,然后将其锁在保险柜中,而脑钱包则更为直接,用户直接背下钱包的信息即可。虽然冷钱包相对于热钱包更安全,但是冷钱包也不是绝对安全,可能会遇到硬件损坏,钱包丢失等情况,便携性也较差,成本较高。为解决硬件钱包便携性问题,Bamert等提出 BlueWallet,通过使用蓝牙与创建无签名交易的实体进行通信,构建一个具有低功耗的设备。热钱包相对于冷钱包使用起来更方便,既可在PC上使用,也可在手机等移动终端使用,还可对钱包内资产随时进行操作,因此目前83.87%的钱包都为热钱包模式。
第三种分类是全节点全包和轻节点钱包,意思就是区块链中的区块,是一整个区块前部保存还是保存部分。Bitcoin Core钱包是比特币的官方钱包,实现的就是全节点的比特币客户端,组成了整个比特币网络的支架。拥有极高的安全性、隐私性、稳定性,但数据量过大,速度慢。为解决上述问题,轻节点SPV 钱包将钱包的部分功能剥离出来,只是一个支付验证,而对于完整的交易验证由核心节点完成,钱包在不下载区块链的情况下验证交易是否是区块的一部分,具有较快的速度。
BIP32
我们上面介绍的是,每创建一个账户都要有一个密码私钥,如果我们想拥有大于1个的钱包,就要拥有大于1个的密钥,每一个密钥都要好好的保存记录下来(我们在现实生活中还不能随意的保存备份,对私钥的安全性存储是有一定要求的,我们以后再讲),这样真的太麻烦了,万一有一个密码被我们忘记了,里面的资产也随风离去了。因此,出现了BIP32协议,它的核心就是,只备份一个种子(是一串数字),可以推导出来所有的密钥,也就是只需要记住一个种子,我们不必再记住所有的密码了。
——————下面是原理,不需要很深入的同学,直接到BIP39——————
这一部分就有点专业了,但也不是很难,让我们仔细来瞧瞧BIP32密钥的生成过程吧
首先,我们需要一个根种子,这就是我们需要记录下来的种子,一般是个随机数,128位,256位,512位的都有(随机数能不能做到真正的随机也很关键,安全性高的硬件钱包可以通过一些硬件设备产生某时刻的物理世界反映到二进制世界的随机数,当然,硬件钱包的价格也比较高),有了随机数种子之后,经过HMAC-SHA512算法,可以得到主私钥(m)和主链编码,主私钥再通过椭圆曲线生成主公钥。而这一步生成的秘钥(私钥或公钥)、主链编码再加上一个索引号,将作为HMAC-SHA512算法的再次输入,将继续衍生出下一层的私钥及链编码,上图!
现在,大家可以增加索引,水平的扩展,就像上一张图的子密钥1,子密钥2,子密钥3……一直到子密钥n,水平的增加,也可以向下一层深度的扩展,就像是子密钥1,孙密钥1,重孙密钥1……等等,我们理论上可以获得无限的私钥,创建无限个账户。需要说明的是,以上的推导过程是单向的,相同的输入总是有相同的输出,子密钥不能推导出同层级的兄弟密钥,也不能推出父密钥。如果没有子链编码也不能推导出孙密钥。
BIP39
BIP32让我们只需保存一个32字节的随机数种子(通常16进制数表示)即等价保存一堆密钥,这样做确实方便一些,但种子没有规律,不方便用户使用.想一想,要你背下来一串没有规律的数字,太痛苦了!!!为了方便我们记忆种子,BIP39横空出世,它是使用助记词的方式生成种子的,这样用户只需要记住12(或24)个单词以及单词的序列,就可以恢复种子,然后再根据BIP32协议创建钱包即可。
——————下面是原理,不需要很深入的同学,直接到BIP44——————
使用助记词作为种子其实包含2个部分:助记词生成以及助记词推导出随机种子,下面分析下这个过程。
首先介绍助记词生成过程。生成一个128位随机数,再加上对随机数做的校验4位,得到132位的一个数,然后按每11位做切分,这样就有了12份11比特的二进制数,然后用每一份二进制查BIP39定义的单词表,这样就得到12个助记词。
其次介绍助记词推导出种子的过程。这个过程使用密钥拉伸(Key stretching)函数,用来增强弱密钥的安全性,PBKDF2是常用的密钥拉伸算法中的一种。PBKDF2基本原理是通过一个为随机函数(例如HMAC函数),把助记词明文和盐值作为输入参数,盐可以提高暴力破解的难度,重复进行2048次运算最终产生生成一个更长的(512 位)密钥种子,再通过这个512位的种子根据BIP32的介绍,构建钱包并派生出它的密钥。
推导种子的过程由常量字符串“mnemonic”(助记词)及一个可选的密码(盐值)组成,使用不同的密码或者拉伸函数,在使用同一个助记词的情况下会产生不同的种子。密码可以作为一个额外的安全因子来保护种子,即使助记词的备份被窃取,也可以保证钱包的安全,不过另外一方面,如果我们忘记密码,那么将无法恢复我们的数字资产。
BIP44
BIP44呢,是一种路径表示的方法,在BIP32中,我们已经可以生成很多个密钥,而BIP44的路径,可以清楚的表示密钥在结构中的位置。个人感觉不是很重要
BIP44从主私钥开始衍生,路径的首个字符以m为首,从主公钥开始衍生则以M为首。BIP44对路径约定了一个规范的含义,定义了5个层级结构:
第一层是purpose层。该层主要是用来声明钱包使用的是BIP44规范,该层的值通常被定义为44。
第二层是coin type层。该层表示币种,0代表比特币,1代表比特币测试链,2表示莱特币,60代表以太坊。
第三层是account层。该层主要是用来设置账户索引,从0开始。
第四层是change层。该层的值主要为0或1,常量0用于外部(收款地址),常量1用于内部(找零地址)。外部用于钱包外可见的地址,例如,用于接收付款。内部地址钱包外部不可见的地址,用于返回交易变更。从这一层级开始,基本用的是普通衍生,从而输出扩展公钥。
第五层是address_index层。该层代表了地址索引,从0开始,代表生成第几个地址,官方建议,每个account下的address_index不要超过20。