在 Web2.0 的世界里,协议通常是 HTTP,资源加速通常是 CDN,对象存储通常是 OSS。

在 Web3.0 的世界里,有很多技术都可以替代这三项技术,并且把事情做的更好。而其中最优秀的项目之一,是一个集成了协议、资源加速和存储于一身的技术:IPFS。

本文将会介绍 IPFS 是什么,以及它的运行原理。

IPFS 的白皮书在 2014 年 7 月发布,其中提到了很多技术方案的畅想。它的理念和传统的 Web2.0 中 HTTP、CDN 和 OSS 截然不同。

在介绍 IPFS 之前,先来回顾一下 HTTP、CDN 和 OSS 的优势和弊端。

为什么 HTTP、CDN、OSS 这些技术在 Web3 的世界里玩不转了?

HTTP 的优势与弊端

这里指的 HTTP 是 HTTP1.1 和 HTTP2.0。
它的优势是处理小文件的传输。
但是现代互联网的数据传输存在 5 点挑战:

  1. 托管和分发的数据量已经达到 PB 级别。
  2. 跨组织的大数据计算。
  3. 分发海量高清视频。
  4. 海量数据的链接和版本管理。
  5. 防止重要文件丢失。

将以上总结为:海量数据,无处不在。
而这些,都是 HTTP 难以应对的。所以随着互联网持续不断的发展,HTTP 迟早会退出历史的舞台。

CDN 的优势与弊端

CDN 主要目的是为了加速静态资源的访问速度,这也是它主要的优势。其次可以抵抗 DDOS 攻击,维护也比较方便。
但缺点很明显,搭建 CDN 服务器的过程比较复杂,成本也高,所以一般都会买服务端的 CDN,但价格也不算低。

OSS 的优势与弊端

这里指的 OSS 是云服务商的 OSS 服务。
OSS 的优势就是高可靠、易扩展、速度快、边缘计算。在此之上可能还会有镜像、备份、安全、脱敏等一系列高级功能。总结来说就两个字:省心。
缺点也很明显,价格非常贵。但是所有 OSS 服务商都把低成本也算做它的优势之一。事实上在数据量少的情况下感受不出来,可一旦数据量激增后,高昂的价格实在让人无力接受,这一点我有深刻的体会。
当然 OSS 贵的真正原因不是存储成本高,而是带宽成本高。

现代互联网的问题

上述的问题都属于技术的范畴,除此之外,还有一个根本性的问题。现代互联网模式的问题。

技术问题、成本问题、效率问题

因为现代互联网都是中心化的模式。这种模式成本极高,需要构建中心化大规模的服务器集群,而且在高峰期容易出现服务阻塞延迟、低谷期大量资源限制浪费等问题,效率很低。这种模式很依靠中心化服务商的存储和带宽。尽管有了弹性计算等技术可以缓解这种情况,但解决不了根本模式的问题。
IPFS 可以共享存储和带宽,这样可以更高效利用资源,降低成本。
IPFS 可以有效地去重文件、消除冗余。

数据所有权问题

现代的互联网很容易丢失数据。因为数据都是在中心化的服务器集群上,服务商拥有数据的管理权利。尽管大型服务商都有数据备份和容灾方案。但是偶尔还是会发生意外。最重要的是,服务商可以以任何理由删除我们的数据,比如说你的数据不合法,说你违反平台规定。作为一个普通人,是很难和服务商对抗的,一些重要的数据就这么不知不觉间消失了。
IPFS 可以永久保存数据。

严重依赖主干网

现代互联网严重依赖主干网,一旦主干网发生故障,就会发生大规模服务中断和延迟。
IPFS 不依赖主干网,即使网络不发达的地区,IPFS 一样有很好的表现。

审查机制问题

由于现代互联网应用都是中心化网络,也就导致统治者可以让整个国家的人民都无法访问某个网站或者 App,在国内这种做法也称为墙。
IPFS 是 IP 是分布式的,几乎无法被墙。

生态问题

