BlockChain学习——比特币钱包

比特币钱包

比特币钱包只包含私钥而不是比特币。每一个用户有一个包含多个私钥的钱包。钱包中包含成对的私钥和公钥。用户用这些私钥来签名交易,从而证明它们拥有交易的输出(也就是其中的比特币)。比特币是以交易输出的形式来储存在区块链中(通常记为vout或txout)。

钱包是私钥的容器

非确定性(随机)钱包

在最早的一批比特币客户端中,钱包只是随机生成的私钥集合,这种类型的钱包被称作0型非确定钱包
举个例子,比特币核心客户端预先生成100个随机私钥,从最开始就生成足够多的私钥并且每把钥匙只使用一次。这种类型的钱包有一个昵称“Just a Bunch Of Keys(一堆私钥)”简称JBOK。这种钱包现在正在被确定性钱包替换,因为它们难以管理、备份以及导入。随机钥匙的缺点就是如果你生成很多,你必须保存它们所有的副本。这就意味着这个钱包必须被经常性地备份。每一把钥匙都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就付之东流。这种情况直接与避免地址重复使用的原则相冲突——每个比特币地址只能用一次交易。地址通过关联多重交易和对方的地址重复使用会减少隐私。0型非确定性钱包并不是钱包的好选择,尤其是当你不想重复使用地址而创造过多的私钥并且要保存它们。虽然比特币核心客户包含0型钱包,但比特币的核心开发者并不想鼓励大家使用。下图表示包含有松散结构的随机钥匙的集合的非确定性钱包。
BlockChain学习——比特币钱包

确定性(种子)钱包

确定性,或者“种子”钱包包含通过使用单项离散方程而可从公共的种子生成的私钥。种子是随机生成的数字。这个数字也含有比如索引号码或者可生成私钥的“链码”。在确定性钱包中,种子足够收回所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。并且种子也足够让钱包输入或者输出。这就很容易允许使用者的私钥在钱包之间轻松转移输入。

要介绍确定性钱包,就要介绍种子、助记词、私钥三者关系:
随机生成一个种子做示范:
【233232995d0e556517d11125ec3e7d1fff8eeae0c36fd9fd91e05832a71451a502e572aa3b118a21a312f9e8c777e2f66e6d83be002dd9ea5bbc9914d7be1d99】
根据这串种子可以衍生出一系列的私钥,例如
【KxV8YyTQ6Agkbtc83kGrEUuH54GxsdqtSKjV8wgP5tBzPPCbbCz7】【KxSoFoyzY1ZMqZUbg2KeCf2aHPGaSKNS2Zd9f3PPenh65sNEc917】【L3toyntWFZWqfpuZNr1tMYP8z1v8jGCsAfdikwkoQhsdE3WmFcYc】

只要掌握了种子,就掌握了这些私钥和这些私钥所控制的比特币,种子和私钥的关系就如同树种-树干-树枝的关系
掌握种子显然比掌握成百上千的私钥要方便的多,但显然128位的字符并不好记。于是比特币开发社区在BIP39提出了助记词方案。BIP39中所提出的解决方案是,随机生成数位的助记词,通过这些单词和单词的顺序就能得到种子
生成HD钱包及根据种子生成子私钥的步骤:

  1. 首先,生成一个助记词
  2. 该助记词使用PBKDF2转化为种子
  3. 种子用于使用HMAC-SHA512生成根私钥
  4. 通过根私钥生成子私钥

助记码词汇

助记码词汇是英文单词序列代表(编码)用作种子对应所确定性钱包的随机数。单词的序列足以重新创建种子,并且从种子那里重新创造钱包以及所有私钥。在首次创建钱包时,带有助记码的,运行确定性钱包的钱包的应用程序将会向使用者展示一个12至24个词的顺序。单词的顺序就是钱包的备份。它也可以被用来恢复以及重新创造应用程序相同或者兼容的钱包的钥匙。助记码代码可以让使用者复制钱包更容易一些,因为它们相比较随机数字顺序来说,可以很容易地被读出来并且正确抄写。

这种方式使用若干个助记词来替换之前直接生成随机数的方式,通过助记词推导出随机的Master Seed。每种语言包含了2048个词,就是从2048个词中随机生成出若干个助记词。从数学概率排列组合AnmA_{n}^{m}来说,两个人相同的概率是非常小的:假设在2048个词里选择12个助记词,其选择方式有A204812A_{2048}^{12}个,光是看2048!2048!,阶乘就是极大的,所以相同的概率可以忽略不计。


助记词生成规则
助记词生成规则如下:

  1. 生成一个128bit到256bit范围内的随机序列,这里称为(entropy,相当于之前说的high min-entropy)。
  2. 通过Hash算法(下图是SHA256)将进行Hash,然后取Hash值的前nn个bit作为校验和(checksum),其中n=length(entropy)/32n=length(entropy)/32
  3. 将校验和拼接在熵后面。
  4. 将拼接后的结果按每11个bit划分,每11bit的二进制转为十进制index在2048个词进行索引。
    BlockChain学习——比特币钱包

随机数种子生成规则
助记词生成随机种子如下图所示:

BlockChain学习——比特币钱包
通过助记词生成随机数种子后,可以从从单个“种子”中生成许多关键的钥匙。

分层确定性钱包(HD wallet)

确定性钱包被开发成更容易从单个“种子”中生成许多关键的钥匙。*的来自确定性钱包的形是通过BIP0032标准生成的 the hierarchical deterministic wallet or HD wallet defined。分层确定性钱包包含从数结构所生成的钥匙。这种母钥匙可以生成子钥匙的序列。这些子钥匙又可以衍生出孙钥匙,以此无穷类推。这个树结构表如下图所示。
BlockChain学习——比特币钱包

HD钱包从单个root seed中创建,为128到256位的随机数。HD钱包的所有的确定性都衍生自这个根种子。任何兼容HD钱包的根种子也可重新创造整个HD钱包。所以简单的转移HD钱包的根种子就让HD钱包中所包含的成千上百万的**被复制,储存导出以及导入。根种子一般总是被表示为a mnemonic word sequence,助记码词汇可以让人们更容易地抄写和储存。

HD钱包提供了随机(不确定性)钥匙有两个主要的优势。第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子**被用来接收交易收入并且有另一个分支的子**用来负责支付花费。不同分支的**都可以被用在企业环境中,这就可以支配不同的分支部门,子公司,具体功能以及会计类别。

HD钱包的第二个好处就是它可以允许让使用者去建立一个公共**的序列而不需要访问相对应的私钥,其做法如下图所示。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,但是在服务器中不具有可用来支付的私钥。

比特币使用的电子签 名算法ECDSA支持分层**。即冷储存端生成任意多个**,热储存端生成相应的地址:
BlockChain学习——比特币钱包
冷储存端生成和保存私钥生成信息和地址生成信息,然后将地址生成信息一次性转给热储存端。当 热储存端要给冷储存端转账时,就按次序生成新的地址。冷储存端上线后,也会按顺序生成地址,然后查收相应地址收到的款项,直到某一地址没有收款位置。如果冷储存端需要向热储存端转账,它就会按顺序生成私钥序列。