主页 > imtoken官网怎么找到 > 比特币钱包
比特币钱包
钱包技术概述
比特币钱包只包含密钥,不包含硬币。 每个用户都有一个包含多个密钥的钱包。 钱包仅包含私钥/公钥对的钥匙串。
用户使用他们的密钥签署交易,从而证明他们拥有交易输出(他们的硬币)。 硬币以交易输出(通常表示为 vout 或 txout)的形式存储在区块链上。
有两种主要类型的钱包,它们的区别在于它们包含的多个密钥是否相互链接。
第一种是非确定性钱包,其中每个密钥都是从随机数中独立生成的。 键是相互独立的。 这种钱包也被称为“Just a Bunch Of Keys”,简称JBOK钱包。
第二种是确定性钱包,其中所有密钥都来自称为种子的主密钥。 这类钱包中的所有密钥都是相互关联的,如果有原始种子,所有密钥都可以重新生成。 确定性钱包中使用了许多不同的密钥派生方法。 最常用的推导方法是使用树结构,称为分层确定性钱包或HD钱包。
确定性钱包是从种子创建的。 为了便于使用,种子被编码为英文单词,也称为助记符。
非确定性(随机)钱包
在最早一批比特币客户端(Bitcoin Core,现在称为 Bitcoin Core 客户端)中,钱包只是随机生成的私钥集合。 这种钱包称为零型非确定性钱包。 例如,Bitcoin Core 客户端预先生成 100 个随机私钥,从一开始就生成足够的私钥,每个密钥只使用一次。 此类钱包现在正被确定性钱包取代,因为它们难以管理、备份和导入。 随机密钥的缺点是,如果您生成许多私钥,则必须保留所有私钥的副本。 这意味着必须定期备份钱包。 每个密钥都必须备份,否则如果钱包无法访问比特币的钱包是一个程序吗,钱包控制的资金将丢失。 这种情况直接与避免地址重用的原则相冲突——每个比特币地址只能用于一次交易。 地址重用将多个交易和地址链接在一起,从而降低隐私。 当你想避免重复使用地址时,零类型非确定性钱包不是一个好的选择,因为你必须创建太多私钥并保存它们。 尽管比特币核心客户端包括零钱包,但比特币核心开发人员不鼓励使用它。
图片
确定性(种子)钱包
确定性或“种子”钱包包含可以通过使用单向离散函数从公共种子生成的私钥。 种子是随机生成的数字。 这个数字还包含,例如,一个索引号或一个可以生成私钥的“链代码”(参见“分层确定性钱包”)。 在确定性钱包中,种子足以恢复所有生成的私钥,因此在初始创建时进行简单备份就足够了。 种子足以让钱包导入或导出。 这很容易让用户的私钥在钱包之间轻松转移。
图 5-2 显示了确定性钱包的逻辑图。
图片
分层确定性钱包(HD Wallets (BIP-32/BIP-44))
开发确定性钱包是为了更容易从单个“种子”生成许多密钥。 最先进的确定性钱包形式是通过 BIP0032 标准定义的 HD 钱包。 HD钱包包含树形结构派生的密钥,一个父密钥可以派生出一系列的子密钥,每个子密钥又可以派生出一系列的孙密钥,以此类推,无限派生。 图 5-3 显示了树结构。
图片
与随机(不确定)密钥相比,HD 钱包有两个主要优势。
首先,树结构可以用来表达额外的组织意义。 例如,当一个特定的分叉子项用于接收交易收入而另一个分叉子项负责支付支出时。 在企业环境中可以使用不同的分支密钥,可以管理不同的分支部门、子公司、特定职能和会计类别。
HD 钱包的第二个好处是,它们允许用户创建一系列公钥,而无需访问相应的私钥。 这可能允许 HD 钱包在不安全的服务器中使用,或者为每笔交易发布不同的公钥。 公钥不需要预先加载或推导出来,私钥也不需要在服务器中用于支付。
种子和助记词(BIP-39)
HD 钱包具有管理多个密钥和地址的强大机制。 由一系列英文单词生成种子是一种标准化的方法,很容易在钱包中传输、导出和导入,如果HD钱包与这种方法结合使用会更有用。 这些英文单词称为助记符,标准由 BIP-39 定义。 今天,大多数比特币钱包(以及其他加密货币的钱包)都使用这个标准,并且可以使用可互操作的助记符导入和导出种子以进行备份和恢复。
让我们从实用的角度看看以下哪些种子文件更容易转录、阅读、导出和导入。
十六进制种子:0C1E24E5917779D297E14D45F14E1A1A
助记词代表的种子:
陆军面包车防御携带嫉妒真正的垃圾索赔回声媒体制造紧缩
从助记词生成种子
助记符表示熵,长度为 128 到 256 位。 熵用于通过使用密钥拉伸函数 PBKDF2 来导出更长(512 位)的种子。 生成的种子用于构建确定性钱包并派生其密钥。
key 扩展函数有两个参数:mnemonic 和 salt。 盐的目的是增加构建能够进行暴力攻击的查找表的难度。 在 BIP-39 标准中,盐还有另一个用途,它允许引入密码短语作为额外的安全因素来保护种子,我们将在 BIP-39 可选密码短语部分详细介绍。
创建助记符后的步骤 7-9 是:
7. PBKDF2密钥扩展函数的第一个参数是第6步生成的助记词。
8. PBKDF2密钥扩展函数的第二个参数是salt。 由字符串常量“mnemonic”和可选的用户提供的密码字符串组成。
9. PBKDF2使用HMAC-SHA512算法,使用2048个哈希扩展助记符和salt参数,并产生一个512位的值作为其最终输出。 这个 512 位的值就是种子。
图 5-7 展示了如何从助记词生成种子
种子
BIP-39 中的可选密码
BIP-39 标准允许在派生种子时使用可选的密码。 如果不使用密码短语,助记符将使用由常量字符串“mnemonic”组成的 salt 进行扩展,从任何给定的助记符中生成特定的 512 位种子。 如果使用密码短语,密钥拉伸功能也会产生具有相同助记符的不同种子。 事实上,给定一个助记符,每个可能的密码短语都会产生不同的种子。 基本上没有“错误”的密码短语,所有密码短语都是有效的,它们都会产生不同的种子,形成一个可能未初始化的钱包的大池。 这些钱包非常大 (2^512),几乎不可能使用蛮力或随机猜测。
提示 BIP-39 中没有“错误”的密码。 每个密码都会产生一些钱包,只是未使用的钱包是空的。
可选的密码短语带来了两个重要的特性:
然而,重要的是要注意使用密码短语也会带来丢失的风险:
钱包标准
随着比特币钱包技术的成熟,出现了一些通用的行业标准,使得比特币钱包具有广泛的互操作性、易用性、安全性和灵活性。 这些常用的标准是:
助记词代码,基于BIP-39 HD钱包,基于BIP-32多用途HD钱包结构,基于BIP-43多币种多账户钱包,基于BIP-44
这些标准可能会随着它们的发展而改变或变得过时,但就目前而言,它们形成了一套相互关联的技术,这些技术已经成为比特币事实上的钱包标准。
使用派生密钥私有子密钥的扩展派生
分层确定性钱包使用 CKD(子密钥派生)功能从父密钥派生子密钥。
子密钥派生函数基于单向散列函数。 这个功能结合了:
链码用于在此过程中引入确定性随机性,以便索引无法充分派生其他子密钥。 因此,除非您已经拥有链代码,否则拥有子密钥不会使其发现自己的姊妹密钥。 初始链码种子(位于密码树的根部)由随机数据构成,后续链码源自各自的父链码。
这三项(父私钥、链代码、索引)被组合并散列以生成子密钥。 重复这个过程到密码树的下一级,每个子密钥又可以成为父密钥并继续创建自己的子密钥,直到无限代。
扩展密钥
正如我们之前看到的,密钥派生函数可用于在密钥树的任何级别创建子密钥。 这只需要三个输入:密钥、链代码和所需子密钥的索引。 密钥和链码这两个重要部分组合在一起后,就称为扩展密钥。 术语“扩展密钥”也被认为是“可扩展密钥”,因为这样的密钥可用于派生子密钥。
扩展密钥可以简单地存储并表示为 512 位序列,只需将 256 位密钥与 256 位链码连接起来。 有两种扩展键。 扩展私钥是私钥和链码的组合。 可用于派生子私钥(子私钥可用于派生子公钥)。 公钥和链码组成扩展公钥,可以用来扩展子公钥,见“生成公钥”部分。
将扩展密钥想象成 HD 钱包中密钥树结构的一个分支的根。 您可以派生该分支的所有其余部分。 扩展私钥可以创建完整的分叉,而扩展公钥只能创建公钥的分叉。
提示 扩展密钥包括私钥(或公钥)和链码。 扩展密钥可以创建子密钥并可以在密钥树结构中创建整个分支。 共享扩展密钥可以访问整个分支。
公共子密钥派生
如前所述比特币的钱包是一个程序吗,分层确定性钱包的一个有用特性是能够直接从公共父密钥派生公共子密钥,而无需使用私钥。 这为我们提供了两种派生子公钥的方法:通过子私钥或直接通过父公钥。
因此,扩展密钥可用于导出 HD 钱包结构分支中的所有公钥(并且仅公钥)。
此快捷方式可用于创建非常机密的仅公钥配置。 在配置中,服务器或应用程序可以拥有扩展公钥的副本,有或没有私钥。 此配置可以创建无限数量的公钥和比特币地址。 但是发送到这个地址的任何比特币都不能被花费。 同时,在另一台更安全的服务器上,扩展私钥可以衍生出所有对应的可以签署交易和花钱的私钥。
图 5-11 说明了扩展父公钥派生子公钥的传递机制。
图片