虽然服务商支付了大额的费用帮我们搭建服务器集群为我们提供产品。但是羊毛出在羊身上。它们会通过会员费、广告费等一些列手段收走我们的钱。甚至为了获利,丧失底线,滥用用户隐私,不断越界,做虚假广告,恶意弹窗广告,限制网速挤牙膏,甚至出卖我们的数据,收取公关费用删帖封号等。
除了上面这些问题外,互联网安全也是一个令人头痛的问题。比如各种反人类的验证码。
在过去我们没有选择,虽然难以忍受,但也只能忍气吞声,用着互联网在互联网上骂互联网。但是现在不一样了,我们有更好的选择。在 IPFS 世界里,这些问题统统不复存在。
爱奇艺之前推出过一个小品,笑不活了,用来讽刺现代互联网。有人把它搬运到了知乎,感兴趣的话可以去看一下:www.zhihu.com/zvideo/1433…。
这是一些我们不想看到的结果:

IPFS 是什么?

IPFS 有很多定义。
从它的论文来定义,IPFS 是一个按照内容索引的、版本化的、点对点的文件系统。
从技术的角度来定义,IPFS 是一个长满默克尔树(merkle-trees)的森林。
从商业的角度来定义,IPFS 是一个点对点的超文本协议。
它会让互联网更快、更安全、更开放。

IPFS 介绍

IPFS 是一个缩写,全称 Inter Planetary File System,星际文件系统。
它是点对点的星际文件系统,从这种角度上来说,它对标的是整个互联网,而不是某个协议,或者某个文件存储系统。它更像单一的 BitTorrent 集群(swarm)。

IPFS 作者介绍

作者是 Juan Benet,按照中国人的习惯音译为胡安。美国人,1988 年出生,毕业于斯坦福大学,是一个不折不扣的技术牛人。
胡安也是 Protocol Labs(协议实验室)、IPFS 和 Filecoin 的创始人。
2014 年他创建了 Protocol Labs,同年启动了 IPFS 项目。
Protocol Labs 是 IPFS 和 Filecoin 的官方组织,它的目标是如何构建下一代互联网。
在 4 年后,也就是 2018 年,他入选了财富杂志的 40 under 40 名单。

IPFS 基于哪些技术?

IPFS 的核心技术

IPFS 的核心原则是将所有数据作为同一默克尔有向无环图(Merkle DAG)的一部分来建模。
它采用但不限于以下技术:

  • 基于分布式哈希表 DHT 进行内容寻址。
  • 基于 Git 模型进行对象管理。
  • 基于默克尔对象关联。
  • 基于点对点技术。
  • 基于全球化命名空间 IPNS。

通过以上的各种技术,解决了海量数据、高并发、大吞吐量、文件丢失等一系列问题。
而它做的事情,总结来说只有三点:规定了如何上传文件、如何检索文件、如何下载文件。
你可能会问,这些技术大多不都是过去 P2P 领域的技术吗?没错,IPFS 就是一个 P2P 集大成者,它没有凭空创造很多技术或者概念,而是站在了巨人的肩膀上。

为什么是点对点?

现代互联网资源,都需要一个 http 地址才能获取,所以我们浏览器的收藏夹里存储了大量的网址。这种模式就是基于位置的寻址模式。
但仔细想想,其实我们只在乎资源的内容是不是我们想要的,而不在乎资源在哪里。
我们需要的资源,一定也会有其他人需要。如果我们附近有人的电脑上下载了这份资源,我们只需要从这个人的电脑上直接下载就可以了,没必要再去这份文件的源头上面获取。这种模式就是基于内容的寻址模式。
点对点的传输模式是以上的基础。

IPFS 的运行原理

