《精通以太坊》-钱包

原文:Wallets

“钱包”这个词用来描述以太坊中的一些不同的东西。

在较高级别,钱包是用作主要用户界面的应用程序。钱包控制对用户资金的访问、管理密钥和地址、追踪余额以及创建和签署交易。此外,一些以太坊钱包也可以与合约(如代币)进行交互。

更狭义地说,从程序员的角度来看,“钱包”一词指的是用来存储和管理用户密钥的系统。每个“钱包”都有一个密钥的管理组件。对于一些钱包来说,这就是全部。其他钱包属于一个更广泛的范畴,即“浏览器”,即基于以太坊的去中心化应用程序或“DApps”的接口。在“钱包”一词下合并的各种类别之间没有明显的区别。

在本节中,我们将把钱包看作私有密钥的容器,以及管理密钥的系统。

钱包技术概述

在本节中,我们总结了用于构建用户友好、安全且灵活的以太坊钱包的各种技术。

关于以太坊的一个常见误解是,以太坊钱包含有以太币或代币。实际上,钱包只包含密钥。以太币或其他token记录在以太坊区块链中。用户通过在钱包中使用密钥对交易进行签名来控制网络上的token。从某种意义上说,以太坊钱包是钥匙串。

Tip 以太坊钱包里有密钥,不是以太或代币。每个用户都有一个装有密钥的钱包。钱包实际上是包含对私钥/公钥(参见[private_public_keys])的密钥串。用户使用密钥签署交易,从而证明他们拥有以太。ether储存在区块链上。

有两种主要类型的钱包,区别在于它们包含的密钥是否相互关联。

第一种类型是非确定性钱包,其中每个密钥是从随机数独立生成的。密钥彼此无关。这种类型的钱包也被称为“Just a Bunch Of Keys”中的JBOK钱包。

第二种类型的钱包是确定性钱包,其中所有密钥都来自单个主密钥,称为种子。这种类型的钱包中的所有密钥彼此相关,并且如果具有原始种子,则可以再次生成。确定性钱包中使用了许多不同的密钥派生方法。最常用的派生方法使用树状结构,称为分层确定性或HD钱包。

确定性钱包是从种子初始化的。为了使这些更容易使用,种子被编码为英语单词(或其他语言中的单词),也称为助记词。

接下来的几节将介绍这些技术的高级别。

不确定(随机)钱包

在第一个以太坊钱包(由以太坊预售)制作的钱包文件中存储了一个随机生成的私钥。这种钱包正在被确定性钱包取代,因为它们管理、备份和导入都很麻烦。随机密钥的缺点是,如果生成其中许多密钥,则必须保留所有密钥的副本。必须备份每个密钥,否则如果钱包无法访问,其控制的资金将不可避免地丢失。此外,以太坊地址重用通过将多个交易和地址相互关联来减少隐私。Type-0非确定性钱包是钱包的不良选择,特别是如果您想避免地址重用,因为它意味着管理许多密钥,这就需要频繁备份。

