一文搞懂 HD 钱包 | 一组助记词打天下
今天我们聊点基础但是刚需的内容。
前言
不知道你在使用钱包的时候,有没有想过一个问题?
为什么可以只使用一组助记词去控制多条链上的资产?正常来说,不应该是比特币在比特币的链上,以太坊在以太坊的链上吗?地址由私钥及公钥推导来,不同的地址,为什么助记词却一样?
比如在比特派钱包上?多链钱包竟然只需要备份一组助记词?
为什么比特币规定每一笔交易都需要生成一个新地址(新私钥)?
了解私钥管理方式前,先要解决一个问题:为什么比特币规定每一笔交易都需要生成一个新地址(新私钥)?我如果就一个比特币钱包,难道不是只备份一个私钥就行了?
比特币有特殊的找零机制,在频繁交易的过程中,会产生非常多的找零地址,而每个地址对应了一个密钥对(私钥+公钥)。那什么是找零地址?假设 A 有 20 个BTC,他需要转 5 个 BTC 给用户 B 。交易的输出部分应该是:A 支付 5 个 BTC 给B,再支付 15 个 BTC 给 A。
发现了吗,这个有个找零(15个BTC),转回给 A 的这个地址就是找零地址,为了匿名性,这个找零地址一般规定是一个新地址。
当然,你可以使用相同的地址作为找零地址,这样你就只备份一个私钥,或者说你只有一个比特币地址,但是一般不这么做。
一般找零地址是一个新地址,而且 A 每一笔交易的找零地址都是一个全新的地址,不是固定的。这样的好处是为了保护用户的隐私和避免一些安全隐患。
(关于找零,我这里解释的比较简略,大家如果有兴趣可以去寻找一些文章。了解一些 UTXO 模型。)
非确定性钱包(Non-deterministic Wallet)
根据上面讲的,一个钱包,在用户交易的过程中需要生成非常多的私钥。而非确定性钱包生成的私钥没有任何的关联,这意味着私钥的管理及备份会变得非常麻烦。如果用户的交易量够多,地址数量也会变得非常非常多,钱包需要保存的私钥数,也会非常多。钱包和用户都需要经常性地备份,否则就有可能丢失BTC。
《精通比特币》中说:
举个例子, 比特币核心客户端预先生成 100 个随机私钥,从最开始就生成足够多的私钥并且每个密钥只使用一次。
不过,现在非确定性钱包已经被确定性钱包代替。
确定性钱包(Deterministic Wallet)
确定性钱包,你可以简单理解为,确定性钱包可以通过一个 seed(种子)派生出一系列的子私钥。备份时,只需要备份种子就可以了。完美解决了非确定性钱包中各私钥不相关联,不方便备份的问题。所以确定性钱包又可以称作种子钱包。
分层确定性钱包 | HD 钱包(Hierarchical Deterministic Wallet)
HD钱包就是现在最常见的“高级版”确定性钱包。最早基于 BIP32 协议实现(目前常用的还有 BIP39 、BIP44协议)。BIP32 协议中定义,HD 钱包以树状结构衍生密钥(私钥和公钥), 这就意味着种子生成主私钥(或者说是主密钥对),再通过主私钥,可以派生出一系列的子私钥,而每个子私钥又可以衍生出一系列孙密钥,以此类推,不断可以衍生。
主私钥派生出子私钥的过程不可以逆,子私钥不能向上推导出父私钥,同时也不能水平推导出同一级的私钥。所以能够非常安全的分层管理私钥。
BIP39协议
虽然,只需要备份一个种子,就能够掌握海量的子私钥,但 BIP32 协议中的种子是一个 16 字节的 16 进制的随机数,非常难记。于是比特币开发社区在 BIP39 协议中提出了一个助记词方案。
说到助记词,大家应该都不陌生,每次注册钱包的时候,都会要求备份。很多人可能会误以为助记词是为了方便保存私钥,是钱包公司创建的一种保存私钥的方式。
实际上是相反的,BIP39 协议中提出的助记词是为了方便记录种子,而主私钥是由助记词推演而来。
整个过程生成私钥的过程比较复杂,大家可以简单理解为助记词使用 PBKDF2 转化为种子,然后通过 HMAC-SHA512 生成主私钥。
16 进制表示的种子: 0C1E24E5917779D297E14D45F14E1A1A
助记词表示的种子:
army van defense carry jealous true garbage claim echo media make crunch
BIP44协议
从协议的数字上来看,不难知道,这又是一个升级版了,BIP44 基于 BIP32 协议,对 HD 钱包的树状结构中的每一层给予了特殊的意义(5层)。能让同一个种子支援多币种、多帐户等。
各层定义如下:m / purpose’ / coin_type’ / account’ / change / address_index
第二层的“coin_type”,就是指的不同币种,多链HD钱包可以在这个层级分出不同体系的数字货币钱包。比方说比特币钱包、以太坊钱包…..
到这里,就完全解决了文中最开始的问题了:为什么我可以只使用一个私钥/助记词去控制多条链上的资产?
因为使用了 BIP44 协议的 HD 钱包,可以分出不同体系币种的私钥。意味着,一个主私钥可以生成一个比特币钱包私钥,可以生成一个以太坊钱包的私钥…..
而且因为同用一个主私钥和助记词,非常方便用户备份。
总结
1、因为比特币的 UXTO 模型,每次交易都最好要生成一个新地址作找零地址,而每个地址对应了一个私钥,这意味着,伴随着频繁的比特币交易,会产生大量的私钥。
2、非确定性钱包生成的私钥没有任何的关联,非常不方便钱包和用户备份。
3、HD 钱包产生的私钥有关联,只需要记住一个种子就可以访问所有地址的钱,而不需要每个地址都备份私钥,而且基于 BIP44 协议的 HD钱包,还能支持多币种、多账户。
4、BIP32、BIP39、BIP44等等,都是HD钱包技术的的底层协议。HD 钱包主要基于 BIP-32协议。助记码主要基于 BIP-39协议。多币种和多帐户钱包,基于 BIP-44协议
另:HD 钱包最适用的还是比特币
HD 钱包的几个协议(BIP32/BIP39/BIP44)最适用的还是比特币。主要是因为比特币是基于 UTXO,可以使用 HD 钱包为每个交易分配一个新地址,而以太坊、EOS 这些公链都使用的是账户体系,意味着,并不需要找零地址,交易后的余额会存留在旧的账户。
不过,在BIP44协议之后,HD 钱包让一个钱包管理多个币种,多个账户,已经是一个非常实用且高效的选择。
「注意」 我是金马,别人离开币圈的时候,正是我深耕的时候。
你的熊市,让我陪你度过可好?
币圈金马奖,和你一起走币圈这条光明大道。
希望和你成为朋友,我的微信:lijinma666