星云文件系统简介
位置寻址 VS 内容寻址
位置寻址指向特定实体所存储的数据位置。
位置寻址的两个缺陷:
可信度: 难以验证内容存储的URL,以及内容是否与中心权威机构相关
效率: 不同域上或不同文件名的相同内容导致大量的冗余
内容寻址为数据提供独特的,内容驱动的标识符,我们可以用这些标识符去检索数据:
结合加密哈希,内容寻址不在依赖于权威机构:即使改变非常小(一个图像中的一个像素点的改变),加密算法也会产生完全不同的哈希值
加密哈希能够从数据的内容中产生,意味着任何人对相同数据使用相同算法将产生相同的哈希值
内容标识符 (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/