许多以太坊客户端(包括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格式使用密钥派生函数(KDF),也称为密码扩展算法,可防止针对密码加密的暴力、字典或彩虹表攻击。简单来说,私钥不直接通过密码加密。相反,通过反复对密码进行哈希运算来扩展密码。哈希函数重复262144轮,可以在密钥库JSON中看作参数crypto.kdfparams.n。如果攻击者试图对密码进行暴力攻击,那么他必须对每一个密码进行262144轮的哈希运算,这就足够降低攻击的速度,使密码变得不可能具有足够的复杂性和长度。

有许多代码库可以读写keystore格式,例如JavaScript库keythereum:

https://github.com/ethereumjs/keythereum

Tip 除了简单的测试以外,不鼓励使用不确定性的钱包。它们实在是太笨重了,无法备份和使用。取而代之的是,使用一个基于行业标准的HD钱包,并使用助记码种子进行备份。

确定性(种子)钱包

确定性(或“种子”钱包)指的是包含私有密钥的钱包,它们都是通过使用单向哈希函数从公共种子派生而来的。种子是一个随机生成的数字,与其他数据(如索引号或“chain code”(参见HD钱包(BIP-32/BIP-44))结合在一起)来派生私钥。在确定性的钱包中,种子足以恢复所有派生的密钥,因此在创建时进行一次备份就足够了。种子也足够用于钱包导出或导入,允许在不同的钱包实现之间轻松迁移用户的所有密钥。

HD Wallets (BIP-32/BIP-44)

确定性的钱包被开发出来,使得从一个单一的“种子”中很容易得到许多密钥。最先进的确定性钱包形式是由比特币的BIP-32标准定义的HD钱包。HD钱包中包含了在树结构中派生的密钥,这样一来,父密钥就可以派生出一系列子密钥,每个密钥都可以派生出一系列的子密钥,等等,从而达到无限的深度。这个树结构在[hd_wallet]中有说明。

image

图1. HD钱包:从单个种子生成的密钥树

HD钱包与随机(非确定性)密钥相比具有两大优势。首先,树结构可用于表达其他组织含义,例如当子密钥的特定分支用于接收传入付款时,并且使用不同分支来接收来自付款的更改。密钥分支也可以在公司设置中使用,将不同的分支分配给部门、子公司、特定功能或会计类别。

HD钱包的第二个优点是用户可以创建一系列公钥而无需访问相应的私钥。这允许HD钱包在不安全的服务器上使用,或者在仅限手表或仅接收的容量中使用,其中钱包没有可以花费资金的私钥。

种子和助记词(BIP-39)

HD钱包是管理许多密钥和地址的非常强大的机制。如果将它们与一系列英语单词(或另一种语言中的单词)创建种子的标准化方法相结合,它们就更有用,这些单词易于转录,导出和导入钱包。这被称为助记符,标准由BIP-39定义。如今,许多以太坊钱包(以及其他加密货币的钱包)都使用此标准,可以使用可互操作的助记词导入和导出种子以进行备份和恢复。

让我们从实际的角度来看待这个问题。以下哪种种子更容易转录,在纸上记录,无误读,导出和导入另一个钱包?

确定性钱包的种子,十六进制

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。

下面的部分将详细地研究这些技术。

Tip 如果您正在实现一个Ethereum钱包,则应该将其构建为HD钱包,并将种子编码为用于备份的助记词,遵循如下章节所述的BIP-32、BIP-39、BIP-43和BIP-44标准。

助记词 (BIP-39)

助记词是表示(编码)一个随机数的字序列,用来作为种子产生一个确定性的钱包。单词序列足以重新创建种子,然后再创建钱包和所有派生的密钥。一个实现带有助记词的确定性钱包应用程序在首次创建钱包时将向用户显示12到24个单词的序列。该单词序列是钱包备份,可用于恢复和重新创建相同或任何兼容的钱包应用程序中的所有密钥。记忆单词使用户更容易备份钱包,因为与随机数字序列相比,它们易于阅读和正确地转录。

Tip 助记词常常与“脑钱包”混淆。他们不一样。主要的区别在于,脑钱包由用户选择的单词组成,而助记词则由钱包随机创建并呈现给用户。这个重要的区别使得助记词更加安全,因为人类是非常缺乏随机性的来源。

助记词在BIP-39中定义。注意,BIP-39是一个助记词标准的实现。比特币Electrum钱包(Electrum Bitcoin wallet)和BIP-39问世之前,有一个不同的标准,有不同的一组词。BIP-39是Trezor硬件钱包背后的公司提出的,与Electrum的实现不兼容。然而,BIP-39现在已经在几十种互操作实现中获得了广泛的行业支持,应该被视为事实上的行业标准。此外,BIP-39可用于生产支持以太的多币种钱包,而Electrum种子则不能。

BIP-39定义了一个助记词和种子的创建,我们在这里用九个步骤来描述它。为了清晰起见,这个过程分为两部分:第1步到第6步显示在生成助记词中,第7步到第9步显示在从助记词到种子中。

生成助记词

使用BIP-39中定义的标准化过程,钱包自动生成助记词。钱包从一个熵源开始,添加一个校验和,然后将熵映射到一个单词列表:

  1. 创建128到256位的随机序列(熵)。
  2. 通过获取SHA256哈希的第一(熵长度/ 32)位来创建随机序列的校验和。
  3. 将校验和添加到随机序列的末尾。
  4. 将序列分成11位的部分。
  5. 将每个11位值映射到来自2048个单词的预定义字典中的单词。
  6. 助记词是单词序列。

[生成熵和编码作为助记词]显示了如何使用熵来生成助记词。

image

图2.生成熵和编码作为助记词

[助记码:熵和字长]表示熵数据的大小与单词中助记词的长度之间的关系。

表1.助记码:熵和字长

熵(bits) Checksum(bits) 熵+Checksum(bits) 助记词长度(words)
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24

从助记词到种子

助记词代表长度为128到256位的熵。然后使用熵通过使用密钥扩展函数PBKDF2来导出更长(512位)的种子。然后,所产生的种子用于构建确定性钱包并获得其密钥。

密钥扩展功能有两个参数:助记词和salt。密钥扩展功能中的盐的目的是使得难以构建能够进行暴力攻击的查找表。在BIP-39标准中,salt具有另一个目的 - 它允许引入密码短语作为保护种子的额外安全因子,我们将在[BIP-39中的可选密码短语]中更详细地描述。

步骤7到9中描述的过程从先前在生成助记词中描述的过程继续:

  1. PBKDF2密钥扩展功能的第一个参数是从步骤6产生的助记词。
  2. PBKDF2密钥扩展功能的第二个参数是salt。salt由字符串常量“mnemonic”和可选的用户提供的密码短语字符串组成。
  3. PBKDF2使用2048轮HMAC-SHA512哈希算法来扩展助记词和salt参数,产生512位值作为其最终输出。那个512位的值是种子。

[fig_5_7]显示了如何使用助记词来生成种子。

image

图3.从助记词到种子

Tip 具有2048轮哈希的密钥扩展功能可以有效地防止对助记词或密码短语的暴力攻击。它使得尝试超过几千个密码和助记词组合成本很高(在计算中),而可能的派生种子的数量是巨大的(2^{512})。

表#mnemonic_128_no_pass、#mnemonic_128_w_pass和#mnemonic_256_no_pass显示了一些助记词及其生成的种子(没有任何密码)。

表2,128位熵、助记码、无密码短语,产生种子

熵输入(128 bits) 0c1e24e5917779d297e14d45f14e1a1a
助记词(12个单词) army van defense carry jealous true garbage claim echo media make crunch
密码短语 (none)
种子(512 bits) 5b56c417303faa3fcba7e57400e120a0ca83ec5a4fc9ffba757fbe63fbd77a89a1a3be4c67196f57c39 a88b76373733891bfaba16ed27a813ceed498804c0570

表3,128位熵、助记码,用密码短语,产生种子

熵输入(128 bits) 0c1e24e5917779d297e14d45f14e1a1a
助记词(12个单词) army van defense carry jealous true garbage claim echo media make crunch
密码短语 SuperDuperSecret
种子(512 bits) 3b5df16df2157104cfdd22830162a5e170c0161653e3afe6c88defeefb0818c793dbb28ab3ab091897d0 715861dc8a18358f80b79d49acf64142ae57037d1d54

表4,256位熵、助记码、无密码短语,产生种子

熵输入(256 bits) 2041546864449caff939d32d574753fe684d3c947c3346713dd8423e74abcf8c
助记词(24个单词) cake apple borrow silk endorse fitness top denial coil riot stay wolf luggage oxygen faint major edit measure invite love trap field dilemma oblige
密码短语 (none)
种子(512 bits) 3b5df16df2157104cfdd22830162a5e170c0161653e3afe6c88defeefb0818c793dbb28ab3ab091897d0 715861dc8a18358f80b79d49acf64142ae57037d1d54

可选的密码短语 BIP-39

BIP-39标准允许在种子的推导中使用可选的密码短语。如果没有使用密码,则使用由常量字符串“mnemonic”组成的salt来扩展助记词,从任何给定的助记词产生特定的512位种子。如果使用密码短语,则扩展函数会产生与该相同助记词不同的种子。实际上,考虑到单个助记词,每个可能的密码都会导致不同的种子。基本上,没有“wrong”密码短语。所有的密码都是有效的,它们都会导致不同的种子,形成一大堆可能未初始化的钱包。可能的钱包是如此之大(2^512)只要密码短语具有足够的复杂性和长度,就不存在强制暴力或意外猜测正在使用的密码的实际可能性。

Tip 在BIP-39中没有“wrong”的密码。每一个密码会导致一些钱包,除非以前使用过,否则钱包将是空的。

可选的密码短语创建了两个重要功能:

  • 第二个因素(记忆的东西)使助记词本身无用,保护助记词备份免受小偷的攻击。
  • 一种看似合理的否认或“duress wallet”,被选择的密码会导致一个钱包里有少量资金,用于分散攻击者对包含大部分资金的“真实”钱包的注意力。

但是,重要的是要注意使用密码还会带来丢失的风险:

  • 如果钱包所有者无行为能力或死亡并且没有其他人知道密码短语,则种子无用,并且存储在钱包中的所有资金将永远丢失。
  • 相反,如果所有者在与种子相同的位置备份密码短语,则会违背第二个因素的目的。

虽然密码非常有用,但它们应该只与精心策划的备份和恢复过程结合使用,考虑到所有者幸存并允许其家人恢复加密货币的可能性。

使用助记词

BIP-39作为许多不同编程语言的库实现:

  • python-mnemonic:SatoshiLabs团队在Python中提出BIP-39的标准参考实现
  • Consensys/eth-lightwallet:用于节点和浏览器的轻量级JS以太坊钱包(使用BIP-39)
  • npm/bip39:比特币BIP39的JavaScript实现:用于生成确定性密钥的助记词

在独立网页中还实现了BIP-39生成器,这对于测试和实验非常有用。[作为独立网页的BIP-39生成器]显示了一个生成助记词、种子和扩展私钥的独立网页。

image

图4. BIP-39生成器作为独立的Web页面

页面(https://iancoleman.github.io/bip39/)可以在浏览器中离线使用,也可以在线访问。

用种子创建HD钱包

HD钱包是从单个根种子创建的,该种子是128位、256位或512位的随机数。最常见的是,这种种子是由助记词生成的,如上一节所述。

HD钱包中的每个密钥都是从这个根种子确定性地导出的,这使得可以在任何兼容的HD钱包中从该种子重新创建整个HD钱包。通过简单地仅传输根种子来源的助记词,可以轻松备份、恢复、导出和导入包含数千甚至数百万个密钥的HD钱包。

[[bip32_bip43 / 44]] ====分层确定性钱包(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以太坊钱包(使用BIP-39)

还有一个BIP-32独立网页生成器,对BIP-32的测试和实验非常有用:http://bip32.org/

Note 独立的BIP-32生成器不是HTTPS站点。这是为了提醒您使用此工具并不安全。它仅用于测试。您不应该使用此网站在生成的密钥(使用真实资金)。

扩展的公钥和私钥

在BIP-32术语中,可以扩展为生成“children”的父密钥称为扩展密钥。如果它是私钥,则它是由前缀xprv区分的扩展私钥:

xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73

一个扩展的公钥是由前缀区分XPUB:

xpub661MyMwAqRbcEnKbXcCqD2GT1di5zQxVqoHPAgHNe8dv5JP8gWmDproS6kFHJnLZd23tWevhdn4urGJ6b264DfTGKr8zjmYDjyDTi9U7iyT

HD钱包的一个非常有用的特性是能够从公共父密钥导出公共子密钥而无需私钥。这为我们提供了两种方法来派生子公钥:来自子私钥,或直接来自父公钥。

因此,可以使用扩展的公钥派生HD钱包结构分支中的所有公钥(仅包括公钥)。

此快捷方式可用于创建非常安全的只使用公钥的部署,其中服务器或应用程序具有扩展公钥的副本,并且没有任何私钥。这种部署可以产生无限数量的公钥和以太坊地址,但不能把任何钱花在发送到这些地址上。同时,在另一个更安全的服务器上,扩展私钥可以导出所有相应的私钥以签署交易并花钱。

此解决方案的一个常见应用是在服务于电子商务应用程序的Web服务器上安装扩展公钥。Web服务器可以使用公钥派生函数为每个交易(例如,对于客户购物车)创建新的以太坊地址。Web服务器将没有任何易受盗窃的私钥。如果没有HD钱包,唯一的方法是在单独的安全服务器上生成数千个以太坊地址,然后在电子商务服务器上预加载它们。这种方法很麻烦,需要不断维护以确保电子商务服务器不会“耗尽”密钥。

该解决方案的另一个常见应用是用于冷存储或硬件钱包。在这种情况下,扩展私钥可以存储在硬件钱包上,而扩展公钥可以在线保存。用户可以随意创建“接收”地址,而私钥可以安全地离线存储。为了花费资金,用户可以在离线签名以太坊客户端上使用扩展私钥或在硬件钱包设备上签署交易。

强化子密钥派生

从xpub派生公钥分支的能力非常有用,但它带来了潜在的风险。访问xpub不允许访问子私钥。但是,因为xpub包含“chain code”,如果子私钥已知或以某种方式泄露,它可以与“chain code”一起使用以派生所有其他子私钥。单个泄露的子私钥与父“chain code”一起显示所有子私钥。更糟糕的是,子私钥和父“chain code”可用于推导父私钥。

为了应对这种风险,HD钱包使用一种称为强化派生的替代派生函数,该函数“打破”父公钥和子“chain code”之间的关系。强化派生函数使用父私钥来派生子“chain code”,而不是父公钥。这会在父/子序列中创建一个“防火墙”,其“chain code”不能用于破坏父私钥或同级私钥。

简单来说,如果您希望使用xpub的便利来派生公钥的分支,而不会让自己暴露于泄露的“chain code”的风险,那么您应该从强化的父项而不是普通的父项派生它。作为最佳实践,主密钥的1级子项始终通过硬化派生,以防止损坏主密钥。

正常和强化派生的索引号

BIP-32派生函数中使用的索引号是32位整数。为了容易地区分通过正常推导函数导出的密钥与通过强化推导导出的密钥,该索引号被分成两个范围。0到2^{31}-1之间的索引号(0x0到0x7FFFFFFF)仅用于正常推导。2^312^{32}-1 之间的索引号(0x80000000至0xFFFFFFFF)仅用于强化推导。因此,如果索引号小于2^31,则子项是正常的,而如果索引号等于或大于2^31,则子项强化。

为了使索引号更易于读取和显示,强化子项的索引号从0开始显示,但使用一个素数符号。因此,第一个普通的子项显示为0,而第一个强化子密钥(索引0x80000000)显示为0'。然后,第二个硬化密钥将具有索引0x80000001,并将显示为1',等等。当你看到一个HD钱包索引i',那就意味着2^{31}+i

HD钱包密钥标识符(path)

HD钱包中的密钥使用“path”命名约定进行标识,每个层次的树都用斜杠(/)字符分隔(参见HD钱包路径示例)。从主私钥派生的私钥以“m”开头。由主公钥派生的公钥以“M”开头。因此,主私钥的第一个子私钥是m/0。第一个子公钥为M/0。第一个子项的第二个孙项是m/0/1,等等。

从右到左读取一个密钥的“ancestry(祖先)”,直到您到达它派生的主密钥。例如,标识符m/x/y/z描述了密钥m/x/y的z个子密钥,它是密钥m/x的第y个子密钥,它是m的第x个子密钥。

表5所示。HD钱包路径示例

HD path 密钥描述
m/0 主私钥(m)的第一个(0)子私钥
m/0/0 第一个子私钥的第一个孙私钥(m/0)
m/0'/0 第一个强化的子私钥(m/0')的第一个正常的孙私钥
m/1/0 第二个子私钥(m/1)的第一个孙私钥
M/23/17/0 第24个子公钥的第18个孙公钥的第一个曾孙公钥

导航HD钱包树结构

HD钱包树结构提供了巨大的灵活性。每个父扩展密钥都有40亿子密钥:20亿正常的子密钥和20亿强化的子密钥。每个子密钥都可以有另外40亿子密钥,以此类推。树可以是你想要的深,有无限的世代。然而,有了这些灵活性,就很难驾驭这棵无限的树。在实现之间转移HD钱包尤其困难,因为内部组织成为分支和子分支的可能性是无限的。

通过为HD钱包树的结构创建一些拟议的标准,两个bip提供了解决这种复杂性的解决方案。BIP-43建议使用第一个经过强化的子索引作为特殊标识符,表示树结构的“purpose(目的)”。基于BIP-43, HD钱包应该只使用树的一个一级分支,索引号通过定义其用途标识树的其他部分的结构和名称空间。例如,一个只使用m/i'分支的HD钱包是用来表示特定的目的的,而这个目的是通过索引号“i”来标识的。

扩展了该规范,BIP-44提出了一个多用途多账户结构,作为BIP-43的“purpose”44'。所有遵循BIP-44结构的HD钱包都是通过只使用树的一个分支来识别的:m/44'/。

BIP-44指定了由5个预定义树级别组成的结构:

m / purpose' / coin_type' / account' / change / address_index

第一级“purpose”总是设置为44'。第二级“coin_type”指定加密货币的类型,允许多用途HD钱包,其中每种货币在第二级下都有自己的子树。在标准文件中定义了若干种货币,名为sli0044:

https://github.com/satoshilabs/slips/blob/master/slip-0044.md

举几个例子: 以太坊是m/44'/60',以太坊经典是m/44'/61',比特币是m/44'/0',所有加密货币测试用m/44'/1'。

树的第三层是“account”,它允许用户将钱包细分为独立的逻辑子帐户,用于会计或组织目的。例如,HD钱包可能包含两个以太“账户”:m/44'/60'/0'和m/44'/60'/1'。每个帐户都是自己子树的根。

因为BIP-44最初是为比特币而设计的,所以它包含了一种“quirk(怪癖)”,在以太坊上并不存在。在路径的第四层,“change”,HD钱包有两个子树,一个用于创建接收地址,一个用于创建付款地址。只有“接收”路径在以太坊中使用,因为没有所谓的付款地址。注意,虽然前面的级别使用了强化派生,但是这个级别使用了正常派生。这允许树的这个级别导出扩展的公钥,以便在不安全的环境中使用。可用地址由HD钱包作为第四级的子级派生,使第五级树成为“address_index”。例如,在主要账户中,以太付款的第三个接收地址是M/44'/60'/0/2。BIP-44 HD钱包结构示例显示了更多示例。

表6所示。BIP-44 HD钱包结构示例

HD path 密钥描述
M/44'/60'/0'/0/2 主要以太坊账户的第三个接收地址公钥
M/44'/0'/3'/1/14 第四个比特币账户的第15个付款地址公钥
m/44'/2'/0'/0/1 Litecoin主帐户中的第二个私钥,用于签名交易

推荐阅读更多精彩内容