主页 > imtoken官网下载教程 > 全面介绍比特币钱包技术

全面介绍比特币钱包技术

imtoken官网下载教程 2023-06-18 07:24:21

“钱包”一词在比特币中具有多种含义。从广义上讲,钱包是一种向用户提供交互界面的应用程序。钱包控制用户访问、管理密钥和地址、跟踪余额以及创建和签署交易。狭义上,从程序员的角度来看,“钱包”是指用于存储和管理用户密钥的数据结构。

1. 钱包技术概述

在本节中,我们总结了构建用户友好、安全和灵活的比特币钱包的各种技术。

一个常见的误解是比特币钱包包含比特币。事实上,钱包只包含钥匙。“硬币”记录在比特币网络的区块链上。用户通过使用钱包中的密钥签署交易来控制网络上的硬币。从某种意义上说,比特币钱包就是钥匙链。

提示比特币钱包只包含钥匙,不包含硬币。每个用户都有一个包含多个密钥的钱包。钱包仅包含私钥/公钥对的钥匙串(请参阅[私钥部分])。用户使用密钥签署交易,从而证明他们拥有交易输出(他们的硬币)。硬币作为交易输出(通常表示为 vout 或 txout)存储在区块链中。

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

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

第二种类型是确定性钱包,其中所有密钥都来自主密钥,即种子。此类钱包中的所有密钥都是相互关联的,如果有原始种子,则可以重新生成所有密钥。确定性钱包中使用了许多不同的密钥派生方法。最常见的推导方法是使用树状结构,称为 Hierarchical Deterministic Wallet 或 HD Wallet。

确定性钱包是通过种子派生创建的。为了便于使用,种子被编码为英文单词,也称为助记符。

接下来的几节将深入介绍这些技术。

1.1 个非确定性(随机)钱包

在第一批比特币客户端(Bitcoin Core,现在称为比特币核心客户端)中,钱包只是随机生成的私钥集合。这种类型的钱包称为零类型非确定性钱包。例如,Bitcoin Core 客户端预先生成 100 个随机私钥,从一开始就生成足够多的私钥,并且每个密钥只使用一次。这种钱包现在正被确定性钱包所取代,因为它们难以管理、备份和导入。随机密钥的缺点是,如果您生成许多私钥,则必须保留所有私钥的副本。这意味着必须定期备份钱包。每个密钥都必须备份,否则如果钱包无法访问,钱包控制的资金就会丢失。这种情况直接与避免地址重复使用的原则相冲突——每个比特币地址只能进行一次交易。地址重用将多个交易和地址联系在一起,从而降低了隐私。当您想避免重复使用地址时,类型零非确定性钱包不是一个好的选择,因为您创建了太多私钥并保留它们。虽然比特币核心客户端包括零钱包,但比特币核心开发人员不鼓励使用它们。

图 1 显示了一个包含一组松散随机密钥的非确定性钱包。

比特币钱包技术全面介绍

提示除了简单的测试,不要使用非确定性钱包。它们太麻烦了,无法备份和使用。相反,建议使用基于行业标准的 HD 钱包,可以使用种子助记词进行备份。

1.2 确定性(种子)钱包

比特币建立密钥

确定性或“种子”钱包包含可以通过使用一项离散函数从公共种子生成的私钥。种子是一个随机生成的数字。该数字还包含例如可以生成私钥的索引号或“链码”(请参阅​​“分层确定性钱包(BIP0032/BIP0044)”部分)。在确定性钱包中,种子就足够了恢复全部 私钥已经生成,创建时只需简单备份即可,种子也足以导入或导出钱包,方便用户的私钥在钱包之间轻松转移。

图 2 显示了确定性钱包的逻辑图。

1.3 分层确定性钱包(HD 钱​​包 (BIP-32/BIP-44))

开发确定性钱包是为了更容易从单个“种子”生成许多密钥。确定性钱包的最先进形式是 BIP0032 标准定义的 HD 钱包。HD钱包包含以树状结构派生的密钥,这样父密钥可以派生一系列子密钥,每个子密钥又可以派生一系列孙密钥,以此类推,无限派生。图 3 显示了树结构。

与随机(非确定性)密钥相比,HD 钱包有两个主要优势。首先,树形结构可以用来表达额外的组织含义。例如,当某个特定分支的子键用于接收交易收入,而另一个分支的子键用于支付支出时。来自不同分支机构的密钥可以在企业环境中使用,可以管理不同的分支机构、子公司、特定职能和会计类别。

HD 钱包的第二个好处是它允许用户创建一系列公钥,而无需访问相应的私钥。这可能允许 HD 钱包在不安全的服务器中使用或为每笔交易发布不同的公钥。公钥不需要预先加载或导出,也不需要私钥在服务器中可供支付。

