# Web3学习笔记001：重新认识钱包

By [nobodyjack.eth](https://paragraph.com/@nobodyjack-eth) · 2022-08-03

---

**撰文：nobodyjack （**[**Twitter: @**ethcrap](https://twitter.com/ethcrap)**）**

你真的了解数字钱包吗？
-----------

如果你是加密货币的持有者，相信你对数字钱包应该不陌生吧。目前市面上的钱包应用非常多，有支持单链的、支持多链的，有手机 APP、有网页、有桌面客户端，还有浏览器插件如 MetaMask。但你真的了解数字钱包吗？

什么是HD钱包，为什么绝大多数钱包应用都自称是HD 钱包？助记词与私钥是什么关系？为什么可以只使用一组助记词可以控制多个账户？为什么可以只使用一组助记词可以控制多条链上的资产？BIP32、BIP44、BIP39这些又是什么鬼？

如果你想知道这些问题的答案，来看看这篇文章吧。

什么是密钥和地址？
---------

在了解数字钱包之前，我们首先需要理解密钥（私钥、公钥）、地址及它们之间的关系。

### 1）公匙 = 银行账户， 地址 = 银行卡号， 私钥 = 账户密码

我们可以把「链」想象成银行，那么「公钥」就像你的银行账户，「地址」就像你的银行卡号，「私钥」就像你的“银行卡号+账户密码”。公钥/地址用于识别身份，私钥用于控制账户。

用以太坊钱包为例，创建一个以太坊钱包后，会生成一个以“0x”开头的字符串，这个字符串就是钱包「地址」。

钱包的「地址」是由「公钥」通过计算得来，就像银行先给你开户，后给你银行卡卡号。

钱包「地址」的主要用途是收款，当然也可以作为转账的凭证，就像别人打钱给你时你需要告诉人家银行卡卡号一样。

「私钥」就相当于是“银行卡号+账户密码”，非常重要，一定要妥善保存。

### 2）私钥 —> 公钥 —> 地址

![](https://storage.googleapis.com/papyrus_images/149123d1f1c8f258aafbf35d6f59dcb675ab43ea21b783cf9524ac48f3c3a31f.png)

*   k，私钥，通常是随机产生，需要绝对保密的
    
*   K，公钥，由私钥通过椭圆曲线乘法运算而来，不可倒推出私钥，可以不保密
    
*   A，地址，由公钥通过单向哈希运算而来，不可倒推出公钥，是完全公开的
    

钱包中没有代币
-------

一种常见的误解认为钱包中保存着btc、eth等各种代币。实际上，钱包中是没有任何代币的，各种代币都是在链上的，钱包只保存了密钥对（公钥、私钥）。 钱包可以保存一对或多对密钥，其中私钥可以用来签名交易，进行控制属于该私钥的代币。

简单来说，数字钱包可以形象的理解为是一个钥匙串，实际是一个管理密钥（生成、存储、签名）的工具。

什么是HD钱包、BIP-32？
---------------

### 1）非确定性钱包 —— Just a Bunch Of Keys

在HD钱包出现之前，早期的钱包中保存的每一个私钥都是通过不同随机数相互独立生成的，这类钱包被称作非确定性钱包（或随机钱包），也被称为JBOK（Just a Bunch Of Keys）钱包。

但为了更好保护隐私和安全，我们通常需要很多账号（例如：交易所需要为每个用户生成一个收款账户），那我们就需要生成一堆私钥，而每个私钥都需要备份，管理起来就特别麻烦了。

![](https://storage.googleapis.com/papyrus_images/1129a6466748a4bf07aa8afe37e7baef3f5dc51ee543b05d311a5eee47e2bc6d.png)

### 2）HD钱包 / BIP-32 —— 避免管理一堆私钥的麻烦

为了解决非确定性钱包的私钥管理麻烦，就有了BIP-32 提议：根据一个随机数种子通过分层确定性推导的方式得到n个私钥，这样保存的时候，只需要保存一个种子就可以，私钥可以推导出来。

BIP-32提案的名字是：Hierarchical Deterministic Wallets， 就是我们所说的HD钱包。

BIP-32:[https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)

![](https://storage.googleapis.com/papyrus_images/d0fcdf74983ab26ca95d9e2aa924d42c4c11c44ba407c1aff3f97a0820a7fd11.png)

补充说明： BIP —— Bitcoin Improvement Proposals 比特币改进建议, BIP-32是第32个改进建议。

BIP-39 —— 助记词与私钥是什么关系？
----------------------

### 1）助记词起源

BIP-32让我们只需要备份一个种子，而不是一堆秘钥，但 BIP-32中的种子是一个 16 字节的 16 进制的随机数，非常难记。于是社区在 BIP-39 中提出了一种助记词方案，这让我们只需要记住12或24个单词，就可以在支持该标准的钱包中恢复所有密钥。

助记词的使用，让钱包备份的变得容易很多，相比之前的随机字符串，读记都要容易许多。

    16进制表示的种子
    0C1E24E5917779D297E14D45F14E1A1A
    
    助记词表示的种子：
    army van defense carry jealous true garbage claim echo media make crunch
    

### 2）助记词 —> 种子 —> HD钱包

说到助记词，很多人可能会误以为助记词是为了方便保存私钥而创建的一种保存私钥的方式。实际上是BIP-39 中提出的助记词是为了方便记录种子，而主私钥是由助记词推演而来。

*   生成助记词：根据128位随机数生成助记词
    
*   从助记词生成种子：通过密钥生成函数 PBKDF2 算法来生成种子。
    
*   从种子生成主私钥：通过 HMAC-SHA512 生成主私钥
    

![](https://storage.googleapis.com/papyrus_images/752545b64f8f77296c77fe121ed496a1ee108c6d17b53d68a64a6d748d6c5598.png)

为什么需要 BIP-44？
-------------

BIP-44 基于 BIP32 协议，提出一种让HD钱包支持多币种多账户结构的体系。 BIP-44指定了包含5个预定义树状层级的结构，各层定义如下：

    m / purpose' / coin' / account' / change / address_index
    

m是固定的, Purpose也是固定的，值为44（或者 0x8000002C）

Coin type 这个代表的是币种，0代表比特币，1代表比特币测试链，60代表以太坊 完整的币种列表地址：[https://github.com/satoshilabs/slips/blob/master/slip-0044.md](https://github.com/satoshilabs/slips/blob/master/slip-0044.md)

Account 代表这个币的账户索引，允许用户他们钱包分成多个逻辑上的子账户，从0开始

Change 常量0用于外部(收款地址)，常量1用于内部（也称为找零地址）。外部用于在钱包外可见的地址（例如，用于接收付款）。内部链用于在钱包外部不可见的地址，用于返回交易变更。 以太坊不存在找零的概念，所以只用0。

address\_index 这就是地址索引，从0开始，代表生成第几个地址，官方建议，每个account下的address\_index不要超过20

总之使用了 BIP44 协议的 HD 钱包，可以分出不同体系币种的私钥。意味着，一个主私钥可以生成一个比特币钱包私钥，可以生成一个以太坊钱包的私钥….. 而且因为同用一个主私钥和助记词，非常方便用户备份。

如何更好地使用HD钱包？
------------

上面讲了那么多，那到底要怎么使用呢？我怎么好像从来没有用到过呀！

其实大多数钱包都是HD钱包，基本都支持了BIP-32、BIP-39、BIP-44这几个标准的，也提供了相应的功能，只是知道和使用的人不多，所以这些功能会隐藏的比较深。

下面以TP为例，简单的讲下，更多的可以自己去体验挖掘

### 1）生成子钱包

**说明：**

使用同一助记词可以生成N个子钱包（打土狗特别适合），每个子钱包有自己的私钥、地址，但只需备份一套助记词

**操作：**

在TP中，从资产页面 ——》 钱包详情页面：  点击高级模式，出现【生成子钱包】栏目，可通过该功能使用当前助记词生成子钱包

图二中的子钱包序号，对应BIP-44中预定义树状层级的第五层：address\_index，代表生成第几个地址

![](https://storage.googleapis.com/papyrus_images/a9c3cf603be20e33e9aa14c419905ed36b9eb604475595dde665aaa58b3b57cb.jpg)

![](https://storage.googleapis.com/papyrus_images/a9e3b87a0bbc29eb14646994d31b14e21b66ce5d38f8b4861be151465881b4da.jpg)

### 2）导入恢复子钱包

说明：通过助记词，通过路径可以恢复对应的子钱包

操作： 1）导入钱包时，选择助记词，进入助记词导入页面 2）点击页面中【高级模式】，显示出【设置地址路径】栏目 3）修改路径 4）输入助记词、设置密码，完成子钱包导入

![](https://storage.googleapis.com/papyrus_images/a94c84b53ea5b694b9f68cbbba734a39c3c8de8dfe2dfbce981bb999ba1aeb29.jpg)

References：
-----------

[https://www.8btc.com/books/834/ethereum-book/\_book/](https://www.8btc.com/books/834/ethereum-book/_book/)

[https://www.8btc.com/books/261/master\_bitcoin/\_book/4/4.html](https://www.8btc.com/books/261/master_bitcoin/_book/4/4.html)

[https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)

[https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)

[https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)

[https://mp.weixin.qq.com/s?\_\_biz=MzUyNzE4MDM2MA==&mid=2247491779&idx=2&sn=dd1a2cfeac8cceb22d1f2a91741e448a&chksm=fa01d7e4cd765ef23360a8e50fc2031a4d5348e59fe2d97834fecd274b0a2f68631de232f6a](https://mp.weixin.qq.com/s?__biz=MzUyNzE4MDM2MA==&mid=2247491779&idx=2&sn=dd1a2cfeac8cceb22d1f2a91741e448a&chksm=fa01d7e4cd765ef23360a8e50fc2031a4d5348e59fe2d97834fecd274b0a2f68631de232f6a)

[https://learnblockchain.cn/2018/09/28/hdwallet](https://learnblockchain.cn/2018/09/28/hdwallet)

[https://www.arcblock.io/blog/zh/post/2018/12/01/hd-wallets-design-and-implementation](https://www.arcblock.io/blog/zh/post/2018/12/01/hd-wallets-design-and-implementation)

---

*Originally published on [nobodyjack.eth](https://paragraph.com/@nobodyjack-eth/web3-001)*
