http://www.xiaoyenzi.com

IPFS的工作原理

IPFS是点对点(p2p)存储网络。内容可以通过可能传递信息或存储(或同时执行)的对等方访问,并且这些对等方可以位于世界的任何地方。IPFS知道如何通过其内容地址找到您要求的内容,而不是它的位置。

有关IPFS的三个重要事项需要了解

让我们首先看看内容寻址以及内容如何链接在一起。IPFS堆栈的这个“中间”部分将生态系统连接在一起; 一切都建立在能够通过链接的唯一标识符查找内容的基础上。

1.内容寻址和链接数据

IPFS使用内容寻址来识别内容,而不是它所在的位置。按内容查找项目是您已经一直在做的事情。例如,当您在图书馆中查找图书时,您经常会通过标题提问; 这是内容寻址,因为你问的它是什么。如果您在使用位置寻址,找到那本书,你会问它通过在那里它是:“我想要的书那是在二楼,第一组,倒数第三架,左四周书”。如果有人搬了那本书,你运气不好!
它在互联网和您的计算机上都是一样的。现在,内容是按位置找到的,例如......
  • https://en.wikipedia.org/wiki/Aardvark
  • /Users/Alice/Documents/term_paper.doc
  • C:\Users\Joe\My Documents\project_sprint_presentation.ppt
通过包含,使用IPFS协议的每个内容都具有内容标识符或CID,即其哈希值。哈希对于它来自的内容是唯一的,即使它与原始内容相比可能看起来很短。如果哈希对你来说是新的,请查看哈希的概念指南以获得介绍。
通过哈希进行内容寻址已经成为一种广泛使用的连接分布式系统数据的方法,从提交代码的提交到运行加密货币的区块链。但是,这些系统中的基础数据结构不一定是可互操作的。
这就是IPLD项目的用武之地。哈希标识内容,IPLD在数据结构之间进行转换。由于不同的分布式系统以不同的方式构建其数据,因此IPLD提供了用于组合可插入模块(每种可能类型的IPLD节点的解析器)的库,以解析跨多个链接节点的路径,选择器或查询(允许您探索数据而不管底层协议)。IPLD提供了一种在内容可寻址数据结构之间进行转换的方法:“哦,你使用Git风格,不用担心,我可以关注这些链接。哦,你使用以太坊,我找到了你,我也可以关注这些链接!“
IPFS协议使用IPLD从原始内容到IPFS地址。IPFS有自己的偏好和约定,关于如何将数据分解为DAG(更多关于下面的DAG!); IPLD使用这些约定将IPFS网络上的内容链接在一起。
IPFS生态系统中的其他所有内容都建立在这个核心概念之上:链接的,可寻址的内容是使其余内容工作的基本连接元素。

2. IPFS将文件转换为DAG

IPFS和许多其他分布式系统利用称为有向非循环图或DAG 的数据结构。具体来说,它们使用Merkle-DAG,它们是DAG,其中每个节点都有一个标识符,该标识符是节点内容的散列。听起来有点熟?这回顾了我们在上一节中介绍的CID概念。查看此CID链接数据概念的另一种方法是:通过其散列值识别数据对象(如Merkle-DAG节点)是内容寻址(查看关于Merkle-DAG的概念指南,以更深入地处理该主题。)
IPFS使用专为表示目录和文件而优化的Merkle-DAG,但您可以通过多种不同方式构建Merkle-DAG。例如,Git使用Merkle-DAG,里面有许多版本的repo。
要构建内容的Merkle-DAG表示,IPFS通常首先将其拆分为。将其拆分为块意味着文件的不同部分可以来自不同的源,并且可以快速进行身份验证。(如果您曾经使用过BitTorrent,您可能已经注意到,当您下载文件时,BitTorrent可以同时从多个对等端获取它;这是相同的想法。)
Merkle-DAGs有点像“乌龟一直向下”的情景; 也就是说,一切都有CID。你有一个有CID的文件。如果文件夹中有多个文件怎么办?该文件夹有一个CID,该CID包含下面文件的CID。反过来,这些文件由块组成,每个块都有一个CID。您可以看到计算机上的文件系统如何表示为DAG。您还可以看到Merkle-DAG图表如何开始形成。有关此概念的直观探索,请查看我们的IPLD Explorer。
Merkle-DAG的另一个有用功能是将块内容分解为块,如果你有两个相似的文件,它们可以共享部分Merkle-DAG; 即,不同Merkle-DAG的部分可以引用相同的数据。例如,如果您更新网站,则只有更改的文件才会获得新的内容地址。您的旧版本和新版本可以引用相同的块来表示其他所有内容。这可以使大型数据集(例如基因组学研究或天气数据)的转移版本更加高效,因为您只需要传输新的或已更改的部分,而不是每次都创建全新的文件。

3. DHT

因此,回顾一下,IPFS允许您为内容提供CID,并使用IPLD在Merkle-DAG中将这些内容链接在一起。现在让我们继续讨论最后一部分:如何查找和移动内容。
要查找哪些对等方正在托管您正在访问的内容(发现),IPFS将使用分布式哈希表或DHT。哈希表是值的键的数据库。甲分布式哈希表是其中所述表在所有的对等体在一个分布式网络分割。要查找内容,请问这些同行。
该libp2p项目是IPFS生态系统提供了DHT和处理连接,并互相交谈同行的一部分。(请注意,与IPLD一样,libp2p也可以用作其他分布式系统的工具,而不仅仅是IPFS。)
一旦你知道你的内容在哪里(即,哪个对等体或同伴存储构成你所追求的内容的每个块),你再次使用DHT 来找到这些对等体的当前位置(路由)。因此,为了获取内容,您使用libp2p来查询DHT两次。
您已经发现了自己的内容,并且找到了该内容的当前位置 - 现在您需要连接到该内容并获取(交换)。要从其他对等体请求块和发送块,IPFS当前使用名为Bitswap的模块。Bitswap允许您连接到具有您想要的内容的同行或同伴,向他们发送您的需求列表(您感兴趣的所有块的列表),并让他们向您发送您请求的块。一旦这些块到达,您可以通过散列其内容来验证它们以获得CID。(如果需要,这些CID还允许您重复删除块。)
还有其他内容复制协议正在讨论中,其中最发达的是Graphsync。还有一项正在讨论的提案是扩展Bitswap协议以增加请求和响应的功能。

关于libp2p的说明

libp2p对点对等连接特别有用的是连接多路复用。传统上,系统中的每个服务都会打开一个不同的连接,以便与同类的其他服务进行远程通信。使用IPFS,您只需打开一个连接,然后在其上复用所有内容。对于你的同伴需要彼此交谈的一切,你会发送一些东西,而另一端知道如何对他们所属的那些块进行排序。
这很有用,因为建立连接通常很难设置并且维护成本很高。通过多路复用,一旦您拥有该连接,您就可以随心所欲地做任何事情。

一切都是模块化的

正如您在本次讨论中所注意到的那样,IPFS生态系统由许多支持任何分布式系统特定部分的模块化库组成。你当然可以独立使用堆栈的任何部分,或者以新颖的方式组合它们。

摘要

IPFS生态系统为内容提供CID,并通过生成IPLD-Merkle-DAG将内容链接在一起。您可以使用libp2p提供的DHT发现内容,并打开与该内容的任何提供商的连接,并使用多路复用连接下载该内容。所有这些都由堆栈的“中间”保持在一起,这是链接的唯一标识符; 这是IPFS建立的重要部分。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。