IPFS

星际文件系统InterPlanetary File System,缩写为IPFS)是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。它是一种内容可寻址的对等超媒体分发协议。在IPFS网络中的节点构成一个分布式文件系统。它是一个开放源代码项目,自2014年开始由协议实验室在开源社区的帮助下发展。

内容寻址

内容寻址的动机

传统的基于位置寻址

  • URL指向存储在单个位置的单个副本
  • 一旦副本消失,无法知道其他副本的位置
  • 用户无法验证内容的完整性
  • 没有请求聚合,导致重复工作和带宽浪费(即在生产环境中没有多播选项)

基于位置寻址 vs 基于内容寻址

image-20220421202705997

内容的寻址是基于内容标识符的

内容标识符CID

  • IPFS体系结构最基本组成部分
  • 用于内容寻址
  • 用于命名IPFS中的每一个数据片
  • 带有元数据的哈希
  • 自描述

CID的两个版本

image-20220421202920750

CID是不可变的链接:

  • 数据去重
    • 相同的数据可以通过其地址进行验证、缓存(节省资源,提供更快的内容访问)
  • 自认证内容
    • 通过地址进行认证,而不是通过证书颁发机构(去中心化)
  • 不变性
    • 如果内容发生改动,那么地址也会发生变化(完整性检查)

IPFS的内容寻址

内容寻址中文件被划分成数据块

  • 数据去重

    相同的数据块是不会被重复存储的

image-20220421204339609

  • 分片传输

    错误的数据块直接被丢弃,而不需要重新传输整个文件

image-20220421204350212

  • 随机存取

    每个数据块都有唯一的CID,可以让我们随机访问

image-20220421204717236

  • 在IPFS中,文件被分割成数据块,这些数据块连接成一个Merkle有向无环图(Merkle DAG)
  • 类似于”Merkle树”的”MerkleDAG”:
    • 每个数据块都表示一个节点
    • 数据块的哈希值是节点的地址
    • 每个节点的地址作为链接嵌入到其父节点中
  • Merkle树不允许一个节点有多个父节点
    • DAG中的每个节点都可以被寻址并可以被独立访问,使其成为自己的实体

Merkle树结构:

image-20220421205538059

MerkleDAG结构

image-20220421205652788

IPLD (InterPlanetary Linked Data) 星际链接数据

  • IPLD提供了基于Merkle-DAG构建数据结构的标准和格式
  • 数据 -> 数据结构

image-20220421210056731

CID解剖

内容标识符CID

  • IPFS体系结构最基本组成部分
  • 用于内容寻址
  • 用于命名IPFS中的每一个数据片
  • 带有元数据的哈希
  • 自描述

CID的两个版本

image-20220421202920750

CID是不可变的链接:

  • 数据去重
    • 相同的数据可以通过其地址进行验证、缓存(节省资源,提供更快的内容访问)
  • 自认证内容
    • 通过地址进行认证,而不是通过证书颁发机构(去中心化)
  • 不变性
    • 如果内容发生改动,那么地址也会发生变化(完整性检查)

CID格式

1
<Multibase>base(<cid-version><multicodec><multihash>)
  • Multihash: 一个自描述哈希摘要
    • 哈希函数(multicodec)
    • 哈希摘要长度
    • 哈希摘要
  • Multicodec: 一种预先设定的数字,用来唯一标识一种格式或协议
  • Multibase: 一个自描述基本编码字符串
    • b - base32
    • z - base58
    • f - base16

image-20220421211258802

  • v0版本默认使用base58
  • cid不标识文件类型

访问网站cid.ipfs.io解析cid