1.4 个种子和助记符(BIP-39)

HD 钱包具有强大的机制来管理多个密钥和地址。从英文单词序列生成种子是一种标准化的方法,便于在钱包中传输、导出和导入,如果将HD钱包与此方法结合使用会更有用。这些英文单词被称为助记符,标准由 BIP-39 定义。今天,大多数比特币钱包(以及其他加密货币的钱包)都使用这个标准,并且可以使用可互操作的助记符导入和导出用于备份和恢复的种子。

让我们实际看看以下哪些种子更容易转录、阅读、导出和导入。

十六进制种子:0C1E24E5917779D297E14D45F14E1A1A

助记符所代表的种子:

军队范防御携带嫉妒的真实垃圾声称回声媒体制造紧缩

1.5钱包最佳实践

随着比特币钱包技术的成熟,出现了一些通用的行业标准,使得比特币钱包具有广泛的互操作性、易用性、安全性和灵活性。这些常用的标准是:

比特币建立密钥

助记码,基于 BIP-39

高清钱包,基于 BIP-32

多用途高清钱包结构,基于 BIP-43

多币种多账户钱包,基于BIP-44

这些标准在发展过程中可能会改变或过时,但现在它们形成了一套互锁技术,已成为比特币事实上的钱包标准。

这些标准已被广泛的软件和硬件比特币钱包采用,使所有这些钱包都可以互操作。用户可以将其中一个钱包生成的助记词导出并导入另一个钱包,恢复所有交易、密钥和地址。

支持这些标准的软件钱包列表包括(按字母顺序)Breadwallet、Copay、MulTIbit HD 和 Mycelium。列出支持这些标准的硬件钱包,包括(按字母顺序)Keepkey、Ledger 和 Trezor。

以下部分详细描述了这些技术。

提示 如果您正在开发比特币钱包,则应将其构建为 HD 钱包,并将种子编码为助记符以进行备份,遵循 BIP-32、BIP-39、BIP-43 和 BIP-44 标准,涵盖在以下章节。

1.6使用比特币钱包

在 [用户故事] 中,我们介绍了加布里埃尔,他是里约热内卢的一名有进取心的少年,他经营着一家简单的网上商店,销售比特币品牌的 T 恤、咖啡杯和贴纸。

Gabriel 使用 Trezor 比特币硬件钱包(Trezor Device:Hardware HD Wallet)来安全地管理他的比特币。Trezor 是一个简单的 USB 设备,带有两个按钮,用于存储密钥(以 HD 钱包的形式)和签署交易。Trezor 钱包遵循本章讨论的所有行业标准,因此 Gabriel 不依赖任何专有技术或单一供应商解决方案。

当 Gabriel 第一次使用 Trezor 时,该设备从内置的硬件随机数生成器生成助记符和种子。在这个初始化阶段,钱包会在屏幕上依次显示单词。

通过编写此助记符,Gabriel 创建了一个备份(参见表 1)),可用于在 Trezor 设备丢失或损坏时进行恢复。在新的 Trezor 钱包上,或任何兼容的软件和硬件钱包上,都可以使用助记词进行恢复。请注意,单词的顺序很重要,因此记忆纸备份需要每个单词都有空格。Gabriel必须仔细记录每个单词的数量以保持正确的顺序。表1 Gabriel的助记词备份

提示 为简单起见,Gabriel 的助记记录显示 12 个单词。事实上,大多数硬件钱包都会生成更安全的 24 字助记符。助记符的使用方式完全相同,无论长度如何。

比特币建立密钥

作为在线商店的第一次实践,Gabriel 使用他的 Trezor 设备生成比特币地址。所有客户订单都使用这个单一地址。正如我们将看到的,这种方法有一些缺点,但可以通过 HD 钱包进行改进。

2. 钱包技术细节

现在让我们深入了解许多比特币钱包使用的重要行业标准。

2.1 个助记词(BIP-39)

助记词表是表示(编码)随机数的英文单词序列,用作识别钱包的种子。单词序列足以重新创建种子,并从种子中重新创建钱包和所有私钥。当钱包首次创建时,运行带有助记符的确定性钱包的钱包应用程序将向用户呈现 12 到 24 个单词的序列。词序是钱包的备份。它还可用于恢复和重新创建应用程序的相同或兼容的钱包密钥。助记词可以让用户更容易复制钱包,因为它们比随机数序列更容易阅读和正确复制。

提示助记符经常与“大脑钱包”混淆。它们是不相同的。主要区别在于大脑钱包由用户选择的单词组成,而助记词是由钱包随机创建并呈现给用户的。这一重要区别使助记符更加安全,因为人类仍然无法猜测随机数。

