区块链编程——比特币钱包详解

写在前面

最近正在看区块链和6G方面一些相关的东西,接下来一段时间,应该会分享一系列6G和区块链方面的东西,一方面是记录自己的学习过程,另一方面也想分享出来,大家一起讨论。

比特币钱包

  • 从广义上来讲,钱包是一个应用程序,为用户提供交互界面。钱包控制用户访问权限,管理私钥和比特币地址,跟踪余额以及创建和签名交易
  • 从狭义上讲,钱包是指用于存储和管理用户私钥的一个数据结构

关于比特币钱包的一个理解

比特币钱包不像我们平常使用的实体的钱包一样,我们实体的钱包里面装的是钱,但是比特币钱包里面装的不是比特币,而是密钥。而比特币被记录在比特币网络的区块链中,用户通过使用钱包中的秘钥签署交易来控制网络上的比特币。从某种意义上说,比特币钱包是一个钥匙扣。而钱被锁在成为区块链的箱子里,我们通过使用自己的钥匙能管理被所在箱子里的钱。

比特币钱包只包含私钥,不包含比特币。上面说的是密钥。这里说的是私钥,那公钥包含不包含呢。看接下来的解释应该可以明白。

用户是使用私钥来对交易进行签名。这里的签名指的是数字签名,就是通过非对称加密算法,使用自己的私钥对交易信息进行加密。然后公钥是公开的。其他用户可以通过公开的公钥来对加密的交易信息进行解密。从而证明该用户确实用户交易转账的所有权。然后,比特币以交易记录的形式存储在区块链当中。

钱包的分类

  • 非确定性钱包:每个密钥都是从随机数独立生成的,密钥彼此之间无关联。这就是简单的一堆私钥的集合(Just a bunch of keys)简称JBOK钱包。
  • 确定性钱包:其中所有的私钥都是从一个主私钥派生出来的,这个主私钥即为种子seed。所以钱包中的所有私钥都是相互关联的,如果有原始的种子,则可以再次派生出全部的私钥。
确定性钱包有许多不同的密钥派生方法,最常用的派生方法是使用树状结构,成为分层确定性钱包或者HD钱包。然后,为了便于使用,种子会被编码为英文单词,称为助记词。这里注意种子和助记词之间的关系,是种子被编码为助记词!!!

非确定性钱包的特点

  • 非确定钱包因为难以管理,备份以及导入
  • 随机密钥的缺点就是如果你生成很多私钥,那么你必须保存所有私钥的副本,这意味着这个钱包必须经常地备份
  • 每个密钥都必须备份,否则如果钱包变得无法访问,则其控制的资金将不可避免地丢失
  • 如果为了减少备份而复用地址,这种情况直接与避免地址重复的原则相冲突——每个比特币地址只用于一次交易
  • 地址重复使用会将多个交易与此地址关联在一起,这样会减少隐私

区块链编程——比特币钱包详解_第1张图片

确定性(种子)钱包的特点

  • 私钥通过种子利用单向散列函数,也就是hash函数从公共种子派生出来
  • 种子是一串随机生成的数字,这串数字结合索引编号和“链码”可派生出其他私钥
  • 在确定性钱包中,种子可以恢复所有派生的私钥,因此创建一个简单的种子备份也就足够了
  • 种子也可以用于钱包的导入/导出,在不同的钱包之间轻松转移所有私钥

区块链编程——比特币钱包详解_第2张图片

分层确定性钱包

确定性钱包目前最高级的版本是通过BIP-32标准定义的HD钱包,HD钱包的私钥是以树状结构派生的,父私钥可以派生出一系列子私钥,每个子私钥又可以派生出一系列孙私钥。

它有两大优点:

  • 树状结构可以用来表达额外的组织含义
  • 它可以让用户去创建一系列公钥而无须知晓相对应的私钥,这样HD钱包可在安全性不高的服务器中使用或作为收款专用,为每笔交易提供不同的公钥。公钥不需要被预先加载或者派生,同时在服务器上也没有可用于支付的私钥

区块链编程——比特币钱包详解_第3张图片

种子和助记词

将16进制表示的种子编码成一组标准化的英文单词,这样更方便抄录,也可在不同钱包之间转移,导出和导入,会更方便。这些英文单词称为助记词。

区块链编程——比特币钱包详解_第4张图片

比特币钱包的最佳实践

区块链编程——比特币钱包详解_第5张图片

助记词编码标准(BIP-39)

助记词编码是表示确定性钱包的随机数种子的英语单词序列。助记词足以创建种子,并从种子那里重新创建钱包和所有派生的私钥。由助记词编码实现的的确定性钱包应用程序会在首次创建钱包时向用户显示12~24个单词。该序列的单词就是钱包的备份,可用于在相同或任何兼容的钱包应用中恢复和重新创建所有私钥。与随机数子序列相比,助记词使用户备份钱包更加容易,因为他们易于阅读和正确转录。

注:助记词与脑钱包是不同的。二者的主要区别在于脑钱包由用户选择的单词组成,而助记词是由钱包随机创建并展示给用户的。

种子和助记词的创建

区块链编程——比特币钱包详解_第6张图片
区块链编程——比特币钱包详解_第7张图片
区块链编程——比特币钱包详解_第8张图片

  • (7)PBKDF2密钥延伸函数的第一个参数是从步骤6生成的助记词
  • (8)PBKDF2密钥延伸函数的第二个参数是盐,由固定的字符串“mnemonic”与可选的用户输入的密码字符串连接组成。
  • (9)PBKDF2将助记词和盐作为参数,调用2048次HMAC-SHA512散列算法,生成一个512位的值作为其延伸的最终输出,这个512位的值就是种子
补充说明:PBKDF2是密钥延伸函数。

区块链编程——比特币钱包详解_第9张图片

区块链编程——比特币钱包详解_第10张图片

从种子中创造HD钱包

HD钱包从单个128位,256位,或512位的随机数根种子中创建。

区块链编程——比特币钱包详解_第11张图片

私有子密钥的派生

区块链编程——比特币钱包详解_第12张图片
上面所提到的子密钥派生函数,即密钥派生函数,是基于单向散列函数的!!!

链码是用来给这个确定性过程引入随机数据的,以便知道索引编号和子私钥也不足以派生出其他子私钥。因此,有了子密钥并不能让它派生出自己的兄弟姐妹私钥,除非再获得链码。初始链码种子(在书的根部)是用根种子生成的,而后续的链码从各自的父链码中派生出来。

扩展密钥

正如我们之前所看到的,只需要三个输入量:一个私钥,一个链码以及想要的子私钥的索引号,私钥派生函数就可以创建私钥树上任意任何层级的子私钥。将私钥以及链码这两个重要的部分组合在一起,称为扩展密钥

扩展密钥可以简单的表示为将256位私钥与256位链码串联成512位序列并存储。实际上有两种类型的扩展密钥:

  • 私钥以及链码组成扩展私钥,它可用来派生子私钥
  • 公钥以及链码组成扩展公钥,它可用来派生子公钥

将扩展密钥视为HD钱包中私钥树结构的一个分支的根。利用分支的根可以派生出这个分支的剩余部分。扩展私钥可以创建一个完整的分支,而扩展公钥只能够创建一个包含公钥的分支。

子公钥派生

区块链编程——比特币钱包详解_第13张图片
区块链编程——比特币钱包详解_第14张图片

子私钥的强派生

区块链编程——比特币钱包详解_第15张图片
区块链编程——比特币钱包详解_第16张图片

你可能感兴趣的:(区块链,信息安全,区块链,比特币,加密)