IPFS的核心技术

煤油灯科技2022-06-07 10:28

IPFS是一个点对点(p2p)的存储网络。可以通过位于世界任何地方的对等点访问内容,这些对等点可能传递信息、存储信息或者两者兼有。IPFS知道如何通过其内容地址找到你要的内容,而不是位置。

关于IPFS,需要了解三个基本原则:

  • 通过内容寻址进行唯一标识
  • 通过有向无环图(DAG)进行内容链接
  • 通过分布式哈希表(DHT)进行内容发现

这三个原则共同建立实现了IPFS生态系统。我们从内容寻址和内容的唯一标识开始。

内容寻址

IPFS使用内容寻址根据内容而不是位置来标识内容。我们其实一直都在按内容查找项目。例如,当您在图书馆里寻找一本书时,经常按照书名来寻找——这是内容寻址,因为你在问它是什么。如果您使用位置寻址找到那本书,你会通过它的位置询问它:“我想要的书在二楼,第一组,倒数第三架,从左边算起的第四本书”。如果有人搬了那本书,那你就倒霉了!

互联网和计算机上都存在这个问题。当前都是按位置在找到内容,例如:

  • https://en.wikipedia.org/wiki/Aardvark
  • /Users/Alice/Documents/term_paper.doc
  • C:UsersJoeMy Documentsproject_sprint_presentation.ppt

相比之下,每一个使用IPFS协议的内容都有一个内容标识符,即CID,即其哈希值。散列对于其来源内容而言是唯一的,即使它与原始内容相比看起来可能很短。如果您不熟悉哈希,请查看哈希概念指南以获取介绍。

许多分布式系统都通过散列进行内容寻址,还可以将其链接在一起——已成为从分布式支持代码到运行加密货币的区块链一种广泛使用的方法。但是,这些系统中的底层数据结构不一定可以互操作。

这就是IPLD项目的用武之地。哈希标识内容,而IPLD在数据结构之间转换。允许跨分布式系统以不同的方式构造其数据,IPLD提供了用于组合可插入模块(每种可能类型的IPLD节点的解析器)的库,以解析多个链接节点之间的路径、选择器或查询,从而允许你探索数据而无需考虑底层协议。IPLD提供了一种在内容可寻址的数据结构之间进行转换的方法:“哦,你使用Git样式,不用担心,我可以关注这些链接。哦,您使用以太坊,我知道了,我也可以关注那些链接!”

IPFS对于如何将数据分解为DAG有其特定的数据结构偏好和约,IPFS 协议使用这些约定和IPLD将原始内容获取到唯一标识IPFS网络上的内容的IPFS地址。

IPFS生态系统中的其他所有内容都基于此核心概念:链接的可寻址内容是使其余工作正常进行的基本连接元素。

有向无环图(DAG)

IPFS和许多其他分布式系统利用了称为有向无环图或DAG的数据结构。具体来说,它们使用Merkle-DAG,其中每个节点都有一个唯一标识符,该标识符是节点内容的哈希值。听起来有点耳熟?这涉及到上一节中介绍的CID概念。换句话说:通过其哈希值识别数据对象(如Merkle-DAG节点)是内容寻址。(请查看有关Merkle-DAG的概念指南,以更深入地了解该主题。)

IPFS使用针对表示目录和文件而优化的Merkle-DAG,但是你可以通过许多不同的方式来构造Merkle-DAG。例如,Git使用Merkle-DAG,其中包含许多版本的存储库。

为了建立内容的Merkle-DAG表示,IPFS通常首先将其拆分为多个块。将其拆分为多个块意味着文件的不同部分可以有不同的来源,并且可以快速进行身份验证。(如果你曾经使用过BitTorrent,你可能已经注意到,下载文件时,BitTorrent可以同时从多个对等方获取文件;这是相同的想法。)

Merkle-DAG有点“全力以赴”。也就是说,所有内容都有CID。假设你有一个文件,它的CID标识了它。如果一个文件夹中有几个文件怎么办?这些文件也将具有CID,那个文件夹的CID呢?它将是来自下面文件(即文件夹的内容)的CID的哈希。反过来,这些文件由块组成,并且每个块都有一个CID。你可以看到计算机上的文件系统如何表示为DAG。希望你还可以看到Merkle-DAG图如何开始形成的。要直观地了解这个概念,请查看IPLD Explorer。