我们在 IPFS 上传文件,需要经过如下几个步骤。

  1. IPFS 首先会把文件以 256 kb 为一个单位分成若干个小数据块,然后分别打上哈希指纹。哈希指纹是一个唯一的字符串,能和数据块一一对应。
  2. 然后 IPFS 将每两个小数据块的哈希值再进行哈希运算,得到一个新的哈希。它会重复这个过程,直到将所有的数据块的哈希值全部计算成一个哈希值为止。最终的这个哈希值,就是根哈希(Root Hash),也叫做 CID(Content Identifier)。这个过程就是构建 Merkle DAG 的过程,也就是 IPFS 的核心原则。
  3. IPFS 会去除重复文件。因为每个文件都会对应一个哈希值,哈希值一致就意味着是重复的文件。IPFS 会去除重复的文件,不过每个节点都可以保留这个节点的备份。
  4. 每个 IPFS 都会存储它所需要的数据,用 DHT 来记录每个节点存储了哪些数据。DHT 是内容 ID(CID)和用户 ID(PeerID)的映射。IPFS 会向其他所有在线节点发送我们的文件信息,但不是真实的文件,而是一个结构。包含了 CID 和 PeerID。每个节点都会更新自己的哈希表。所以这个过程非常快。就像是程序中的复制变量地址,而不是复制实际的变量内存空间类似。
  5. 当我们需要获取某个文件时,会通过文件的哈希值去寻找这个文件在哪些人的电脑上,然后从这些人的电脑进行下载。如果我们需要的文件存储在 100 个人的电脑上,而现在这 100 个人同时在线,那么我们可以同时和这 100 个人进行传输文件,最后再组合成完整的文件。这样的下载速度理论上会比从一个人那儿下载快 100 倍。这也就是 IPFS 主要的工作逻辑。

数据块的的数据结构大致如下:
data:包含不超过 256 kb 的数据。
links:连接到其他数据块。
如果某个文件非常大,那么就会首先把它的内容生成 N 个数据块,再从它们上层创建一个数据块,links 指向其他所有数据块。

IPFS 为什么需要 Git?

一旦文件的内容发生了变化,那么原来的哈希值就会失效。所以 IPFS 的文件内容是不可变的。
但是如果我们需要更新文件的内容怎么办?
为了追踪文件的更新,IPFS 引入了版本控制模型,和 Git 基本上是一致的。
我们第一次将文件上传到 IPFS 时。IPFS 会创建一个 Commit 对象。它的结构大致如下:

  • parent:指向上一个 commit,第一次 commit 指向 none。
  • object:文件内容。

如果我们需要更新文件内容,首先把新的文件上传到 IPFS。
IPFS 会为我们创建新的 Commit 对象,它的 commit 会指向上一个 commit 对象。
这样我们就可以追踪文件内容的变化了。

IPFS 无法确保始终有资源

如果拥有某个资源的全部节点全部下线,那么这个资源将会永远无法下载。就像 BT 下载时没有种子。
为了解决这个问题,我们需要有对应的方案。
IPFS 有两个方案。

  1. 通过激励机制鼓励节点多存储文件,并且长期在线分享。
  2. 主动分发文件,保证始终有在线备份。

而这个激励机制就是 Filecoin,关于 Filecoin 我们后面再聊。

IPFS 和区块链是什么关系?

严格来说两者没有关系,IPFS 并没有使用任何区块链技术。不过区块链行业的人依然都知道 IPFS 这个东西,原因是 IPFS 团队的另一个产品 Filecoin 和区块链有关系。

IPFS 和 Filecoin 的关系

Filecoin 是一个区块链应用,可以简单理解为一种数字货币。
两者没有直接的关系,只是一个团队的两个产品。
不过 IPFS 会为 Filecoin 提供底层支持,Filecoin 也会为 IPFS 注入更多活力。
我们在 IPFS 的运行原理中讲到,我们最终是在其他用户的电脑上下载的文件,而从其他用户电脑下载是需要一定网络成本的。为了鼓励大家都给其他人分享资源,IPFS 有一种激励模型,叫做 BitSwap。
如果我们的电脑有很多空闲的存储空间,可以通过 Filecoin 存储资源,分享给别人。而我们给别人分享,会得到 Filecoin 的奖励。

IPFS 为什么叫 IPFS?

IPFS 叫做星际文件系统。这个名字可不仅仅是因为炫酷、未来感或者科幻感。而是它真的很适合在星际之间传输数据。
胡安的野心也并不仅仅是取代互联网那么简单。伊隆马斯克在想办法让人类迁移火星,但肯定不会一下子让全体地球人都移居火星。在未来很可能会存在部分人在地球,部分人在火星的情况。
如果在火星获取地球的一个网页,延迟非常久,发射一次信号需要 4-24 分钟。一个来回就需要 8-48 分钟。这种延迟非常难以忍受。可是一旦有任意一个火星上的人获取到了这个网页,那么其他火星人就可以通过获取这个人电脑的网页来避免这个延迟。
所以 IPFS 是一个名副其实的宇宙级传输协议。

