🧩 介绍Merkle DAG

在计算机中表示图时,我们不能像手绘一样随意画箭头,而是必须通过提供节点和边的具体表示来编码我们的数据结构。内容标识符(CID)可以唯一识别节点,因此我们可以用它们来表示从一个节点到另一个节点的边。通过这种方式,我们创建了一种特殊类型的有向无环图(DAG),称为Merkle DAG,以此向首位描述这种结构的研究者致敬。

📁 构建Merkle DAG的第一步

让我们以文件目录为例,看看如何构建Merkle DAG。第一步是对我们图形的叶节点进行编码——在这个例子中就是我们的图像文件,并为每个文件分配一个CID。

我们可以简化这些节点的表示,仅使用两个属性:文件名和对应于文件内容的数据。这些属性捆绑在一起,构成了节点的数据。节点的上方会有一个简化的标签,表示通过将节点数据传递给加密哈希算法而得出的唯一CID。需要注意的是,这个标签不是节点本身的一部分。

🌳 创建叶节点

我们可以首先为我们的层次结构中的每个文件创建叶节点,并为每个节点标记上其唯一的CID。这些叶节点就是我们图的基础,提供了Merkle DAG的根基。

接下来,我们需要创建中间节点,即层次结构中的子目录。每个子目录节点也会包含一个名称,表示目录的名称;然而,目录节点的“内容”是它所包含的文件和目录的列表,而不是任何特定文件的内容。我们可以将其表示为一个CID列表,每个CID都链接到图中的另一个节点。这些数据连同目录名称构成了这些节点的数据,我们可以从中再次推导出一个CID。

📊 DAG结构的层次性

一旦我们为图中的两种类型的节点推导出了表示方法,我们就可以从底部开始继续构建图。在Merkle DAG中,每个节点的CID依赖于其所有子节点;如果任何一个子节点不同,其CID也会随之改变。例如,如果一张虎斑猫的图片被编辑过,那么它在图中的节点将获得一个不同的CID。由于子节点的CID是父节点数据的一部分,父节点(在这个例子中是“cats”目录)也会随之改变,导致它获得一个新的CID。因此,构建Merkle DAG的过程始终是从底部向上进行:父节点无法创建,直到其子节点的CID被确定。

一般来说,Merkle DAG中任何节点的更改都会传递到所有变化节点的祖先。然而,在DAG的其他分支中所做的更改不会影响其他分支中节点的CID;节点的CID只会因其自身数据或子节点数据的变化而改变。例如,更改“blowfish.png”不会导致节点 baf…1、baf…2、baf…4、baf…5 或 baf…7 发生变化。

🔒 安全性保障

需要注意的是,由于节点嵌入其子节点的CID,因此由这些节点构成的结构必然不能包含环路。用于CID构建的加密函数使得通过图描述“自我引用”路径变得不可能。这是一个重要的安全保障:如果我们遍历Merkle DAG,我们可以确保不会陷入无限循环。

现在我们已经了解了如何使用CID创建结构化数据,让我们进一步探讨Merkle DAG的一些特性和我们可以依赖的优势!


参考文献

  1. ProtoSchool. (n.d.). IPLD Tutorial | Merkle DAGs: Structuring Data for the Distributed Web (Lesson 4).
  2. Protocol Labs. (n.d.). Overview of IPFS and Filecoin.

通过学习Merkle DAG的构建过程,我们不仅掌握了数据结构的创建方法,还为将来的去中心化网络应用打下了坚实的基础。让我们继续深入探索更多内容!

0 0 投票数
Article Rating
订阅评论
提醒
0 评论
最多投票
最新 最旧
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x