初识以太坊所采用的IPFS

348 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

IPFS

IPFS(The InterPlanetary File System) 是一个主要用于区块链技术的 peer-to-peer(p2p) 的存储网络。该网络上的所有内容都可以被该网络上的任何用户所使用。

在IPFS中,有三条最基本的准则:

  • Unique identification via content addressing
  • Content linking via directed acyclic graphs (DAGs)
  • Content discovery via distributed hash tables (DHTs)

IPFS 如何定位内容的位置

对于中心化的网络,获取一个信息首先要找到承载该信息的文件,再通过URL等方式获取;而对于文件系统,目前普遍采用的是通过其文件名以及所在的目录来决定。例如: en.wikipedia.org/wiki/Aardva… /Users/Alice/Documents/term_paper.doc C:\Users\Joe\My Documents\project_sprint_presentation.ppt

因此,中心化的网络和文件系统都是按照信息所依附的载体的标识来获取信息的位置,而不是按照信息本身来获取信息的位置

因此,IPFS与传统的中心化网络的不同点在于,在IPFS上每一块信息都有自己的一个content identifier,也就是CID,其本质是一个哈希值。

为什么要使用哈希?

在IPFS 的官方文档中,对于为什么要使用哈希?给出的解释是:

Many distributed systems use content addressing through hashes as a means for not just identifying content, but also linking it together — everything from the commits that back your code to the blockchains that run cryptocurrencies leverage this strategy. However, the underlying data structures in these systems are not necessarily interoperable.

简单来说,就是大多数分布式网络采用信息的哈希值作为标识符的原因不仅仅为了辨别信息,并且还可以将信息"整合"。而这个逻辑就是Interplanetary Linked Data(IPLD) 所依照的。对于IPLD 这个系统,我们可以将其看作一个通过信息的哈希值来查找信息,组合信息的一个文件系统。简单来说,IPLD就是一个大型的哈希表,这个哈希表的每一个节点承载了一块信息,但每一块的信息不一定是完整的,也就是说多个节点的信息可能组成了一个完整的内容。因此,IPLD这个系统提供了相应的查找和组合逻辑。

最后,IPFS使用了IPLD来完成内容查找等逻辑。

为什么IPFS要使用DAGs?

IPFS等分布式网络的底层数据结构使用了DAGs(directed acyclic graphs)有向无环图,而IPFS特定使用了Merkle DAGs。简单来说,Merkle DAGs 的每一个节点拥有一个通过节点信息所生成的哈希值作为唯一标识符。

而在IPFS中,为了将一个完整的conent(content 可以是文件/文件夹等)存储在 Merkle DAGs 中,IPFS首先会将这个content切割为多个block, 此处切割是为了更快的对文件进行存储和辨识,与此同时,被切割的content 也会以多个block所组成的虚拟集合 "存在"于 Merkle DAGs 中。

所以可以推断出,在IPFS 中,由于文件是由 唯一的内容组合而成,因此若将两个内容有重复的文件上传,在IPFS切割阶段可能会导致 block 的"重复",而这种重复则大大节省了存储空间。

DHTs

Distributed Hash tables, 是一个在分布式网络下,由该网络下所有节点所组成的一个分布式的哈希表,IPFS 使用了libp2p project 来提供DHT和节点之间通讯的方式。

对于libp2p 而言,其在分布式网络下查找相应内容的方式大致如下:

  1. A节点了解到了所要请求的内容,以及哪些节点存储有组成这些内容的部分;
  2. A节点使用DHT找到所有促成这个内容的各个节点在分布式网络下的路由;
  3. 知道了路由,再通过libp2p 再次请求DHT,其具体实现是使用Bitswap, 即请求方通过Bitswap 发送一个请求列表wanlist,而最后得到一个内容的列表,通过校验这个列表中每一个部分,来判断这个部分是不是自己想要的。

参考文档

How IPFS works How IPFS Deals With Files