How IPFS works(翻译)

IPFS是一个点对点的存储网络。(文件&数据)内容可通过世界上任何对等节点访问,这些对等节点可以作为中继节点、存储节点或两者兼而有之。IPFS网络通过内容寻址而不是通过地址寻址。
要理解IPFS网络,有以下三个原则:

  1. 通过内容寻址进行唯一标识
  2. 通过有向无环图(DAG)链接内容
  3. 通过分布式哈希表(DHT)发现内容
    这三项原则相辅相成,建立起了IPFS生态网络的基础。让我们从内容寻址和内容的唯一标识开始来进一步认识IPFS网络。

内容寻址

IPFS通过内容寻址来识别内容,而不是通过内容所在的位置进行标识。其实我们一直以来都在做类似的事情(按照内容来查找项目)。例如,当您在图书馆查找书籍时,您经常按书名来查找,这就类似于内容寻址,因为您知道您寻找的是什么内容。如果您按照位置去寻找您要找的书,您可能会这样找:“这本书在图书馆二楼,第一排第二层第四本”。如果有人从这个地方拿走了这本书(或者移动了位置),哈哈,不好意思,那么你就不走运了!

通过位置寻址这种方式普遍存在于目前的互联网和计算机系统中,方式如下所示:

  • https://en.wikipedia.org/wiki/Aardvark
  • /Users/Alice/Documents/term_paper.doc
  • C:\Users\Joe\My Documents\project_sprint_presentation.ppt

相比之下,使用IPFS协议,每个(文件)内容都有一个内容标识符,也就是我们常说的哈希值。每一个(文件)内容都有唯一的哈希值,即使他看起来比原始内容短了好多。如果你还不太熟悉哈希相关内容,请查看哈希加密指南

很多分布式系统都利用通过哈希计算来处理相关的内容,以此作为一种内容寻址手段,不仅可以识别内容,还可以将数据链接在一起–从支持代码提交到运行加密货币的区块链,所有这些都用到了这一策略。但是,这些系统中的基础数据并不一定都可以相互交互。

这就是星际链数据项目(IPLD)出现的背景。IPLD在哈希链接的数据结构之间进行转换,允许跨分布式系统统一数据。IPLD 提供了用于组合可插拔模块(每种可能类型的 IPLD 节点的解析器)的库,以跨多个链接节点解析路径、选择器或查询(允许您查看数据,而不需要考虑基础协议)。IPLD 提供了一种在内容可寻址数据结构之间进行转换的方法:“,你用Git风格的数据,不用担心,我可以支持这些数据链接方式。哦,你用以太坊数据,没问题,我也照样支持!”

IPFS遵循特定的数据结构选项和约束。IPFS 协议使用这些约定和 IPLD 从原始内容 到IPFS 地址,该地址是IPFS网络上内容的唯一标识符。接下来将探讨如何通过 DAG 数据结构将内容之间的链接嵌入到IPFS网上对应的内容地址中。

有向无环图(DAGs)

IPFS 和许多其他分布式系统都用到了称为有向循无环图或 DGs 的数据结构。具体来说,它们使用了 Merkle DAG,其中每个节点都有一个唯一标识符,该标识符是节点内容的哈希。哈哈,听起来是不是很熟悉呢?这还引用了我们在上一节中介绍的 CID 概念。换句话说:按哈希值标识数据对象(如 Merkle DAG 节点)就是内容寻址。请查看Merkle DAG 指南,对该主题会有深入理解。

IPFS 使用经过优化的 Merkle DAG 来表示目录和文件,但您可以通过许多不同的方式构建 Merkle DAG。比如,Git 就使用了具有多个版本的存储库的 Merkle DAG。

若要用Merkle DAG 来构建你的文件内容,IPFS 通常会先将这部分内容拆分为块。将文件内容拆分为块意味着文件的不同部分可能有不同的来源并可以快速进行身份验证(如果您曾经使用过 BitTorrent,您可能已经注意到,当您下载文件时,BitTorrent 可以同时从多个节点获取内容;这些都是相同的思想)。