助记词在比特币改进提案 39 中定义。需要注意的是,BIP-39 是助记符代码标准的实现。还有一个不同的标准,使用不同的词集,由 Electrum 钱包使用,早于 BIP-39。Trezor 硬件钱包背后的公司提出的 BIP-39 与 Electrum 的实施不兼容。然而,BIP-39 现在已经在数十个可互操作的实践案例中获得了广泛的行业支持,应该被视为事实上的行业标准。

BIP-39 定义了助记码和种子的创建,我们在这里描述了九个步骤。为清楚起见,该过程分为两个部分:

第 1-6 步是创建助记词,第 7-9 步是从助记词到种子。

2.2创建助记词

助记词由钱包使用 BIP-39 中定义的标准化流程自动生成。钱包从熵源开始比特币建立密钥,增加校验和,然后将熵映射到单词列表:

1、创建一个 128 到 256 位的随机序列(熵)。

2、提出SHA256哈希的前几位(熵长/32),可以创建随机序列校验和。

3、在随机序列的末尾添加一个校验和。

4、 将序列分成包含 11 位的不同部分。

5、将每个 11 位值与一个包含 2048 个单词的预定义字典对应。

比特币建立密钥

6、生成的单词序列就是助记码。

图 6 显示了熵如何生成助记符。

表 2 显示了熵数据大小与助记符长度之间的关系。

2.3 从助记符生成种子

助记符表示熵,长度为 128 到 256 位。熵用于通过使用密钥扩展函数 PBKDF2 导出更长的(512 位)种子。生成的种子用于构建确定性钱包并获取其密钥。

密钥扩展函数有两个参数:助记符和盐。salt 的目的是增加构建能够进行暴力攻击的查找表的难度。Salts 在 BIP-39 标准中还有另一个用途,允许引入密码短语作为保护种子的额外安全因素,我们在 BIP-39 可选密码短语部分详细描述了这一点。

创建助记词后的7-9个步骤是:

7、PBKDF2密钥扩展函数的第一个参数是第6步生成的助记词。

8、PBKDF2密钥扩展函数的第二个参数是salt。由字符串常量“助记符”与可选的用户提供的密码字符串连接而成。

9、PBKDF2 使用 HMAC-SHA512 算法,使用 2048 个哈希扩展助记符和盐参数,产生一个 512 位的值作为其最终输出。这个 512 位的值就是种子。

图 5-7 显示了如何从助记符生成种子

提示密钥扩展功能比特币建立密钥,使用 2048 哈希是一种非常有效的保护,可以防止对助记词或密码短语的暴力攻击。它使攻击尝试非常昂贵(计算上),需要尝试数千个密码和助记符组合,而可以生成的种子数量是巨大的(2^512).

表 3、4 和表 5 显示了助记符及其生成的种子的一些示例。

比特币建立密钥

2.4 BIP-39 中的可选密码

BIP-39 标准在派生种子时允许使用可选的密码。如果没有使用密码,助记词会使用由常量字符串“mnemonic”组成的盐进行扩展,从而从任何给定的助记词中产生一个特定的 512 位种子。如果使用密码短语,密钥扩展功能也将使用相同的助记词生成不同的种子。事实上,给定一个助记符,每个可能的密码短语都会产生不同的种子。基本上没有“错误”的密码短语,所有密码短语都是有效的,它们都会产生不同的种子,形成一大堆可能未初始化的钱包。这批钱包非常大(2^512),用暴力或随机猜测几乎是不可能的。

提示 BIP-39 中没有“错误”的密码短语。每个密码都会产生一些钱包,只是未使用的钱包是空的。

可选密码短语带来了两个重要功能:

密码短语(存储在大脑中)成为第二个因素,使助记词不能单独使用,避免使用被盗的助记词备份。它具有欺骗人们的效果,将密码引导至资金较少的钱包,从而分散攻击者对资金大额“真实”钱包的注意力。

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

如果钱包所有者丧失行为能力或死亡,没有人知道密码,种子就没有用了,钱包中存储的所有资金都将永远丢失。相反,如果所有者将密码短语备份在与种子相同的位置,则会违背上述第二个因素的目的。虽然密码非常有用,但它们只能与精心计划的备份和恢复过程结合使用,这应该允许所有者的家人恢复加密资产,因为可能会给所有者带来个人风险。

2.5使用助记码

BIP-39 被制作成一个支持多种编程语言的函数库:python-mnemonic

SatoshiLabs 团队提出了 BIP-39 标准在 Python 中的参考实现

比特币js/bip39

作为流行的 bitcoinJS 框架的一部分,BIP-39 在

libbitcoin/助记符

BIP-39 作为流行的 Libbitcoin 框架的一部分在 C++ 中实现

还有一个在单独的网页中实现的 BIP-39 生成器,可用于测试和实验。图 5-8 显示了一个可以生成助记词、种子和扩展私钥的独立网页。