你真的了解数字钱包吗?
发布于: 2024-07-27 13:55:30 更新于: 2024-07-28 00:00:00

文:nobodyjack (Twitter: @ethcrap)

01

你真的了解数字钱包吗?

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

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

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

02

什么是密钥和地址?

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

1)公匙 = 银行账户, 地址 = 银行卡号, 私钥 = 账户密码

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

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

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

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

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

2)私钥 —> 公钥 —> 地址

img

  • k,私钥,通常是随机产生,需要绝对保密的

  • K,公钥,由私钥通过椭圆曲线乘法运算而来,不可倒推出私钥,可以不保密

  • A,地址,由公钥通过单向哈希运算而来,不可倒推出公钥,是完全公开的

    03

钱包里没有代币

一个常见的误解认为钱包中保存着btc、eth等各种代币。实际上,钱包中是没有任何代币的,各种代币都是在链上的,钱包只保存了密钥对(公钥、私钥)。

钱包可以保存一对或多对密钥,其中私钥可以用来签名交易,进行控制属于该私钥的代币。

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

04

什么是HD钱包、BIP-32?

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

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

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

img

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

补充说明:

BIP —— Bitcoin Improvement Proposals 比特币改进建议, BIP-32是第32个改进建议。

05

什么是BIP-39 ,助记词与私钥是什么关系?

1)BIP-39

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

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

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

2)助记词 —> 种子 —> HD钱包

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

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

img

06

为什么需要 BIP-44?

BIP-44 基于 BIP32 协议,提出一种让HD钱包支持多币种多账户结构的体系。

BIP-44指定了包含5个预定义树状层级的结构,各层定义如下:

1
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

Account

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

Change

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

address_index

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

总之使用了 BIP44 协议的 HD 钱包,可以分出不同体系币种的私钥。意味着,一个主私钥可以生成一个比特币钱包私钥,可以生成一个以太坊钱包的私钥……

而且因为同用一个主私钥和助记词,非常方便用户备份。

上一篇
发布于: 2024-07-27 13:55:30 更新于: 2024-07-28 00:00:00
下一篇