### 什么是加密数字资产钱包?
在区块链中,我们的数字资产并不存储在钱包服务提供商(如imToken)的服务器中,而是“存储”在由私钥导出的钱包地址中,并放置在区块链网络上。只有你有了地址对应的私钥,你才有转移资产的权利。
所以,数字货币钱包其实就是一个生成和存储私钥的工具。它不保存资产,所有资产都在链上。
创建钱包地址的关键是随机生成一个私钥,它是一个32字节的数字。生成私钥的本质是选择1到2 256之间的一个数。因此,生成私钥的第一步是找到一种安全的方法来获得真随机数,以确保获得的随机数是不可预测或不可重复的。
比如你可以将一枚硬币抛256次,用纸笔记录正反面并转换成0和1,随机得到的256位二进制数可以作为钱包的私钥。
目前钱包分为两种:
一种是非确定性(随机)的钱包,就是随机生成多个私钥,钱包管理这些私钥。如果需要成千上万的地址,通过随机的方式来生成私钥,这就需要存储那么多无规律的私钥,这样就很麻烦不好管理。
另一种是确定性(种子)的钱包,就是通过种子可以生成无数的私钥,我们只需要记住种子就可以了。我们在使用钱包时记住的助记词可以生成种子,只要我们保管好助记词,我们的币就能找回来。用一句话来解释助记词:它是私钥的明文显示。
### BIP 32是怎么来的?
钱包是一个私钥管理工具,我们可以根据使用需求生成很多私钥。但是你会发现备份和管理私钥非常麻烦。最早的BTC钱包就是这样的,所以他也有一个昵称“只是一串钥匙”(一串私人钥匙)。为了解决这个问题,有BIP32提案:根据一个随机数种子,通过分层确定性推导可以得到N个私钥,所以保存的时候只需要一个种子,就可以从种子中推导出私钥,如图:
(图片来自掌握比特币)
BIP32提案名称:分层确定性钱包,也就是我们所说的分层确定性钱包(HD wallets)。
总之,BIP32是一个层次化的派生方案,避免了管理一堆私钥的麻烦。
# bip 39是什么?
BIP32允许我们保存一个随机数种子,而不是一串密钥。但是对于大部分用户来说,还是很不友好,这提示了BIP39的出现。 它使用记忆术来产生种子。在这种情况下,用户只要记住助记符,就可以创建随机种子作为BIP32的种子。
(对比一下,备份助记符比备份随机数种子方便多了)
整个过程包括两步:1 .生成助记符;2.从种子中导出助记符
#### 生成助记符
生成助记符。然后每11位除一次,这样就有12个二进制数,然后用每个数查BIP39定义的字表,得到12个助记符。过程如下图:
#### (图来自网络)
助记符推导种子
(这里不详细解释了,有兴趣的小伙伴可以自行查找资料。)
总之,BIP39就是通过定义助记符,让种子的备份更加友好。
# 公私钥生成流程
1、随机生成128到258位的随机数,称作熵;
2、熵经过一定处理方法,生成助记词;
3、助记词经过密钥延伸函数PBKDF2,生成种子;
4、种子经过HMAC-SHA512算法,生成母密钥;
5、通过CKD(child key derivation)函数,母密钥生成众多子密钥。
# 秘密密钥路径和BIP44
以这种分层方式导出的秘密密钥通常用路径表示,每一层用斜杠/表示,从主私钥导出的私钥以“m”开头。因此,由第一主密钥生成的子私钥是m/0。第一公钥是M/0。第一个子密钥的子密钥是m/0/1,依此类推。
BIP44为这个路径指定了一个标准化的含义(并且还扩展了对多种货币的支持)。BIP44规定了一个具有五个预定义树级的结构:
m/目的'/硬币'/账户'/变化/地址_索引
m是固定的。目的也是固定的,值为44(或0x 8000002 c)
coin type
这个代表货币,0代表比特币,1代表比特币测试链,60代表以太坊
完整货币列表地址:https://github.com/satoshilabs/slips/blob/master/slip-0044.md?4
Account
表示该币种的账户索引,从0开始
Change
常数0用于外链,常数1用于内链(也称更改地址)。外部链用于钱包外部可见的地址(例如,用于接收付款)。内部链用于在钱包外部不可见的地址,并用于返回交易更改。(所以一般用0)
address _ index
这是地址索引。从0开始,表示生成哪个地址。官方规定每个账户下的address _ index不能超过20
根据EIP85提出的讨论,[以太坊钱包](https://www.baoguzi.com/7f39aad4.html)也遵循BIP44标准。确定的路径是m/44'/60'/a'/0/n
a代表账号,n是第n代生成的地址,60是SLIP44提案中确定的以太坊的代码。所以用imToken导入助记符的时候会看到选择路径的选项,就是这个原因。
![](https://www.baoguzi.com/20220930/png/z3pxaraxdxr.png)
总之,BIP44就是为BIP32的层次化路径定义规范。
1,助记词的前世今生
https://baijiahao.baidu.com/s?id=1617532514212729385&wfr=spider&for=pc
2,浅析加密数字货币钱包中的BIP32、BIP44、BIP39概念
https://www.baoguzi.com/26299.html
3,MD5 SHA1 SHA256 等哈希(hash)校验码简介及文件哈希值获取工具介绍
https://zhuanlan.zhihu.com/p/546385760
4,钱包原理——助记词与公私钥
https://blog.csdn.net/qq_33375026/article/details/106252279 AAAA ******
5,ECC椭圆曲线密码学的原理、公式推导、例子、Python实现和应用
https://zhuanlan.zhihu.com/p/42629724?utm_id=0
6,metamask # 用户指南:助记词、密码、私钥
https://support.metamask.io/hc/en-us/articles/4404722782107-User-Guide-Secret-Recovery-Phrase-password-and-private-keys
7,开源协议
https://zhuanlan.zhihu.com/p/73146609?utm_id=0
https://www.ymama.net/news/txtlist_i2091v.html
https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
https://github.com/satoshilabs/slips/blob/master/slip-0044.md
https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md
https://iancoleman.io/slip39/
https://github.com/satoshilabs/slips/blob/master/slip-0039.md
https://en.bitcoin.it/wiki/BIP_0039
8 比特币协议讨论
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/
# 有没有更好的方式让用户记住自己的私钥?
1 BIP39 Colors
https://enteropositivo.github.io/bip39colors/#bip39tocolors
https://github.com/EnteroPositivo/bip39colors
2 Formsa
https://github.com/Yuri-SVB/formosa