Merkle-DAG的另一个有用功能是将内容分成多个块,如果你有两个相似的文件,它们可以共享Merkle-DAG的部分内容。也就是说,不同Merkle-DAG的一部分可以引用相同的数据。例如,如果您更新网站,则只有更新的文件会收到新的内容地址。你的旧版本和新版本可以为其他所有内容引用相同的块。这可以使传输大型数据集的版本(例如基因组研究或天气数据)更加高效,因为你只需要传输新的或已更改的部分,而不必每次都创建全新的文件。

因此,总而言之,IPFS允许你为内容提供CID,并使用IPLD在Merkle-DAG中将内容链接在一起。现在,让我们继续讨论最后一部分:如何查找和移动内容。

分布式哈希表(DHT)

为了查找哪些对等方正在托管你要查找的内容(发现),IPFS使用分布式哈希表或DHT。哈希表是值键的数据库。分布式哈希表是在一个分布式网络中的所有对等方拆分的表。要查找内容,你需要询问这些同行。

libp2p项目是IPFS生态系统的一部分,并提供DHT,处理对等点之间的连接和对话。(请注意,与IPLD一样,libp2p也可以用作其他分布式系统的工具,而不仅仅是IPFS。)

一旦知道了内容的位置(即哪个或哪些对等方正在存储构成您所要访问的内容的每个块),就可以再次使用DHT 查找这些对等方的当前位置(路由)。因此,为了获得内容,您可以使用libp2p两次查询DHT。

一旦你知道你的内容在哪里,并且已经找到了该内容的当前位置。现在,你需要连接到该内容并获取它(交换)。为了向其他对等方请求块并向其他对等方发送块,IPFS目前使用一个名为Bitswap的模块。Bitswap允许你连接到具有所需内容的一个或多个对等节点,将其发送给你的需求列表(你感兴趣的所有块的列表),然后让他们向你发送你请求的块。一旦这些块到达,你可以通过对它们的内容进行哈希处理以获取CID,并将它们与你请求的CID进行比较。(如果需要,这些CID还允许删除重复数据块。)

还讨论了其他内容复制协议,其中最成熟的是Graphsync。还有一项提案正在讨论中,旨在扩展Bitswap协议以添加围绕请求和响应的功能。

SHA文件哈希值与内容ID不匹配

你可能习惯于通过匹配SHA散列值来验证文件的完整性,但SHA散列值与CID不匹配。因为IPFS将文件拆分为块,所以每个块都有自己的CID,包括任何父节点的单独CID。

DAG将存储在IPFS中的所有内容作为区块而不是文件来跟踪,并且Merkle DAG是自我验证的结构。要了解更多关于DAG的信息,请参阅有向无环图(DAG)。

关于当你试图将SHA哈希值与CIDs进行比较时会发生什么的详细例子,请参阅未哈希的内容标识符

libp2p

使libp2p点对点连接特别有用的是连接多路复用。传统上,系统中的每个服务都会打开一个不同的连接,以与相同类型的其他服务进行远程通信。使用IPFS,你只需要打开一个连接,然后在其上多路复用所有内容。对于你的同行需要互相讨论的所有内容,你发送每件事的一点点,而另一端知道如何对它们所属的这些块进行排序。

这很有用,因为连接通常很难建立并且维护成本很高。使用多路复用,一旦建立了连接,就可以在它上进行任何所需的操作。

一切都是模块化的

本次讨论中已经提到,IPFS生态系统由许多模块化库组成,这些库支持任何分布式系统的特定部分。您当然可以独立使用堆栈的任何部分,或以新颖的方式将它们组合在一起。

IPFS生态系统为内容提供CID,并通过生成IPLD Merkle DAG将内容链接在一起。你可以使用libp2p提供的DHT发现内容,并打开与该内容的任何提供程序的连接,然后使用多路复用连接下载它。所有这些都由堆栈的“中间”(链接的唯一标识符)连接在一起。这是构建IPFS的必要部分。


原文链接:https://docs.ipfs.io/concepts/how-ipfs-works/


---煤油灯科技victorlamp.com翻译整理---

你可能也喜欢这些文章

科技互联网,科技,资讯,动态,洞察,量子,计算,AI,人工智能,机器人,区块链,Web3,分布式,操作系统,OS,芯片,视频,深度,论文