星云文件系统简介

位置寻址 VS 内容寻址

位置寻址指向特定实体所存储的数据位置。

位置寻址的两个缺陷:

  1. 可信度: 难以验证内容存储的URL,以及内容是否与中心权威机构相关

  2. 效率: 不同域上或不同文件名的相同内容导致大量的冗余

内容寻址为数据提供独特的,内容驱动的标识符,我们可以用这些标识符去检索数据:

  1. 结合加密哈希,内容寻址不在依赖于权威机构:即使改变非常小(一个图像中的一个像素点的改变),加密算法也会产生完全不同的哈希值

  2. 加密哈希能够从数据的内容中产生,意味着任何人对相同数据使用相同算法将产生相同的哈希值

内容标识符 (CIDs)

内容标识符是自描述型的内容寻址标识符。它不能表示内容在哪儿存储,但它基于内容本身形成了一个地址。

多哈希是自描述型哈希值,它本身包含描述加密算法和哈希长度的元数据。

  • algo: 用于生成哈希值的加密算法标识符
  • length: 哈希值的实际长度
  • value: 实际哈希值

在添加加密方式(dag-pd)和版本前缀后(version 1),最终的CID将如下所示:

<cid-version> <multicodec> <multihash-algorithm> <multihash-length> <multihash-hash>

Merkle DAGs (有向无环图)

IPFS使用CIDs去唯一地表示一个节点,并使用Merkle DAGs去表示从一个节点到另一个节点的边。

在Merkle DAG中,每个节点的CID都依赖于它的每一个后代节点;如果任何后代节点出现不同,他们的标识符也会不同。例如,如果图片tabby猫被修改,则它在图中相应的节点会接受到不同的CID。这意味着,我们总要自上而下构建DAG:在子节点的CID未被决定前,父节点不能被创建。

在Merkle DAG中,每个节点的CID依赖于它的每一个孩子节点。因此,根节点的CID可以表示整个有向无环图。

IPFS的Merkle DAGs有三个特点:

可验证性:需要检索数据的节点可以验证它的CID

分布性:1) 任何拥有DAG的人可以作为该DAG的提供者; 2) 我们能够并行检索数据以及它的孩子节点

去重性:通过将冗余部分加密为链接,Merkle DAGs能高效地存储数据

分布式哈希表 (DHT)

为了寻找所需内容的节点,IPFS使用分布式哈希表,即 DHT。IPFS使用 libp2p 去提供 DHT,并处理节点间的连接以及交流。

一旦知晓所需内容的节点,将再次使用 DHT 来查询这些节点(路由)的位置。因此,为了得到该内容,需要使用两次 libp2p 来查询 DHT。

在发现所需内容及其位置后,需要连接到该内容并交换。为了请求所需块并向其它节点发送块,IPFS当前使用 BitSwap 模块。Bitswap 允许连接到所需内容的节点,向它们发送 wantlist (所需块的列表),并让它们发生请求块。一旦这些块到达,使用它们的CIDs进行验证。

Libp2p

libp2p是IPFS的网络栈。libp2p的目标是解决p2p连接中的发现能力。但是,libp2p已从IPFS中剥离出来,两个项目分别有各自的目标:

  • IPFS更多关注内容寻址,例如,查找、提取和验证web中的每个内容块
  • libp2p更多关注过程寻址,例如,查找、链接和验证任何数据在网络中的转移过程

libp2p通过模块化实现过程寻址,即定制用户样例——用户能够根据自己的需求来选择特定的模块(传输、网络地址转换等),并组成相关的配置。

OSI模型(开放系统互连模型)作为例子。

正如我们所示,在web中的实际实现并没有完全遵循OSI模型,并且比较混乱。例如,上图所示的TCP/IP协议。

Instead, libp2p breaks the OSI Model apart and allows applications to mix and match freely without being restricted to rigid conceptual models.

但是,libp2p分解了OSI模型,并使得应用程序不再受概念模型的制约,能够自由地组合。

如上左图所示,NodeJs libp2p配置文件:

  • 第一部分导入组成网络栈所有需要的libp2p模块
  • 第二部分是libp2p节点配置,在这里我们为每个网络块添加不同模块

但是,对于运行在浏览器中的代码(不需要支持TCP传输),我们只需要在libp2p配置中改变传输协议对等发现协议

Filecoin

Filecoin添加激励层,来促进在去中心化web中长期、可验证的存储。由于Filecoin的区块,网络中的所有参与者共同工作来验证交易。在没有中心权威机构时,这些共识机制使得分布式网络中的用户能够达成一致。

在Filecoin中,存储矿工负责验证他们是否存储了正确的数据,验证器的功能被网络中的所有参与者所共享。

在系统文件(如puppy.gif)能被Filecoin网络共享前,它必须将自己转化为Filecoin块:

  • 第一阶段,系统文件被分割来创建IPLD DAG
  • 第二阶段,IPLD DAG被序列化为CAR文件,并填充来生产Filecoin块

在存储的协商过程中,CID和其它交易参数合并来生产一个交易协议。接着,客户端发送该协议到存储数据的矿工。一旦矿工确认该协议,客户端向矿工传输数据。一旦矿工传输数据,并验证这些数据匹配协议中的CID,它们就向Filecoin的区块中发送交易协议,来提交协议块。

**重复证明 (PoRep)**:存储矿工验证存储的数据块是唯一的。重复证明只在数据第一次被矿工存储时发生一次

时空证明 (PoSt): 重复地验证存储空间中是否有相同的数据

参考文献

ProtoSchool: https://proto.school/

IPFS Docs: https://docs.ipfs.io/