IPFS 去中心化数据结构

去中心化的网络依赖于独特的数据结构和链接策略。 本章介绍散列的优势,内容寻址,DAG和Merkle树!

Lesson 1 数据结构

欢迎来到协议学院!

在深入探讨代码挑战之前,让我们花一点时间来看一下去中心化网络的一些概念。 与我们的其他教程不同,这个教程是免代码的,专门为您介绍一些您将在整个ProtoSchool中遇到的关键术语。

让我们开始吧!

什么是数据结构?

无论您是否是程序员,您每天都被数据结构所包围。 列表,词典和目录都有助于我们组织信息并考虑各种数据之间的关系。

来自维基百科:

在计算机科学中,数据结构是一种数据组织,管理和存储格式,可以实现高效的访问和修改。 更确切地说,数据结构是数据值的集合,数据之间的关系,以及可以应用于数据的功能或操作。

在编程中,数据结构无处不在。 将数据组织成程序中可用的变量的过程中,会涉及数十到数百万个数据结构。 如果您是开发人员,您可能熟悉常见的数据结构,如数组,对象,图形等。

去中心化数据结构

在去中心化网络上,我们直接从我们的节点访问数据而不是从中心化机构,我们需要专门的数据结构,以便我们验证和链接各种内容。

通过去中心化系统共享的数据结构,需要是可验证的。 在诸如你自己的笔记本电脑之类的单个系统上,你对运行在内存或磁盘上的数据结构有最大程度的信任度。 但是在去中心化系统中,节点之间的信任度较低,甚至可能为零。

为了实现去中心化,大型数据的数据结构不但需要能够拆分并存储到多个节点中,并且能够从多个节点中重新将数据链接在一起。 同样,任何网页可以链接到另一个不同位置的网页,去中心化的数据结构实现了互连数据网络。

Lesson 2 位置寻址和中心化网络

在我们深入研究分散式网络上的共享工作方式之前,让我们花一点时间来研究一下我们通常是如何访问数据的。

使用URLs进行位置寻址

URLs(统一资源定位符)是我们通过中心化网站传递数据的主要方式(我们对这种普通的老式网页都习以为常了)。 这种访问方式使我们在网络上创建链接和获取数据成为可能,因此它们有助于实现有价值的目的。 (没有链接,网络会非常糟糕!)但是,URLs是基于存储数据的位置实现的,而不是基于存储在那里的资源的内容。 我们称这个为位置寻址,它给我们带来了一些问题。

我们大多数人都有很多使用URLs的经验,我们根据我们的经验对它们做了一些假设。 例如,当我们看到https://www.puppies.com/beagle.jpg时,我们可能会从文件名和扩展名猜测存储在该位置的数据是小猎狗的图像(JPEG格式), 但是我们无法仅通过URL验证这一点。 很可能有一张藏在beagle.jpg的吉娃娃的照片,甚至更糟糕的是,一只可爱的小猫!

通过域名,URLs表明了我们所要访问的数据的所有权。 尽管从某种意义上来说Web已经实现了去中心化(因为任何人都可以链接到其他任何人),但是由于引用数据的链接是基于位置的,因此数据本身必须集中在权限上才能让我们找到它。 我们对这些权限(或域)做出假设,就像我们对文件名一样。 例如,我们可能会认为在puppies.com上托管的文件比在evilhacker.com上托管的文件更安全,但我们无法确定它。

最终导致了托管在中心化Web上的文件内容与其基于位置检索的地址没有直接关系。 如果我们看到一张可爱的小狗的照片并被告知它存储在网络上,我们是无法猜出指向图片的网址的。 我们既不能确定是谁托管的域名,也不能确定文件名。

中心化Web上的信任和效率

由于我们无法验证那些特定的URL里的内容,并且是基于中心化权力(出于善意)来标记内容,因此我们很容易被恶意行为者欺骗。

约有42,000人很容易存储与可爱的小猎犬完全相同的照片,但所有这些照片都存放在不同的域和不同的文件名中,从而导致大量冗余。 事实是,即使在我们自己的笔记本电脑上,我们大多数人都不经意的保存了相同的文件,如download.pdf和download(01).pdf,或者给标题加上v1或2018-12-18一遍又一遍地保存相同学期论文。 网络上的数据则更混乱,相同文件在不同的URLs上多次保存,并且没有容易的方法来判断哪些项目彼此相同。

一定有更好的解决办法!

Lesson 3 使用加密哈希进行内容寻址

众所周知,中心化web依赖于值得信赖的权威来托管我们的数据并使用基于位置的URLs来访问它。 但还有另一种选择。 在去中心化的网络上,我们都能使用更安全的不同类型的链接,来托管彼此的数据,从而轻松地信任我们的邻居。

加密哈希

加密哈希是去中心化数据结构工具箱中最重要的工具。 它打开了一种新的链接形式的大门,称为内容寻址,使我们摆脱对中心化权威的依赖。

Hashing可将任何大小和类型的数据,处理成一个表示它的固定大小的“哈希”。 哈希是一串看起来像gobbledygook的字符,但您可以将其视为数据的唯一名称。 它可能看起来像这样:

zdpuAsHkamdCQgrDrNSwJVgjMkQWoLxdrccxV6qe9htipNein

说实话,这些名字目前对人类来说并不友好(beagle.jpg更具描述性!),但它们更加安全。 原因如下:

加密哈希值可以从数据本身的内容中导出,这意味着在相同数据上使用相同算法的任何人都将得到相同的哈希值。 如果Ada和Grace都使用相同的去中心化Web协议(例如IPFS)来共享完全相同的小猫照片,则两个图像将具有完全相同的哈希值。 通过比较这些哈希值并确认它们是相同的,我们可以保证这两张照片中的每个像素都是相同的。