IPFS 怎么用?

IPFS 的官网是 ipfs.tech/。
在官网的中间有安装方式。IPFS 的安装方式有两种,桌面客户端和 CLI。

我们选择下载桌面客户端。
我们主要是通过这个客户端来参与到 IPFS 网络中的。

左侧有五个菜单,我分别介绍下它们的作用。

Status

这个页面是一些总揽数据,包含了托管数据大小、在线节点、节点 ID、代理版本、UI 版本、实时带宽等信息。

Files

在这里可以上传和删除文件。

点击 import 按钮,可以选择上传的文件或者文件夹。
它的上传速度非常快,但是实际上并没有进行文件上传的操作,它只是把文件进行了哈希运算,并且把 CID 和 PID 分发到当前所有在线的节点中。
上传完成之后,我们会得到一个 CID。点击文件的右侧三个点,选择 Copy CID,就可以将这个 CID 分享给其他 IPFS 用户了。

其他用户拿到 CID 后,可以在 IPFS 的客户端顶部的搜索框中进行搜索。

如果能够搜索到,就可以进行预览或者下载了。
另外浏览器中也可以使用 IPFS 协议。直接在浏览器中输入 ipfs://{cid},就可以直接打开文件资源。不过这需要在本地启动 IPFS 客户端。
如果未来 IPFS 发展非常顺利的话,这项功能可能会被内置到浏览器中,而不再需要单独启动客户端。

Explore

在这里可以进行 CID 搜索,获取寻址 IPLD 节点、文件对象、CID 信息等。

Peers

在这里可以看到其他的节点的信息。
包括节点所在物理地址、延迟、节点 ID、传输协议、连接协议等。
节点越多,我们的体验就会越好。

Settings

在这里可以修改分享链接的网关、固定服务、语言、IPFS JSON 配置等内容。

IPFS 的缺点和 Pin 服务

聊了那么多 IPFS 的优点,IPFS 似乎是一个无限趋向完美的技术。
但它真的是完美无瑕吗?并不是。IPFS 也有所有 P2P 应用都有的一个缺点,那就是如果持有某个文件的所有的节点全部下线,我们将再也无法下载到这个文件。
这个问题也很好解决,如果我们想要某个文件永远都可以被下载,那么就把这个文件存储在我们本地的 IPFS 系统中,并且我们本地的 IPFS 永远在线就可以了。

但是很明显,让电脑 24 小时开机的话,那和服务器没什么区别了。
这种事儿在 Web2.0 里面不都是租用某个云服务去做吗?Web3 里面同样有人干这事儿。
这种服务被称为 Pin 服务,也就是固定的意思。

Pin 服务的作用是将某个文件固定在 IPFS 系统中。

Pinata 是一个专门为 NFT 提供 IPFS Pin 服务的平台,它也是目前 IPFS 生态中做的最大的 Pin 服务平台之一。

但是 Pinata 并不是免费的,类似的平台也都这样,通过某种规则进行收费,有点像 Web2.0 时代的网盘。

有人认为这种方案并不是长期可行的方案,因为当固定的文件体积非常大了之后,Pinata 的价格也会非常昂贵,目前最高的价格是每月 1000 美元。

其实不难总结,目前的互联网世界里,不存在 100% 免费、绝对去中心化、绝对有保证的永久存储。

如果真的要实现这种设想,那么需要每个人拥有一个 7*24 小时在线开机的网络存储设备。有点像某些科幻小说中构想的那样,人类在出生时就会在体内植入某个设备。甚至人类可以改写基因,让婴儿从母体中自行发育出这种设备,就像是我们的某个器官一样,只不过它可以存储数据,连接到其他人。

我可以断言,这个时代终将来临。而步入这个时代的速度,将会取决于能源、网络、磁盘、计算等一系列科技领域的发展程度。