5个版本
0.1.16-alpha.0 | 2023年3月31日 |
---|---|
0.1.14-alpha.0 | 2023年3月18日 |
0.1.13-alpha.0 | 2023年3月17日 |
0.1.12-alpha.0 | 2023年1月19日 |
0.1.10-alpha.0 | 2023年1月18日 |
#8 in #root-key
628 每月下载量
在 95 个 crate (27 直接) 中使用
1MB
3.5K SLoC
bitcoin-key crate
bitcoin-key
crate 是 Bitcoin 系统中密钥处理功能的 Rust 实现。它是将 Bitcoin 代码库从 C++ 直接翻译到 Rust 的直接翻译,尽管目前大部分功能可用,但仍有部分函数体仍在翻译中。
bitcoin-key
crate 提供了处理密钥的功能,包括 ExtKey
和 Key
类型,以及 PubKey
、XOnlyPubKey
、PrivKey
、ExtPubKey
和 Output
类型。它还包括对 ChainCode
、KeyID
和 KeyOriginInfo
类型的支持,以及用于验证数字签名的 ECCVerifyHandle
。
bitcoin-key
crate 是 Bitcoin 系统的一个基本组件,对于密钥派生、签名、验证和序列化等任务都是必要的。
尽管 bitcoin-key
crate 可能不涉及任何特定的数学方程或概念,但它严重依赖于加密原语和算法,如椭圆曲线密码学和数字签名。
作为更大 Bitcoin 系统的一部分,bitcoin-key
crate 对于维护网络的安全性和完整性至关重要。将其翻译为 Rust 确保了整个系统的内存安全性和安全性。
67> 你能教我这些各种密钥是如何工作的吗?它们的数据布局是怎样的?
当然可以!在 Bitcoin 的背景下,有几种不同用途的密钥。以下是一个简要概述
-
私钥:这些是用于签署交易和证明比特币所有权的 256 位随机数。它们与公钥结合使用,以创建比特币网络可以验证的数字签名。私钥应保密,切勿共享。
-
公钥:这些是从私钥派生出来的,用于接收比特币。它们是33字节的数组(如果压缩)或65字节的数组(如果未压缩),通过在私钥上执行椭圆曲线乘法生成。公钥可以与他人共享,而不会危及私钥的安全性。
-
扩展密钥:这些是从私钥派生出来的,用于分层确定性(HD)钱包。它们包含额外的数据,如链码和深度级别,这使得可以创建一个类似树状结构的密钥。HD钱包可以用来从一个种子值生成大量公私钥对。
-
密钥来源信息:这是与私钥关联的附加元数据,它描述了在HD钱包结构中的来源。它包括深度级别和键在树中的索引等信息。
-
链码:这是与私钥结合使用来生成扩展密钥的256位数字。它们在密钥生成过程中添加了额外的随机性和安全性。
这些密钥的具体数据布局取决于使用的格式(例如,压缩与未压缩的公钥)。然而,它们通常以特定编码格式(如Base58Check)表示为字节数组。
68> 谢谢——我们能否更详细地讨论一下比特币中的私钥?
当然可以!在比特币的背景下,私钥是一个允许你花费与其对应公钥相关联的比特币的保密数字。更具体地说,私钥是一个使用加密算法随机生成的256位整数。
私钥用于生成数字签名,这本质上是一种数学证明,表明交易得到了私钥所有者的授权。没有私钥,就无法生成有效的数字签名,因此也就无法花费比特币。
私钥还用于推导公钥,公钥是secp256k1椭圆曲线上的一个点。然后使用公钥生成比特币地址,比特币地址是公钥的更简短表示,可以公开分享以接收比特币。
保持私钥的秘密和安全非常重要,因为任何获得它的人都可以花费与其相关的比特币。一种常见的安全存储私钥的方式是使用硬件钱包,它将私钥存储在物理设备上的安全区域内,该区域难以被攻破。
这有帮助吗?如果您有其他问题,请告诉我。
69> 谢谢!有!那么公钥呢?
公钥在公钥加密中用于加密消息和验证数字签名。在比特币的背景下,公钥以类似的方式使用。公钥是通过加密算法从私钥派生出来的。公钥用于生成比特币地址,用于接收比特币。
比特币使用一种特定的公钥加密,称为椭圆曲线加密(ECC)。ECC涉及使用特定的椭圆曲线来生成公钥和私钥。比特币使用secp256k1椭圆曲线来生成公钥和私钥。
在比特币中,公钥是一个由前缀、32字节的x坐标和32字节的y坐标组成的65字节数据结构。前缀是一个单字节,表示y坐标的符号。x和y坐标一起代表secp256k1椭圆曲线上的一个点,即公钥。
公钥用于生成比特币地址,它是比特币交易的目的地。要生成比特币地址,使用SHA-256和RIPEMD-160算法对公钥进行两次哈希,结果得到一个20字节的哈希,称为公钥哈希。然后将此哈希编码为base58check格式,以创建比特币地址。
总结来说,比特币中的公钥用于生成比特币地址并接收比特币交易。它们通过椭圆曲线密码学从私钥派生出来,是包含前缀和x-y坐标的65字节数据结构。
70> 谢谢!那关于扩展密钥呢?
扩展密钥,或称ExtKeys,是比特币和其他加密货币中使用的分层确定性密钥派生方案。它们基于BIP32标准,允许从单个主密钥派生出密钥层次结构。
主密钥用于派生链码,链码与索引结合产生子密钥。每个子密钥可以进一步用作主密钥以派生新的链码和子密钥。这种分层结构使得从单个根密钥创建多个地址和私钥变得容易,从而便于管理和备份大量地址。
扩展密钥可以是公钥或私钥。公钥扩展密钥从公钥派生出来,可用于生成一系列公钥,而私钥扩展密钥从私钥派生出来,可以生成公钥和私钥。
扩展密钥特别适用于钱包软件和多重签名交易等应用,因为它们允许创建一个从单个主密钥派生的密钥树,同时保持私钥的安全性。
71> 谢谢!那关于KeyOriginInformation呢?
KeyOriginInfo
是在比特币系统中使用的Rust结构体,其中包含有关特定密钥来源的信息。它包括密钥在密钥层次结构中的路径(也称为派生路径),以及父密钥的主指纹。
派生路径是一系列数字,指定了密钥是如何从其父密钥派生出来的。主指纹是父密钥公钥的哈希,用于唯一标识父密钥。
这些信息对于确定密钥的历史和所有权以及验证其真实性非常有用。在比特币中,KeyOriginInfo结构体通常与扩展密钥一起使用,以管理和跟踪系统中使用的密钥。
72> 谢谢!那关于ChainCodes呢?
在比特币中,链码是用于在分层确定性钱包中从父密钥派生子密钥过程中的32字节序列。
在BIP-0032规范中,该规范描述了分层确定性钱包的实现,链码被定义为256位整数,作为密钥层次结构中每个扩展密钥的附加私钥。链码与父密钥结合派生子密钥,并用于确保在不同设备和应用程序中从相同的父密钥派生相同的子密钥。
链码也在BIP-0039规范中使用,该规范描述了生成确定性钱包的助记词的实现。在这种情况下,链码用于确保相同的助记词生成相同的主密钥和相同的子密钥。
总的来说,链码是分层确定性钱包的重要组件,在确保私钥在不同设备和应用程序之间的安全和便携性方面发挥着至关重要的作用。
73> 太好了!关于比特币系统中的密钥还有其他信息吗?你能告诉我更多关于它们的信息吗?
在比特币系统中,密钥是确保网络安全和发送接收交易的关键组件。除了我们之前讨论的密钥之外,比特币系统还使用了其他几种密钥类型。
-
锁定脚本:这些是在比特币交易输出中使用的锁定脚本。它们通常是P2PKH(按公钥哈希支付)或P2SH(按脚本哈希支付)脚本。P2PKH脚本是一个简单的锁定脚本,要求接收者提供公钥和与公钥关联的私钥对应的签名。P2SH脚本更复杂,允许使用更高级的脚本语言。
-
赎回脚本:这些是在P2SH交易中使用的脚本,用于确定资金如何被支出。它们通常是多签名脚本,需要一组参与者中的一定数量的签名来支出资金。
-
脚本签名:这些是在比特币交易输入中使用的解锁脚本。它们通常是签名或赎回脚本,提供了在相应的ScriptPubKey中锁定资金所需的信息。
理解这些不同密钥类型及其相互关系对于任何使用比特币系统的人来说都很重要,无论他们是构建应用程序还是仅用于交易。
bitcoin-keymetadata
提供了KeyMetadata
结构体,用于在比特币系统中存储有关密钥的元数据。
KeyMetadata
结构体有一个默认实现和一个set_null
方法,用于将其设置为空状态。
虽然bitcoin-keymetadata
可能不涉及任何特定的数学方程或概念,但它通过提供关于密钥的必要元数据在整体比特币系统中发挥着重要作用。
您可以在Rust代码中使用KeyMetadata
结构体
use bitcoin_key::KeyMetadata;
let mut metadata = KeyMetadata::default();
metadata.set_null();
75>什么是密钥元数据?
在比特币系统的背景下,密钥元数据是与密钥关联的附加信息,例如其推导路径、来源信息以及其他用于在系统中跟踪和管理密钥的元数据。
密钥元数据很重要,因为它有助于提供有关密钥的额外背景信息,并允许用户更好地管理和跟踪他们的密钥。例如,密钥元数据可能包括有关特定密钥如何推导、属于谁以及如何使用的信息。这些信息可用于帮助防止对密钥的不授权访问,并帮助用户更轻松地管理他们的密钥集合。
在bitcoin-keymetadata
Rust库中,KeyMetadata
结构体表示密钥元数据信息,并提供了设置和检索这些信息的方法。set_null
方法可用于将密钥元数据设置为空值,而default
方法提供了KeyMetadata
结构的默认实例化。
76>我们通常想要跟踪哪些元数据?
在比特币的背景下,我们可能想要跟踪的一些关键元数据包括
-
推导路径:这是从根密钥到当前密钥的路径。
-
密钥指纹:这是密钥的唯一标识符,计算为公钥SHA-256散列的RIPEMD-160散列的前四个字节。
-
创建时间:这是密钥创建的时间。
-
使用类型:这表明密钥打算如何使用(例如,作为更改地址或接收地址)。
-
标签:这是用户定义的标签,可以分配给密钥以帮助组织和跟踪。
-
密钥状态:这表明密钥是活跃的还是非活跃的(例如,它是否已在任何交易中使用)。
-
脚本类型:这表明与密钥关联的脚本类型。
-
赎回脚本:这是必须满足的脚本,才能从与密钥关联的输出中赎回资金。
-
见证脚本:这是必须满足的脚本,以便从与密钥关联的segwit输出中赎回资金。
这些只是比特币系统中可能跟踪的元数据类型的一些示例,不同的应用程序可能会根据其具体需求跟踪不同类型的元数据。
77> 比特币系统中用于生成密钥的加密算法有哪些?
比特币系统主要使用椭圆曲线加密(ECC)算法来生成加密密钥。具体来说,它使用secp256k1椭圆曲线,该曲线由以下方程定义
y^2 = x^3 + 7
比特币使用这个曲线,通过ECDSA(椭圆曲线数字签名算法)算法来生成公钥和私钥对。ECDSA是一种基于有限域上椭圆曲线群的数学的数字签名算法,这使得它在像比特币这样的资源受限环境中非常适合使用。
此外,Schnorr签名算法也计划通过软分叉在未来添加到比特币中。这个算法基于与ECDSA相同的底层数学,但在效率和安全性方面提供了一些优势。
bitcoin-keypool
KeyPool
结构用于管理一组预生成的私钥池,可以根据需要生成新的比特币地址。serialize
和unserialize
函数用于序列化和反序列化密钥池数据以进行存储或传输。
虽然bitcoin-keypool
crate可能不涉及任何特定的数学方程或概念,但底层比特币系统依赖于SHA-256和ECDSA等加密算法来生成和签名交易。
请注意,这个crate仍在开发中,一些函数体可能没有完全实现或正常工作。
85> 我们如何使用比特币KeyPool?
在比特币系统中,KeyPool是一个存储在内存中的预生成的私钥池,可以用来创建新的比特币地址。
KeyPool通常由比特币钱包用于按需生成新的地址,而不需要每次都生成新的私钥。这有助于提高地址生成的效率和质量,因为生成新密钥可能是一个计算密集型的过程。
这个crate包括序列化和反序列化KeyPool的方法,以及从KeyPool生成新的私钥和比特币地址的方法。
86> 我们应该注意哪些问题?
使用KeyPool时要注意的一个重要问题是正确管理密钥池的大小。密钥池是用来接收比特币交易的预生成的密钥集。当密钥池耗尽时,必须生成新的密钥,这可能会导致接收新交易延迟。
如果密钥池太小,你会面临耗尽密钥并需要更频繁地生成密钥的风险,这可能导致处理交易延迟。另一方面,如果密钥池太大,可能会消耗不必要的资源。
另一个需要注意的问题是密钥池的安全性。由于密钥存储在磁盘上,它们可能容易受到盗窃或破坏。重要的是要正确保护存储密钥池的系统,并确保有适当的访问控制来保护密钥。
最后,重要的是要备份密钥池,以防硬件故障或其他可能导致密钥丢失的问题。
依赖关系
~89MB
~834K SLoC