InterPlanetary File System (IPFS) 是一个点对点文件存储网络。IPFS 不会将文件存储在单个服务器上(这是传统 Web 托管的工作方式),而是将文件分布在世界各地的许多计算机上。
任何计算机都可以通过安装 IPFS 软件加入 IPFS 网络,并开始托管和提供文件。
如果有人将文件上传到 IPFS 网络,任何运行 IPFS 的其他人都可以查看和下载该文件 — 不涉及中央服务器。
添加到 IPFS 的每个文件都被赋予一个基于其内容哈希的唯一地址。此地址称为内容标识符(Content Identifier,CID)。CID 包含两条信息:文件的哈希和所用哈希算法的标识符,两者合并成一个字符串。
因为 CID 源自内容本身,所以两个相同的文件始终生成相同的 CID,对文件的任何更改都会生成不同的 CID。这使得 IPFS 成为“基于内容的寻址(content-addressed)”系统 — 您根据文件包含的内容查找文件,而不是根据其存储位置查找。
IPFS 默认使用 SHA-256 ↗,并使用 Base58 ↗ 编码结果 — 这是一种省略视觉上容易混淆字符(如零和大写字母 O)的编码方案,以减少转录错误。
典型的 CID 类似于:QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco
IPFS 还支持其他编码(Base32 ↗)和哈希算法(SHA-3 ↗、BLAKE2 ↗)。
IPFS 使用分布式哈希表 (Distributed Hash Table,DHT) ↗ 跟踪哪些计算机拥有哪些文件 — 这是一种查找系统,将 CID 映射到托管该内容的计算机的网络地址。没有任何一台计算机保存完整的查找表。相反,网络中的每台计算机都会存储其中一部分,并知道在哪里找到其余部分。
将内容“上传”到 IPFS 并不意味着将文件发送到中央服务器。它意味着通过在 DHT 中添加一个条目,将文件的 CID 映射到您的网络地址,向网络宣布您拥有该内容。当其他人想要下载该文件时,他们会在 DHT 中查找该 CID,找到您的地址,然后直接从您那里下载数据。
因为多台计算机可以托管同一个文件,所以下载会分布在所有这些计算机上。如果任何一台主机离线,其他主机仍继续提供该内容。与单服务器托管相比,这种冗余赋予了 IPFS 在速度和可靠性方面的优势。
除了单个文件,您还可以上传更多内容。例如,假设有一个名为 example 的文件夹,其中只有一个文件 example_text.txt,包含字符串 I'm trying out IPFS。
如果使用命令 ipfs add -r ./example 上传该文件夹,文件夹及其包含的文件都会有各自的 CID。在这个案例中,文件夹的 CID 为 QmdbaSQbGU6Wo9i5LyWWVLuU8g6WrYpWh2K4Li4QuuE8Fr,而文件的 CID 为 QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy。
您随后可以通过两种方式访问该文件:
- 直接请求该文件:
https://cloudflare-ipfs.com/ipfs/QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy - 按名称从目录中请求该文件:
https://cloudflare-ipfs.com/ipfs/QmdbaSQbGU6Wo9i5LyWWVLuU8g6WrYpWh2K4Li4QuuE8Fr/example_text.txt
由于文件的 CID 仅在文件本身发生更改时才会更改,因此当目录中的任何文件发生更改,或者添加/删除任何文件时,目录的 CID 都会发生更改。
借助目录功能,使用一个 CID 即可对整个静态网站进行寻址,并通过请求目录中的不同文件来访问网站的不同页面。
如需有关其他概念的帮助,请参阅 IPFS ↗ 文档。