加密哈希是独一无二的。 如果Grace使用Photoshop将猫咪的一根胡须抹掉,则更新后的图像将具有新的哈希值。 只需查看该哈希,即使无法访问文件本身,也很容易判断该文件现在包含不同的数据。

可信的去中心化网络

在中心化的网络上,我们学会了信任某些权威,而不是其他的。 我们用尽全力在URLs上寻找相关线索,但有些恶意网站使用位置寻址的缺点来欺骗我们。

然而,在去中心化的网络上,我们都互相发送并托管彼此的数据,而内容寻址使我们能够信任共享的信息。 我们可能不太了解托管数据的节点,但哈希可以防止恶意节点在文件内容上欺骗我们。 这就是使加密哈希对去中心化网络如此重要的原因。

向节点请求内容

基于传统的位置寻址,我们需要通过访问域名puppies.com来查找存储为beagle.jpg的内容。 如果puppies.com域由于某种原因被破坏,我们将无法访问该图像。

去中心化网络的工作方式不同。 当我们想要一张独特的可爱宠物照片时,我们会通过其内容地址(哈希)来询问它。 询问谁? 整个网络! 如果Ada在线,我们会看到她有我们正在寻找的内容,我们会知道它正是我们需要的文件,因为它有一个匹配的哈希。 如果她下线,我们仍然可以从Grace或其他节点那里获得相同的照片。

由于我们使用哈希来在去中心化的Web上请求数据,因此我们可以将哈希视为链接,而不仅仅是名称。

Lesson 4 内容标识符(CID)

到目前为止,我们讨论可爱的图像只是为了好玩,但是内容寻址可以用于所有不同类型的文件和数据,从JSON对象到学期论文到视频。 要使加密哈希工作,我们需要知道我们正在使用哪种数据格式并使用适当的工具。

解码数据结构

CID(内容标识符)是在去中心化网络上使用的特定形式的内容寻址。 它是为IPFS(我们将在后面的教程中讨论的去中心化网络协议)开发的,但具有非常广泛的含义。

CID是包含加密哈希和“编解码器”的唯一标识符,“编解码器”包含有关如何解析该数据的信息。 编解码器对某些格式的数据进行编码和解码。

+-------+------------------------------+
| Codec | Multihash |
+-------+------------------------------+

许多数据格式和协议已经在使用内容寻址。 像Git这样的工具和像以太坊和比特币这样的协议都在其中,但它们在如何解析数据以及它们用于哈希的加密函数方法方面有所不同。 CID允许我们为任何这些系统创建通用身份ID。

每个CID都是一个身份ID,其中包含用于解释数据的编解码器和一个自描述的哈希复合哈希(创建数据使用的是哪种哈希方法)。

+----------------------- ------+
| Codec |
+-------------------------------+
| |
| Multihash |
| +-----------+---------------+ |
| |Hash Type | Hash Value | |
| +------------+--------------+ |
| |
+------------------------------+

链接不同的数据结构

CID允许我们将完全不同格式的数据结构链接起来,从而构造成新的数据结构。 想象一下,一个JSON对象树链接到BSON对象,这些对象也能链接到git提交。 (或者想象一个包含小狗图像和小猫视频的目录,其子目录包含长颈鹿上的文章。可能性是无穷无尽的!)在这棵树下,我们有一个加密哈希,允许我们分发和链接数据。

为什么在不同的数据结构之间建立链接很重要? 每天在中心化网络上,我们将文本链接到图像,从徽标链接到主页,从电子邮件链接到PDF。 链接将资源联系在一起,传递意义,并使网站有更好的互动体验!

Lesson 5 Merkle树和有向无环图(DAG)

正如我们所讨论的,分布式Web依赖于链接的数据结构。 让我们来探索一下它们的样子。

Merkle树

Merkle树(或简称“哈希树”)是将每个节点都哈希的数据结构。


merkle_tree.jpeg

在Merkle树中,节点通过其内容地址(哈希)指向其他节点。 (请记住,当我们通过加密哈希运行数据时,我们会得到一个“哈希”或“内容地址”,我们可以将其视为链接,因此Merkle树是链接节点的集合。)

如前所述,所有内容地址对于它们所代表的数据都是唯一的。在上图中,节点E包含对节点F和节点G的哈希引用。这意味着节点E的内容地址(哈希)对于包含这些地址的节点是唯一的。

让我们把它想象成一组目录或文件夹。如果我们通过哈希算法运行目录E,同时它包含子目录F和G,我们得到的内容派生哈希将包括对这两个目录的引用。如果我们删除目录G,那就像Grace从她的小猫照片中删除那个胡须。目录E不再具有相同的内容,因此它获得了新的哈希值。

在构建上面的树时,根节点的最终内容地址(哈希)对于包含该树一直向下的每个节点的树是唯一的。如果任意节点中的数据即使只改变一个字节,则该节点的哈希将改变,其所有父节点的哈希也将改变。

你必须意识到,作为程序员,你将始终需要向后构建这些数据结构,从叶子节点到根节点。

有向无环图(DAG)

DAG.jpeg

DAG是“Directed Acyclic Graph”的首字母缩写。 这是一种描述特定类型的Merkle树(哈希树)的奇特方式,其中树中的不同分支可以单向向前指向树中的其他分支,如上图所示。

资料

探索更多学习资料

协议学院 上海分院 翻译
原文链接

你可能感兴趣的:(IPFS 去中心化数据结构)