假设您有一个文件,CID 可以标识该文件。如果该文件位于包含多个其他文件的文件夹中,该怎么办呢?其实每个文件都有CID,文件夹的CID是所有文件(即文件夹的内容)的 CID 的哈希值。可以说,这些文件由块组成,并且每个块都有一个CID。您可以看到计算机上的文件系统如何表示为 DAG。如果想知道Merkle DAG是如何建立的。要直观地探索这个概念,请查看 IPLD 相关内容

Merkle DAG 将数据分解为块的一个非常有用功能是,如果您有两个类似的文件,它们可以共享 Merkle DAG 的某些部分,即不同 Merkle DAG 的某些部分可以引用相同的数据子集。例如,如果您要更新网站,只有更新过的文件才会有新的内容地址,其他没有改变的内容,新版本和旧版本引用同样的块就可以。这可以使大数据集的版本更新(如基因组学研究或天气数据)更有效率,因为您只需传输更新新部分,而不是每次都创建全新的文件。

回顾上述内容,我们可以知道,IPFS 允许您用CID 表示数据内容,并将数据链接在 Merkle DAG 中。接下来,我们继续讨论最后一部分内容:如何查找和移动数据。

分布式哈希表(DHTs)

IPFS使用分布式哈希表来寻找网络中存储数据的节点。哈希表可以理解为一个表示键值对的数据库,分布式哈希表是该表在分布式网络中的所有节点之间拆分的表,通过这些节点来查找内容。

libp2p 项目是 IPFS 生态系统的一部分,它提供 DHT 并处理节点间的相互连接和数据传输(请注意,与 IPLD 一样libp2p也是一个单独的项目,可以用作其他分布式系统的第三方库,而不仅仅是 IPFS)。

如果知道文件内容的存储位置(或者更确切地说,哪些节点存储文件内容拆分后的块),就可以使用 DHT 来查找这些节点的当前位置(路由功能)。因此,为了获取需要的内容,可以使用 libp2p 查询 DHT 两次。

现在,您已经找到对应数据在网络中的位置,您需要连接到对应节点并获取(交换)该数据。要请求其他节点发送块数据,IPFS 当前使用名为 Bitswap
的模块。Bitswap 允许当前节点连接到存储所需数据的网络节点,向他们发送请求列表(您感兴趣的所有块的列表),并让他们向当前节点发送请求的块数据。当前节点接收到这些块数据后,可以对块数据做哈希运算来进一步验证数据的正确性,对计算出的CID和请求的CID进行比较即可。如果需要,这些 CID 还允许您取消重复的数据块。

目前,还有一些其他的内容复制协议正在讨论之中,其中进展较快的是Graphsync。还有一个提案正在讨论扩展 Bitswap 协议,添加有关请求和响应的功能。

Libp2p

libp2p 对节点间连接特别有用的是连接多路复用功能。通常情况下,系统中的每个服务都会打开不同的连接,以便与其他同类服务进行远程通信。使用 IPFS,只需要打开一个链接,并对此链接进行多路复用。对于链接节点需要的信息,当前节点发送少量数据,对等节点可以自动整理属于他们的数据块。

这些功能之所以非常有用,是因为通常情况下,链接配置很麻烦,而且维护成本很高。使用多路复用功能,一旦网络节点建立了连接,就可以执行需要的任何操作。

模块化范例

从以上内容我们可以了解到,IPFS 生态系统由许多模块化的库组成,这些库可以在任何分布式系统的特定部分使用。也可以独立使用这些库,通过自定义的方式将他们组合起来。

IPFS 生态系统通过建立 IPLD Merkle DG,提供了CID和数据间的链接关系。您可以使用 libp2p 提供的 DHT 在网络中寻找特定的内容,与网络节点建立链接后,可以使用多路复用下载数据。所有这些都由中间件保持在一起,这是链接的唯一标识符;这是IPFS构建的基本部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值