区块链原理、架构与应用
上QQ阅读APP看书,第一时间看更新

3.2 创建比特币账户

对于比特币的交易用户,客户端会自动为用户生成钱包,类似于在银行开户,用户也需要一个如同银行卡密码的账户密码来保护自己的数字资产。专属密钥就成为使用钱包中比特币的必要条件。而用户的密钥不同于银行卡密码短小精悍方便记忆,密钥对一般是经过特殊处理的长串随机数列,很难记忆,为了保证其安全性和隐匿性,一般将密钥存储在数字钱包中。

3.2.1 密钥对:私钥和公钥

比特币作为一种数字资产,并不存在实体,网络通过密钥、比特币地址和数字签名来确认比特币的所有权。用户通过客户端或钱包自动生成密钥文件,存储在本地,密钥为自己独有,不需要进行区块链的网络连接;用户在交易环节,公钥通过其数字指纹表示为比特币地址,同时比特币地址也存在脚本类型等其他表现形式,但公钥最为常见;数字签名证明了交易的有效性,交易只有携带有效的数字签名才能存储在区块链中。

密钥对是比特币地址和数字签名的基础。一个比特币钱包可以包含一系列的密钥对,一个密钥对包含一个私钥和一个公钥。私钥为系统生成的随机数,用于产生支付时的数字签名。公钥是私钥通过椭圆曲线乘法产生的,用于产生地址接收比特币,如图3-13所示。公钥是公开的,不会影响用户钱包的安全性,但是用户必须对私钥进行保密储存,同时注意对私钥文件的多重备份。在生活大爆炸中,伦纳德、霍华德和拉杰什就因为谢尔顿弄丢了私钥的备份文件,失去了一夜暴富的机会。因为私钥一旦丢失就难以复原,所有的比特币也将一同消失。

图3-13 私钥、公钥和比特币地址关系图

私钥通过椭圆曲线乘法生成公钥,这个过程是单向不可逆的,公钥无法反推出私钥。椭圆曲线乘法的原理已在第2章进行了阐述:在椭圆曲线上,以一个随机产生的私钥k为起点,将其与曲线上已经规定的一点G相乘,即可获得公钥。G点为标准规定的一部分,所有比特币的生成点都是相同的。

图3-14 公钥压缩类型

按照定义,根据椭圆曲线乘法生成的公钥实际上为一个点(xy)的坐标。因为区块中的交易数据包含了公钥字段,为了优化数据结构、压缩硬盘储存的区块链数据,同时根据椭圆曲线算法公式利用x值能够推导出y值,因此引进了压缩公钥。根据选用的公钥是(xy)坐标值还是x值,将公钥划分为非压缩格式和压缩格式两种类型。非压缩格式代表公钥选用了坐标(xy)表示,通常此种情况下的公钥前缀为04;压缩格式为公钥只选用x值,而舍弃了坐标中的y值。根据x值的奇偶性不同,前缀可分为02或03,如图3-14所示。

私钥是用户在比特币网络的通行证,它是由客户端随机生成的一个256bit的二进制码,也就是32字节,在不同的使用场景中采用不同的编码方式可推导出不同格式的私钥。表3-1列出了各种类型的私钥格式。

表3-1 私钥的格式

32字节的字符串是原生(Raw)形式,其十六进制(Hex)形式多在编码中使用,普通用户不会接触到。为了方便复制私钥并减少出错,在钱包之间导入/导出私钥时一般使用WIF(wallet import format)格式。在WIF格式的私钥后增加后缀01,表明该私钥只能用于生成压缩格式的公钥,将该形式的私钥称为压缩格式私钥(WIF-compressed),对应的有时也会将WIF格式的私钥称为非压缩格式的私钥。同一个256bit的随机数对应的不同格式的私钥如表3-2所示。

表3-2 不同格式私钥举例

需要留意的是,压缩格式的私钥并没有压缩,反而比WIF非压缩格式多出1字节。一般所说的压缩格式的私钥只能用于生成压缩格式的公钥,其本身并不是压缩格式。同时,非压缩格式的私钥只能用于生成非压缩格式的公钥,具体转换关系如图3-15所示。

图3-15 压缩、非压缩格式私钥和公钥的对应关系

WIF格式的私钥产生过程如图3-16所示。

图3-16 WIF格式私钥产生过程示意图

(1)系统产生256bit的随机数,用十六进制表示,例如产生一个随机数:

0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D。

(2)对随机数添加网络标示,前缀0x80表示mainnet网络,前缀0xef表示testnet网络,例如对上一步产生的随机数添加网络标示0x80之后生成800C28FCA386C7A227600B 2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D。

