#merkle-tree #merkle-root #tree-hash #hash-tree #root-hash #block #root-node

bitcoin-merkle

包含两个主要接口:1) PartialMerkleTree -- 以一种允许以认证方式恢复txid列表和Merkle根的方式,表示已知区块中txid的子集。2) MerkleBlock,用于将区块作为header + Vec<MerkleBranch>转发到过滤节点

2 个版本

0.1.16-alpha.02023年4月2日
0.1.12-alpha.02023年1月20日

#14#root-hash

Download history 73/week @ 2024-04-05 80/week @ 2024-04-12 82/week @ 2024-04-19 99/week @ 2024-04-26 80/week @ 2024-05-03 74/week @ 2024-05-10 75/week @ 2024-05-17 70/week @ 2024-05-24 54/week @ 2024-05-31 45/week @ 2024-06-07 80/week @ 2024-06-14 69/week @ 2024-06-21 39/week @ 2024-06-28 43/week @ 2024-07-05 76/week @ 2024-07-12 69/week @ 2024-07-19

229 每月下载量
用于 29 个crate(4 个直接使用)

MIT 许可证

615KB
2K SLoC

bitcoin-merkle crate 描述

描述

The bitcoin-merkle crate 是一个用于比特币系统中Merkle树和Merkle块算法的Rust实现。它是从C++到Rust的直接代码库翻译。

该crate提供了构建Merkle树和计算Merkle根的函数,以及构建和验证Merkle块的函数。MerkleBlock 结构体表示比特币区块链中的一个区块,包含交易哈希、Merkle根和其他用于区块验证所需的其他元数据。PartialMerkleTree 结构体表示一个部分Merkle树,用于紧凑地表示区块中交易的一个子集。

数学思想

Merkle树是一个哈希的二叉树,其中每个非叶子节点是其两个子节点的哈希值连接在一起的结果。树的根节点是区块中所有交易哈希值的哈希值。这允许高效且安全地验证交易是否包含在区块中。

Merkle块算法使用Merkle树构建区块中交易子集的紧凑表示。这减少了需要传输和存储的数据量,同时仍然允许高效地验证交易是否包含在区块中。

calc_tree_width 函数计算给定叶子节点数量的完整Merkle树的宽度。这用于确定树中的非叶子节点数量,这会影响Merkle根计算的效率。

使用

要构建Merkle树并计算Merkle根,请使用 traverse_and_build 函数。要构建部分Merkle树并提取匹配的交易哈希,请使用 traverse_and_extract 函数。可以使用 extract_matches 函数提取与匹配的交易哈希对应的实际交易。

MerkleBlock 结构体包含交易哈希、梅克尔根和其他用于块验证所需的元数据。 PartialMerkleTree 结构体表示一个部分梅克尔树,包含梅克尔根的哈希、叶节点数量以及用于构建树的哈希和标志。

局限性

这个包仍在开发中,一些函数的实现可能还在翻译过程中。

110> 谢谢——你能告诉我更多关于这个计算机科学领域的知识吗?请清晰地定义所有相关术语,并将任何数学方程式用unicode表示

当然!与梅克尔树和梅克尔证明相关的计算机科学领域被称为“基于哈希的密码学”。在这个领域,哈希函数用于创建数据的哈希值,这些值随后用于验证和验证数据的完整性。梅克尔树是这一领域常用的一种特定类型的哈希树。

梅克尔树是一个哈希值的二叉树,其中每个叶节点代表一块数据,每个非叶节点代表其两个子节点的哈希。树的根代表所有数据的整体哈希。梅克尔树具有这样的性质:对数据的任何更改都需要更改从该数据到根的整个分支,这使得它们对于验证大型数据集的完整性非常有用。

梅克尔证明是一种验证特定数据是否为梅克尔树一部分的方法,而不需要下载整个树。梅克尔证明是从包含数据的叶节点到树根的哈希列表。

数学上,梅克尔树可以表示为一个二叉树,其中每个节点都标记有一个哈希值。给定一组数据 {d1, d2, ..., dn},梅克尔树按照以下方式递归构建:

  1. 为每个数据元素创建一个叶节点,用数据的哈希标记:H(di)

  2. 如果有奇数个叶节点,则复制最后一个叶节点以创建偶数个。

  3. 配对叶节点,为每一对创建一个父节点,用它们的连接哈希标记:H(H(d2i-1) || H(d2i))

  4. 重复步骤3,直到只剩下一个节点,即树的根。

