转载请注明转载地址:https://blog.csdn.net/YAYAWXQ_QQ_COM/article/details/79724183
英文地址:https://github.com/ethereumbook/ethereumbook/blob/develop/wallets.asciidoc
钱包
“钱包”这个词在以太坊中用来描述一些不同的东西。
广义的说,钱包是一个应用程序,提供用户操作界面。通过钱包可以控制用户的钱,管理**和地址,跟踪余额,创建和签署交易。此外,一些Ethereum钱包也可以与合约(如tokens)进行交互。
更狭义地说,从程序员的角度来看,“钱包”这个词指的是用来存储和管理用户**的系统。每个“钱包”都有一个**管理组件。对于一些钱包来说,该组件就是全部钱包功能了。其他的钱包是更广泛的类别的一部分,如“浏览器”,它是基于ethereuml的分散应用程序或“dapps”的接口。在“钱包”这个术语下,各种类别之间没有明确的界限。
在本节中,我们将把钱包看作是用于私钥的容器,以及用于管理**的系统。
钱包技术概览
在本节中,我们总结了用于构建用户友好、安全和灵活的Ethereum钱包的各种技术。
关于Ethereum的一个常见的误解是Ethereum钱包中含有以太币或tokens代币。事实上,钱包里只有钥匙,以太币或其他token被记录在以太仿的区块链上。用户通过在他们的钱包中签署交易来控制网络上的代币。从某种意义上说,以太钱包是一个"keychain"。
注意:Ethereum钱包包含**,而不是以太币或代币。每个用户都有一个包含**的钱包。钱包实际上是包含成对的私有/公钥的keychain(参见[private_public_keys])。用户使用**签署交易,从而证明他们拥有以太币。以太币存储在区块链上。
有两种主要类型的钱包,区分是:它们所包含的**是否相互关联。
第一类是不确定性的钱包,每个**都是由随机数独立生成的。这些键不是相互关联的。这种类型的钱包,也被称为JBOK("Just a Bunch Of Keys")钱包。
第二种类型的钱包是一个确定性的钱包,所有的钥匙都来自一个单一的主键,即种子。这种类型的钱包里的所有**都是相互关联的,如果你有原始的种子,就可以重新生成。在确定性的钱包中有许多不同的主要派生方法。最常用的派生方法是树状结构,称为分级确定性或HD钱包。
确定性钱包是由种子初始化的。为了便于使用,种子被编码成英语单词(或其他语言中的单词),也被称为助记码字。
接下来的几节将在高级别介绍这些技术。
不确定性(随机)钱包
在第一个Ethereum钱包(由Ethereum预售所提供)中,钱包文件存储了一个随机生成的私有**。这样的钱包正在被确定性的钱包取代,因为它们难以管理、备份和导入。随机**的缺点是,如果你生成了很多,那么你必须保存所有它们的副本。每个**必须备份,否则,如果钱包无法访问,它所控制的资金将不可挽回地丢失。此外,通过将多个事务和地址关联在一起来,Ethereum地址重用将减少用户的隐私性。Type-0不确定性的钱包是一个糟糕的选择,特别是如果您想避免地址重用,因为它意味着管理多个键,这就需要频繁的备份。
许多Ethereum客户(包括go-ethereum或geth)使用一个keystore文件,它是一个json编码的文件,其中包含一个单独的(随机生成的)私钥,通过程序加密以获得额外的安全性。JSON文件内容如下:
{ "address": "001d3f1ef827552ae1114027bd3ecf1f086ba0f9", "crypto": { "cipher": "aes-128-ctr", "ciphertext": "233a9f4d236ed0c13394b504b6da5df02587c8bf1ad8946f6f2b58f055507ece", "cipherparams": { "iv": "d10c6ec5bae81b6cb9144de81037fa15" }, "kdf": "scrypt", "kdfparams": { "dklen": 32, "n": 262144, "p": 1, "r": 8, "salt": "99d37a47c7c9429c66976f643f386a61b78b97f3246adca89abe4245d2788407" }, "mac": "594c8df1c8ee0ded8255a50caf07e8c12061fd859f4b7c76ab704b17c957e842" }, "id": "4fcb2ba4-ccdb-424f-89d5-26cce304bf9c", "version": 3 }
keystore格式使用了一个**派生函数Key Derivation Function(KDF),也称为密码扩展算法,它可以防止暴力、字典或彩虹表攻击。简单地说,私钥不是由密码直接加密的。相反,通过反复的散列,密码就被拉长了。哈希函数在262144轮中重复出现,在keystore JSON中可以看到作为参数密码的kdfparams.n。如果攻击者试图使用暴力**口令,则必须对每一个试图使用的密码子进行262144轮的散列,这将使攻击速度减慢,从而使其在足够的复杂性和长度上不可行。
有许多软件库可以读取和写入keystore格式,比如JavaScript库keythereum:https://github.com/ethereumjs/keythereum
注意:除了简单的测试以外,不鼓励使用不确定性的钱包。因为它们实在太笨重了,无法备份和使用。取而代之的是,使用一个基于行业标准的HD钱包,并使用助记码种子进行备份。
确定性(种子)钱包
确定性 或“种子”钱包是包含私钥的钱包,它们都来自一个普通的种子,通过使用单向散列函数生成。种子是一个随机生成的数字,与其他数据相结合,比如索引号或“链码”(参见HD钱包(BIP-32/BIP-44))来派生私钥。在一个确定的钱包中,种子足以恢复所有派生的键,因此在创建时只需一个单独的备份就足够了。这种种子还可以用于钱包的导出或导入,以便在不同的钱包实现之间方便地移植用户所有的**。
确定性,或“种子”,钱包是包含私钥的钱包,它们都来自一个普通的种子,通过使用单向散列函数。种子是一个随机生成的数字,与其他数据相结合,比如索引号或“链码”(参见HD钱包(BIP-32/BIP-44))来派生私钥。在一个确定的钱包中,种子足以恢复所有派生的键,因此在创建时一个单独的备份就足够了。这种种子还可以用于钱包的导出或导入,以便在不同的钱包实现之间方便地移植所有用户的**。
分层确定性钱包(BIP-32/BIP-44)
确定性的钱包被开发出来,使得从一个单一的“种子”派生出许多**变得容易。最先进的确定性钱包是由比特币的BIP-32标准定义的HD钱包。HD钱包中包含了在树结构中派生的键,这样一来,父键就可以派生出一系列子键,每个键都可以派生出一系列的子键,等等,从而达到无限的深度。
图1 HD钱包:一棵由一个种子产生的**树
与随机(不确定性)**相比,HD钱包提供了两大优势:
首先,树形结构可以用来表示额外的组织含义,例如,当用于接收传入支付的特定分支,以及用于接收来自传出支付的找零的不同分支。关键字的分支也可以在企业设置中使用,将不同的分支分配给部门、子公司、特定功能或会计类别。
其次,用户可以创建一个公共**序列,而不需要访问相应的私钥。这使得HD钱包可以在不安全的服务器上使用,也可以只在手表或接收设备上使用,而钱包没有可以使用这些资金的私人**。
种子和助记码(BIP-39)
HD钱包是管理许多**和地址的强大机制。如果它们结合了一种标准化的方法,即从一组简单的英语单词(或另一种语言的单词)中创建种子,这些单词可以很容易地抄写、导出和导入钱包,那么它们就更有用了。这就是所谓的助记符,标准是由BIP-39定义的。今天,许多Ethereum钱包(以及其他加密货币的钱包)使用这个标准,可以使用互操作的助记符导入和导出备份和恢复的种子。
让我们从实际的角度来看这个问题。下列哪一种更容易抄写,记录在纸上,无差错地阅读,导出,并导入另一个钱包?一个确定的钱包的种子,十六进制形式:
FCCF1AB3329FD5DA3DA9577511F8F137
一个确定性钱包的种子,12个助记词形式:
wolf juice proud gown wool unfair wall cliff insect more detail hub
钱包的最佳实践
随着加密货币钱包技术的成熟,一些共同的行业标准出现了,使得钱包具有广泛的互操作性,易于使用,安全,灵活。这些标准还允许钱包派生出多种不同加密货币的**,这一切都来自于单一的助记符。这些共同的标准是:
- 助记码字,基于BIP-39
- HD钱包,基于BIP-32
- 多用途HD钱包结构,基于BIP-43
- 多用途和多账户钱包,基于BIP-44
这些标准可能会随着未来的发展而改变,或者可能会被淘汰,但现在它们形成了一套连锁技术,成为大多数加密货币事实上的钱包标准。这些标准已经被广泛的软件和硬件钱包所采用,使得所有这些钱包都是可互操作的。用户可以在其中一个钱包中导出一个助记符,并将其导入另一个钱包中,回收所有的事务、**和地址。
支持这些标准的软件钱包的一些例子包括(按字母顺序列出)Jaxx、MetaMask、MyEtherWallet (MEW)。支持这些标准的硬件钱包示例包括(按字母顺序列出)Keepkey、Ledger和Trezor。
下面的部分将详细讨论这些技术。
注意:如果您正在实现一个Ethereum钱包,它应该被构建为一个HD钱包,它的种子被编码为备份的助记码,后面的部分将按照BIP-32、BIP-39、BIP-43和BIP-44标准进行描述。
助记码字(BIP-39)
助记码字是一个随机数字序列,用作确定性的钱包派生的种子。单词的序列足以重新创建种子,从而重新创建钱包及其派生的**。一个钱包应用程序,用助记符实现了确定性钱包,当第一次创建钱包时,它将向用户显示12到24个单词的序列。该序列的单词是钱包的备份,可以用来恢复和重新创建相同或任何兼容的钱包应用程序中的所有**。助记词使用户更容易备份钱包,因为与随机数字序列相比,他们易于阅读和正确抄写。
注意:记忆单词常常与“brainwallet”混淆。他们的主要的区别是,brainwallet由用户选择的单词组成,而助记词则是由钱包随机创建并呈现给用户的。这一重要的差异使助记词更加安全,因为人类是非常贫乏随机性的来源。
在BIP-39中定义了助记码。注意,BIP-39是一个助记码的标准版实现。也有其他不同的标准,他们使用“一套不同的词”。比特币电子钱包使用的是BIP-39。BIP-39是由Trezor硬件钱包公司提出的,与电子版的实现不兼容。然而,BIP-39已经在几十个可互操作的实现中获得了广泛的行业支持,应该被视为事实上的行业标准。此外,BIP-39可用于生产支持Ethereum的多用途钱包,而电子种子则不能。
BIP-39定义了一个助记码和种子的创建,我们在这里用九个步骤来描述。为了清晰起见,这个过程分为两个部分: 第1步到第6步生成助记单词,步骤7到9从助记符到seed显示。
生成助记词
使用BIP-39中定义的标准化流程自动生成助记词。钱包从一个熵源开始,添加一个校验和,然后将熵映射到一个单词列表:
- 创建一个128到256位的随机序列(熵)
- 创建校验和,其值为:SHA256(随机序列(熵))后得到的散列的第一个(entrop-length/32)位
- 将校验和添加到随机序列的末尾
- 将序列分成12个部分,每个部分11bits
- 将每个11位的值映射到预定义的2048个单词字典中
- 助记码是单词的序列
图2 生成熵和助记词
表一:熵和字长显示了熵数据的大小与助记码的长度之间的关系。
Entropy (bits) | Checksum (bits) | Entropy + checksum (bits) | Mnemonic length (words) |
---|---|---|---|
128 |
4 |
132 |
12 |
160 |
|
165 |
15 |
192 |
6 |
198 |
18 |
224 |
7 |
231 |
21 |
256 |
8 |
264 |
24 |
从助记词到种子
记词表示的熵的长度为128到256位。然后通过使用**拉伸函数(key-stretching)PBKDF2来获得更长的(512位)种子。然后,用产生的种子来建立一个确定性钱包并推导出钱包中的所有**。
**拉伸函数(key-stretching)有两个参数:助记符和salt。在**拉伸函数(key-stretching)中使用salt的目的是使暴力攻击时的"创建查找表"变得困难。在BIP-39标准中,salt还有另一项目的——它允许引入一种passphrase,作为保护种子的额外安全因素,随后我们将更详细的描述BIP-39中的可选passohrase。
步骤7到步骤9是从上一节“生成助记词的过程”继续描述的:
7. PBKDF2函数的第一个参数是第6步生成的助记符
8. 第二个参数是salt。salt由字符串常量“助记符”组成,并与一个用户提供的可选passphrase字符串连接
9. PBKDF2通过2048轮HMAC-SHA512算法来拉伸助记和salt,生成一个512位的值作为最终输出。这个512位的值就是种子
图3 从助记词到种子的生成过程
注意:key-stretching函数,2048回合的hash运算是一种有效的保护,以防止对助记符或口令的暴力攻击。它使(在计算中)尝试超过几千个密码子和助记符组合的代价很高,而可能得到的种子数量是巨大的(2512)。
表二:128bits Entropy 助记词,没有passphrase,生成种子
Entropy input (128 bits) |
0c1e24e5917779d297e14d45f14e1a1a |
---|---|
Mnemonic (12 words) |
army van defense carry jealous true garbage claim echo media make crunch |
Passphrase |
(none) |
Seed (512 bits) |
5b56c417303faa3fcba7e57400e120a0ca83ec5a4fc9ffba757fbe63fbd77a89a1a3be4c67196f57c39 a88b76373733891bfaba16ed27a813ceed498804c0570 |
表三:128bits Entropy 助记词,使用passphrase,生成种子
Entropy input (128 bits) |
0c1e24e5917779d297e14d45f14e1a1a |
---|---|
Mnemonic (12 words) |
army van defense carry jealous true garbage claim echo media make crunch |
Passphrase |
SuperDuperSecret |
Seed (512 bits) |
3b5df16df2157104cfdd22830162a5e170c0161653e3afe6c88defeefb0818c793dbb28ab3ab091897d0 715861dc8a18358f80b79d49acf64142ae57037d1d54 |
表四:256bits Entropy 助记词,没有passphrase,生成种子
Entropy input (256 bits) |
2041546864449caff939d32d574753fe684d3c947c3346713dd8423e74abcf8c |
---|---|
Mnemonic (24 words) |
cake apple borrow silk endorse fitness top denial coil riot stay wolf luggage oxygen faint major edit measure invite love trap field dilemma oblige |
Passphrase |
(none) |
Seed (512 bits) |
3269bce2674acbd188d4f120072b13b088a0ecf87c6e4cae41657a0bb78f5315b33b3a04356e53d062e5 5f1e0deaa082df8d487381379df848a6ad7e98798404 |
BIP-39中的可选的passphrase
BIP-39标准允许在种子的派生中使用可选的passphrase。如果没有使用passphrase,那么会使用一个由常量字符串“助记符”组成的salt拉拉伸助记词,从而产生一个特定的512位的种子。如果使用了passphrase,那么拉伸函数就会生成另一个不同的种子。事实上,给定一个助记符,每个可能的passphrase就会导致生成不同的种子。本质上,没有“错误”的passphrase。所有的passphrase都是有效的,它们都会导致生成不同的种子,进而形成一大堆可能的未初始化的钱包。一组可能的钱包是如此之大(2512),以至于不可能刻意或不小心猜测一个正在使用的passphrase,只要passphrase是足够的复杂性和有足够的长度。
注意:在BIP-39中没有“错误”的passphrase。每个passphrase都会导致生成一些钱包,除非以前使用过,否则将是空的。
可选的passphrase创建了两个重要的特性:
- 第二因素(something memorized)使助记符本身变得毫无意义,可以防止助记词的备份不会被盗窃。
- 作为一种似是而非的推诿或“强迫钱包”的形式。在这种情况下,可选的passphrase生成的钱包里存有一小笔资金,用来分散攻击者的注意力,使其减少对包含大部分资金的“真实”钱包的关注。
- 如果钱包主人没有能力或者死亡,没有人知道密码,那么种子就没用了,所有储存在钱包里的钱都将永远丢失。
- 相反地,如果钱包的主人备份passphrase在与种子相同的地方,它就违背了第二因素的目的。
虽然passphrases非常有用,但它们只应该与精心计划的备份和恢复过程结合使用,考虑到所有者生存的可能性,并允许他或她的家庭恢复加密货币属性。
使用助记词
BIP-32被多种语言实现,作为一个库:
python-mnemonic SatoshiLabs团队在Python中提出的BIP-39标准的参考实现。
Consensys/eth-lightwallet 用于节点和浏览器的轻量级JS Ethereum钱包(带有BIP-39)
npm/bip39 比特币BIP39的JavaScript实现:生成确定性**的助记码。
还有一个BIP-39生成器在一个独立的网页中实现,这对于测试和实验非常有用。 A BIP-39 generator as a standalone web page 用它可以生成生成助记符、种子和扩展的私钥。
https://iancoleman.github.io/bip39/ 该网页可以在浏览器中离线使用,也可以在线访问。
从种子创建一个HD钱包
HD钱包是由一个单一的根种子创建的,根种子是一个128,256或512位随机数。通常,种子是由上一节详细介绍的助记符生成的。
HD钱包中的每一个**都是由这个根种子决定的,这使得它可以从任何兼容的HD钱包中重新创建整个HD钱包。这样,通过生成种子的助记词的简单传输,可以很容易备份、恢复、导出一个包含有成千上万**的钱包。
分层确定性钱包(BIP-32)和路径(BIP-43/44)
大多数的HD钱包都遵循BIP-32标准,这已经成为了确定性**生成的行业标准。你可以阅读以下的详细说明:
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
我们不会在这里讨论BIP-32的细节,只需要了解如何在钱包中使用它的组件。在许多软件库中,有几十个可互操作的BIP-32的实现:
Consensys/eth-lightwallet 用于节点和浏览器的轻量级JS Ethereum钱包(带有BIP-39)
http://bip32.org/ 一个BIP-32独立网页生成器,它对测试和实验非常有用
备注:独立的BIP-32生成器不是HTTPS站点。这是为了提醒您使用这个工具是不安全的。它只是用来测试的。您不应该使用本网站生产的**(使用真实的资金)。
扩展公钥和私钥
在BIP-32术语中,可以扩展产生“子”的父key称为扩展key。
扩展私钥前缀为xprv :
xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73
一个扩展公钥前缀为xpub:
xpub661MyMwAqRbcEnKbXcCqD2GT1di5zQxVqoHPAgHNe8dv5JP8gWmDproS6kFHJnLZd23tWevhdn4urGJ6b264DfTGKr8zjmYDjyDTi9U7iyT
HD钱包的一个非常有用的特性是,它能够从父公钥派生出子公钥,而不需要使用私钥。这给我们提供了两种方法来派生一个子公钥:要么来自子私钥,要么直接来自父公钥。
因此,可以使用一个扩展的公钥来派生所有的公钥(也仅有公钥)在该分支的HD钱包结构中。
这个可以用来创建非常安全的仅有公钥的部署,例如,在一个服务器或应用程序有一个扩展的公钥的副本而没有任何私钥。这种部署可以产生无限数量的公钥和Ethereum地址,但不能消费发送到这些地址上的钱。与此同时,在另一个更安全的服务器上,扩展的私钥可以派生所有对应的私钥来签署事务和使用这些钱。
此解决方案的一个常见应用是在服务于电子商务应用程序的web服务器上安装一个扩展的公钥。web服务器可以使用公钥派生函数为每个事务创建一个新的Ethereum地址(例如,对于客户购物车)。web服务器将不会有任何容易被窃取的私钥。如果没有HD钱包,唯一的方法就是在单独的安全服务器上生成数千个Ethereum地址,然后在电子商务服务器上预加载它们。这种方法很麻烦,需要经常维护,以确保电子商务服务器不会“耗尽”**。
这个解决方案的另一个常见应用是冷存储或硬件钱包。在这种情况下,扩展的私钥可以存储在硬件钱包中,而扩展的公钥可以在线保存。用户可以随意创建“接收”地址,而私钥则安全地存储在脱机状态。若要使用这些资金,用户可以在离线签署Ethereum客户端使用扩展的私钥,或者在硬件钱包设备上签名。
强化子**派生
从xpub中可以获取整个公钥分支的能力是非常有用的,但它带来了潜在的风险。通过xpub不能访问子私钥。但是,因为xpub包含了链代码chain code,如果已知一个子私钥,或者不知怎么泄漏了,它可以使用chain code来派生出所有其他子私钥。一个泄露的子私钥,连同一个父链代码chain code,则可以显示所有子私钥。更糟的是,子私钥和父链代码可以用来推断父私钥。
为了应对这一风险,HD钱包使用了一种可替代的衍生函数,称为“强化推导”,它“打破”了父公钥和子链代码之间的关系。强化推导函数使用父私钥派生子链代码,而不是父公钥。这就在父/子序列中创建了一个“防火墙”,其中的链代码不能用于对父级或同级私钥进行危害。
简单地说,如果您希望使用xpub的便利来派生公匙的分支,而不让自己暴露于泄漏的链码的风险,那么您应该从一个硬化的父类派生它,而不是从一个正常的父类派生。作为一种最佳实践,主键的"级别-1级子"总是通过变硬的派生派生,以防止主键的危害。
普通派生和强化派生的索引号
在BIP-32派生函数中使用的索引号是一个32位整数。为了方便地区分从普通派生函数派生的**和通过强化派生函数派生的**,这个索引号被划分为两个范围。0和231–1之间的索引号(0x0到0x7FFFFFFF)仅用于普通的派生。索引号在231到232-1之间(0x80000000到0xFFFFFFFF)只用于强化的派生。因此,如果索引号小于231,则child是普通的,反之,如果索引号等于或大于231,则该子就是强化的。
为了使索引号更易于阅读和显示,硬化子的索引号从0开始显示,但是有一个主要的符号。因此,第一个正常的子**被显示为0,而第一个强化的子(index 0x80000000)显示为0'按顺序排列,第二个硬键将有索引0x80000001,并显示为1'等等。当你看到一个HD钱包索引i',那就意味着索引号为231+i。
HD钱包**标识符(path)
使用“路径path”命名约定来标识HD钱包中的**,每一层的树都由一个斜杠(/)字符分隔(参见HD钱包路径示例)。从主私钥派生的私钥以“m”开头。公钥从主公钥开始,以“m”开头。因此,主私钥的第一个子私钥为m/0。第一个子公钥为M/0。第一个孩子的第二个孙子是m/0/1,等等。
一个键的“祖先”是从右到左读,直到你找到它的主键。例如,标识符m/x/y/z描述了key m/x/y的z-th子节点,它是m/x的y-th子,它是m的x-th子。
表五:HD钱包路径实例
HD path | Key described |
---|---|
m/0 |
主私钥m的第一个子私钥 |
m/0/0 |
The first grandchild private key of the first child (m/0) |
m/0'/0 |
The first normal grandchild of the first hardened child (m/0') |
m/1/0 |
The first grandchild private key of the second child (m/1) |
M/23/17/0/0 |
The first great-great-grandchild public key of the first great-grandchild of the 18th grandchild of the 24th child |
操纵HD钱包树结构
HD钱包结构提供了巨大的灵活性。每一个父扩展的**可以有40亿子**:20亿普通子**和20亿硬化子。每个子都有40亿的子,等等。这棵树可以像你想的那样深,有无数代。然而,有了这些灵活性,就很难操纵这棵无限的树。在实现之间转移HD钱包是特别困难的,因为内部组织进入分支和分支的可能性是无穷无尽的。
两个BIPs提供了解决这一复杂性的方法,为HD钱包树的结构创建了一些建议的标准。BIP-43建议使用第一个硬化的子索引作为特殊标识符,表示树结构的“目的”。基于BIP-43,一个HD钱包应该只使用树的一个一级分支,索引号通过定义它的用途来识别树的其他部分的结构和名称空间。例如,一个只使用分支m/i'的HD钱包; /是用来表示一个特定的目的,这个目的是通过索引号“i”来标识的。
通过扩展该规范,BIP-44提出了一种多用途多账户结构,其目的是“在BIP-43下”编号44'。遵循BIP-44结构的所有HD钱包都是只使用了树的一个分支来:m/44'。
BIP-44指定了由5个预定义树级别组成的结构:
m / purpose' / coin_type' / account' / change / address_index
第一级的“purpose”总是设为44'。第二级“coin_type”指定了加密货币的类型,允许在第二级的情况下,每一种货币都有自己的子树。在标准文件中定义了若干种货币,名为SLIP0044:
https://github.com/satoshilabs/slips/blob/master/slip-0044.md
几个例子:Ethereum是m/44'/60', Ethereum Classic为m/44'/61', 比特币是m/44'/0', 所有币种的此时网络为m/44'/1' 。
树的第三层是“account”,它允许用户将钱包细分为独立的逻辑子帐户,用于会计或组织目的。例如,一个HD钱包可能包含两个Ethereum“帐户”:m/44'/60'/0'和m/44'/60'/1'。每个帐户都是它自己的子树的根。
因为BIP-44最初是为比特币创建的,所以它包含了一个与Ethereum世界无关的“quirk”。在路径的第4层,“change”,一个HD钱包有两个子树,一个用于创建接收地址,另一个用于创建零钱地址。只有“receive”路径在Ethereum中使用,因为没有找零地址之类的东西。请注意,尽管以前的级别使用了强化派生,但是这个级别使用了普通的派生。这将允许此级别的树导出扩展的公钥,以便在不安全的环境中使用。可用的地址是由HD钱包作为第四层的孩子派生出来的,使树的第五层成为“address_index”。例如,在主要帐户中,第三个接收地址是M/44'/60'/0'/0/2。BIP-44 HD wallet structure examples 中展示了更多的例子。
表六:BIP-44 HD 钱包结构实例
HD path | Key described |
---|---|
M/44'/60'/0'/0/2 |
The third receiving public key for the primary Ethereum account |
M/44'/0'/3'/1/14 |
The fifteenth change-address public key for the fourth bitcoin account |
m/44'/2'/0'/0/1 |
The second private key in the Litecoin main account, for signing transactions |