(3)如果需要产生压缩公钥,那么需要使用压缩私钥,在字符串末尾增加后缀01;若使用非压缩公钥,则不追加。例如使用非压缩公钥,字符串保持不变,依然是800C28FCA386 C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D。

(4)对步骤3产生的字符串执行SHA-256算法,生成8147786C4D15106333BF278D7 1DADAF1079EF2D2440A4DDE37D747DED5403592。

(5)对步骤4产生的字符串再次执行SHA-256算法,生成507A5B8DFED0FC6FE880 1743720CEDEC06AA5C6FCA72B07C49964492FB98A714。

(6)取步骤5产生的字符串的前4字节作为校验和,添加至步骤3产生的字符串末尾,生成800C28FCA386C7A227600B2FE50B7CAE1 1EC86D3BF1FBE471BE89827E1 9D72 AA1D507A5B8D。

(7)执行Base58Check编码算法,得到WIF格式私钥为5 HueCGU8rMjxEXxiPuD5B Dku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ。

3.2.2 比特币地址

图3-17 公钥产生比特币地址的示意图

人们可以根据E-mail地址互相发送邮件,通过E-mail地址对应的密码可以读取邮件内容。类似E-mail系统,比特币网络中的交易实际就是根据比特币地址发送比特币,拥有某个比特币地址的私钥就可以获得这个比特币地址中的比特币。

比特币地址是由数字和字母组成的字符串,公钥通过一系列哈希算法和编码算法生成比特币地址,可以简单地将比特币地址理解为公钥的一种摘要表示。因为公钥产生地址利用了单向哈希算法,不具备可逆性,所以地址不能反推出公钥。比特币地址并不是固定且唯一的,用户的一个钱包就可以包含多个比特币地址,钱包能够针对不同的交易产生不同的地址,从而保证账户的安全性。

公钥通过SHA-256和RIPEMD160的双哈希算法生成160bit(20字节)的公钥哈希。为了提高地址的可读性和鲁棒性,公钥哈希还会经过Base58Check编码生成最终的比特币地址。Base58Check编码算法利用了Base58数字系统中的58个字符和校验码,能够有效防止地址在具体使用过程中产生的错误,具体过程如图3-17所示。

3.2.3 数字钱包

私钥作为随机产生毫无规律的随机数,如果仅凭用户大脑记忆很容易产生私钥错误或遗忘。因此在具体使用过程中,钱包不仅生成密钥对和地址,还能帮助用户存储它们,一个钱包中可以存储多个私钥。但是钱包客户端可能也会出现数据丢失或其他遗失私钥的可能。因此,如何安全方便地生成、保存和备份密钥是判断钱包性能好坏的关键因素。

为了完善这些因素,数字钱包不断发展,经历了大致三个阶段:非确定性(随机)钱包、确定性(种子)钱包和分层确定性钱包。

非确定性钱包,也称为随机钱包,如图3-18(a)所示。钱包只是随机生成的私钥们的储存容器,私钥之间没有任何联系。相互独立的私钥拥有更好的匿名性,如果一个私钥丢失或者被盗,非确定性钱包能够将损失风险降到最低,账户的安全性得到保障。大量随机私钥意味着,一旦出现新的私钥,用户就需要重新将所有私钥文件再备份一遍,每次备份后都要再次导入,工作重复且烦琐,用户使用体验并不良好。

为了方便用户操作,解决经常性备份的问题,出现了确定性(种子)钱包。在种子钱包中,所有私钥都是通过一个公共的种子文件生成的,种子能够回收所有已经产生的私钥,用户只需要备份种子,就能够完成对所有私钥的备份。如果想要更换钱包,只需要将种子文件导入即可,如图3-18(b)所示。

在BIP0032/BIP0044协议中,又对确定性钱包做了进一步的升级,即分层确定性钱包,如图3-18(c)所示。对比确定性钱包,共同之处是,两者的所有私钥都是通过一个公共种子文件生成的,但不同于确定性钱包中所有私钥的并行关系,分层确定性钱包中私钥的衍生结构是树状结构。父密钥可以衍生一系列子密钥(例如:私钥1、私钥2、私钥3),每个子密钥又可以衍生一系列孙密钥(例如:私钥2-1、私钥2-2、私钥2-3),以此类推。根据其树状结构,分层确定性钱包的应用场景和安全性得到了进一步的扩展和提升。树状结构可以表示额外的组织架构的含义,因此,比如在企业环境中,不同职能部门可以被分配使用不同分支的密钥,也可以一个特定的分支子密钥用来接收收入而另一个分支的密钥用来支付花费。另外,如果想要在不安全的环境下进行交易,分层确定性钱包保证了在每笔不同的交易中能够发行不同的公钥,而不需要访问相对应的私钥,保证了账户的安全性。

图3-18 三种数字钱包示意图