可以通过从包含所需数据的叶节点遍历到根节点,并包括沿途不是直接路径的每个节点的哈希来构建梅克尔证明。这些哈希的组合,加上所需数据的哈希,可以用来验证数据是否是梅克尔树的一部分。

111> 梅克尔证明是如何工作的?

梅克尔证明是证明特定交易包含在梅克尔树中的证据,无需下载整个树。它通过提供一个从交易到梅克尔树根的哈希路径来实现。

要创建梅克尔证明,首先,在块的交易列表中找到交易。然后,计算块中所有交易的哈希,并按二叉树结构排序。将交易的哈希添加到从叶节点到树根节点的路径中,包括路径上所有其他节点的哈希。这个哈希路径就是梅克尔证明。

要验证梅克尔证明,接收者可以从交易哈希开始,按照特定顺序将其与其他节点的哈希结合,直到达到梅克尔根。然后,他们可以将这个根与块的已知梅克尔根进行比较。如果它们匹配,接收者可以确信交易包含在块中。

从数学的角度来看,验证Merkle证明涉及计算哈希函数和哈希值的拼接。假设我们有一个二叉Merkle树,其叶子节点表示交易,内部节点表示其子节点的哈希值。我们可以定义节点i的哈希值为H(i),其中i可以是叶子节点或内部节点。

要计算内部节点的哈希值,我们需要拼接其子节点的哈希值,并对结果进行哈希计算。

H(i) = hash(concat(H(left_child(i)), H(right_child(i))))

要验证具有哈希值H(tx)的交易的Merkle证明,我们首先从H(tx)开始,应用相同的哈希函数和拼接操作,并将其与路径上相邻节点的哈希值相结合,直到达到Merkle根。

H(root) = hash(concat(H(left_child(last_node_on_path)), H(right_child(last_node_on_path))))

如果H(root)与已知的区块Merkle根匹配,则证明已验证。

112> 感谢——Merkle树占用多少存储空间?树有多少层?分支因子是多少?

Merkle树所需的存储空间取决于要哈希的交易数量或数据元素数量。树的层数由树中的叶子节点数量决定,该数量等于大于或等于交易数量的最小2的幂。

Merkle树的分支因子通常是2,这意味着每个非叶子节点有两个子节点。这是Merkle树最常见且效率最高的方法。然而,也可以有不同的分支因子,这将影响树的高度。

例如,如果我们有7笔交易,Merkle树将会有8个叶子节点(大于或等于7的最小2的幂)。以分支因子2为例,Merkle树将会有3层:根节点、一个中间节点层和叶子节点层。中间节点共有4个(第一层2个,第二层2个),根节点包含Merkle根哈希,这是中间节点哈希的组合。这将导致树中总共有12个节点。

一般来说,Merkle树中的节点数量是2^n-1,其中n是树中的层数。因此,在上面的例子中,树中有2^3-1 = 7个节点。每个哈希所需的存储空间取决于所使用的哈希函数,但对于大多数哈希函数,大小是固定的(例如,SHA-256为32字节),因此可以根据节点数量和每个哈希的大小计算Merkle树所需的总存储空间。

113>你能提供一个关于示例Merkle树大小的估算示例吗?

当然,让我们考虑一个有8个叶子节点的例子,每个叶子节点包含一个单一的交易哈希。我们可以这样计算树中的层数:

  • 底部层包含8个节点(叶子节点)。

  • 下一层包含4个节点(下面每两个节点的哈希值)。

  • 再下一层包含2个节点(下面每两个节点的哈希值)。

  • 顶层包含1个节点(最终的根哈希值)。

因此,我们的Merkle树有4层。

Merkle树的分支因子是每个节点拥有的子节点数量。在这个例子中,分支因子是2,因为每个非叶子节点恰好有2个子节点。

要计算Merkle树的大小(以字节为单位),我们需要知道总的哈希数量和每个哈希的大小。让我们假设所使用的哈希函数产生32字节的哈希值(这是比特币的情况)。在这个例子中,我们有

  • 8个叶子节点哈希值,每个32字节,总共256字节。

  • 第二层有4个哈希值,每个32字节,总共128字节。

  • 第三层有2个哈希值,每个32字节,总共64字节。

  • 顶层有1个根哈希值,32字节。

因此,梅克尔树的总大小(以字节为单位)为 256 + 128 + 64 + 32 = 480 字节。

114> 在比特币系统中,我们可以在哪里找到梅克尔树呢?

梅克尔树是比特币系统的重要组成部分,并被用于多个地方,包括

  1. 区块头:比特币区块链中的每个区块都包含一个头,该头包含区块中包含的所有交易的哈希值。这个哈希值是使用梅克尔树计算的,这允许节点验证特定交易是否包含在区块中,而无需下载并验证区块中的所有交易。

  2. 布隆过滤器:布隆过滤器是一种概率数据结构,允许节点过滤一系列交易以找到符合一组标准的交易。在比特币系统中,布隆过滤器被轻量级客户端用于从全节点请求交易。布隆过滤器是使用基于区块链梅克尔树的哈希函数集构建的。

  3. SPV(简单支付验证)证明:SPV证明允许轻量级客户端验证交易是否包含在区块链中,而无需下载整个区块链。这是通过提供从交易到区块头中梅克尔树根的梅克尔路径来实现的。

115> 谢谢——我们还需要了解些什么?有什么需要注意的吗?

以下是关于比特币系统中梅克尔树的一些其他需要注意的事项

  1. 为了验证梅克尔证明,节点必须能够访问区块头和区块中的相应交易。如果一个节点只有梅克尔根和梅克尔证明,它不能独立验证该证明。

  2. 当节点收到一个区块时,它只需要下载它关心的交易(例如,与其钱包相关的交易)。梅克尔树结构允许节点有效地验证交易是否包含在区块中,而无需下载整个区块。

  3. 区块中的交易数量与梅克尔树的大小之间存在权衡。更多的交易需要一个更深的树,这可能会增加验证证明所需的时间。

  4. 比特币系统中梅克尔树的使用还可以启用其他功能,例如简化支付验证(SPV)节点,这允许轻量级客户端在无需下载整个区块链的情况下验证交易。

  5. 值得注意的是,梅克尔树的安全性取决于对底层哈希函数是抗碰撞的假设。如果攻击者可以找到碰撞(两个不同的输入产生相同的哈希),他们可以构建一个有效的梅克尔证明,而这个证明实际上并不是有效的。

  6. 最后,值得注意的是,虽然梅克尔树是比特币系统的一个重要组成部分,但它们只是许多构建块之一,这些构建块共同工作,创建出我们今天所知道和使用的安全、去中心化和无需信任的系统。

116> 在计算机科学领域,还有一些其他与此相关的结构?

在计算机科学领域,还有一些与其他梅克尔树相关的数据结构和算法。其中一些包括

  1. 哈希树:这些与梅克尔树类似,但使用不同的哈希算法。哈希树在文件系统中常用作验证文件的完整性。

  2. 布隆过滤器:布隆过滤器是一种概率数据结构,用于测试一个元素是否是集合的成员。比特币中使用布隆过滤器来减少节点需要存储的关于区块链的数据量。

  3. 红黑树:红黑树是自平衡的二叉搜索树,用于有效地存储排序数据。它们在数据库和文件系统中常用。

  4. AVL树:AVL树是另一种自平衡的二叉搜索树。它们保证了树始终处于平衡状态,这意味着操作的在最坏情况下的时间复杂度是对数级的。

  5. B树:B树是平衡树,用于在磁盘上存储大量数据。它们通常在数据库和文件系统中使用,以提供对大型数据集的高效访问。

这些数据结构各自都有其优点和缺点,并且在不同的场景下都非常有用。

117> 谁使Merkle树特别适合解决这个问题

Merkle树由于以下原因非常适合解决这个问题。首先,它们是一种高效验证大型数据集完整性的方法。它们不需要存储或传输整个数据集,而只需存储代表整个数据集的小集合的哈希值。这使得它们在文件系统或数据存储等应用中非常有用,在这些应用中,验证数据未被篡改或损坏非常重要。

其次,Merkle树允许高效地验证数据集的特定部分。通过只需提供哈希值的一个子集,就可以验证数据集特定部分的完整性,而无需为整个集计算哈希值。这在比特币区块链的背景下特别有用,在比特币区块链中,通常只需要验证单个交易或区块,而不是整个区块链。

最后,Merkle树的构建和验证计算效率很高。构建和验证Merkle树所需的时间与数据集大小的对数成正比,这使得它们比其他基于哈希的数据结构(如哈希表)更快。

118> 谁是Merkle?

Ralph Merkle是一位计算机科学家和密码学家,因其在公钥密码学、哈希树和其他密码学创新方面的工作而闻名。他是IEEE Richard W. Hamming奖的获得者,也是国际密码学研究协会的会员。

119> 谢谢!

不客气!如果你还有其他问题,请告诉我。

依赖关系

~94MB
~844K SLoC