是时候和404说再见了

1,762 阅读4分钟
原文链接: zhuanlan.zhihu.com

前言

大家在网上冲浪的过程中是否经常遇到「404」这个令人不悦的数字呢?我时常会想如果所有数据都能永久保存在互联网上该有多好。直到我发现了一个神奇的项目 —— IPFS(InterPlanetary File System)

简介

InterPlanetary File System,中文名星际文件系统,一个点对点的超媒体网络传输协议,IPFS 中的所有节点共同构成了一个分布式的文件存储与分发系统。它的目标是取代传统的 HTTP 协议,创建一个更快更安全以及更加开放的网络。

HTTP的缺点

按照传统的 HTTP 协议标准访问一个网络中的资源,需要先解析域名找到服务器的 IP 地址,再通过该 IP 向服务器发起请求,如果该文件已经被服务器删除,那么就会返回 404(IPFS 中没有删除文件的广播命令)。传统的中心化架构依赖单个服务器、有限的集群以及Internet主干网,容易遭受 DDOS 攻击,出现单点故障。

工作原理

IPFS 为每个文件根据其内容计算出一个唯一的 HASH,每个节点储存部分文件数据以及确定每个文件所在节点位置的分布式哈希表。用户访问文件时提供文件的 HASH,依据哈希表找到文件并返回文件数据。与 CDN 不同的是,每个 IPFS 节点都是一个数据源,不需要再从中心服务器获取数据。

Filecoin

Filecoin 是运行在 IPFS 上的激励层。Filecoin 提供一个巨大云储存市场,使用者支付一定的金额来获得分布式的存储服务,而矿工将自己的机器作为 Filecoin 中的节点存储数据,来获得工作证明,以此来激发更多的人来加入 IPFS 的节点网络中。

安装

访问 IPFS官方网站 下载 IPFS。

tar xvfz go-ipfs.tar.gz
cd go-ipfs
./install.sh

解压文件并执行 install.sh
之后,我们可以输入 ipfs help 来测试是否安装成功。

创建节点

IPFS 的默认目录是用户文件夹下的/.IPFS,但是如果你有一块更大的磁盘,想让 IPFS 运行在其他目录,只需要在 ipfs init 之前,设置环境变量IPFS_PATH,将其指向其它路径即可。

ipfs init

成功的话,会显示如下信息:

initializing IPFS node at /Users/Morning/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmPh21fdkT9k3SCa83GMdErTwWAxyy3dcvUZiYYF2E5BDe
to get started, enter:

    ipfs cat /ipfs/QmPh21fdkT9k3SCa83GMdErTwWAxyy3dcvUZiYYF2E5BDe/readme

IPFS 的所有数据便会储存在 /Users/Morning/.ipfs

运行节点

$ ipfs daemon

执行 daemon 命令,启动 IPFS的守护进程,将本地节点连入 IPFS 节点网络,同步节点数据,参与数据的储存与分发。

Initializing daemon...
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit/ipfs/QmPh21fdkT9k3SCa83GMdErTwWAxyy3dcvUZiYYF2E5BDe
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

添加文件

现在我们来上传一个测试文件到 IPFS 网络中。
写一个简单 Markdown,test.md

# Hello IPFS

然后执行 add 命令:

$ ipfs add test.md
added Qmc6XfTRVX8FnYhMJ9wdgyq87qhgSZubTxUDYU4aX8m2ps test.md

使用 cat 命令验证是否已加入本地节点:

$ ipfs cat Qmc6XfTRVX8FnYhMJ9wdgyq87qhgSZubTxUDYU4aX8m2ps
# Hello IPFS

如果你的 daemon 进程正在运行的话,会自动将本地的数据同步至 IPFS 网络。我们可以使用 IPFS 官方提供的 HTTP 网关加文件 HASH 来访问文件。(为了所有读者都能正常访问,下文将使用网关代理代替)

官方: https://ipfs.io/ipfs/<HASH>
代理: https://ipfs.infura.io/ipfs/<HASH>

测试文件地址

顺便介绍一款官方的 SPA markdown-viewer,可以直接在浏览器中浏览 IPFS 中的所有 Markdown 文件。

测试文件预览地址

上传网页

首先,让我们来写一个超级简单的页面。这页面只有一句话和一张图片。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>ELEME FE</title>
  <style>
    .container {
      text-align: center;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>Hello, ELEME FE</h1>
    <img src="ELEMEFE.jpg" alt="">
  </div>
</body>
</html>

上传网页到 IPFS 上的方法非常 easy,只需使用 add -r 来上传网页所在的文件夹即可搞定。

$ add -r .\ipfs-elemefe\
added QmVDvVCpco8vqsXZ5uuoJn2GA8Tqtcrh5trN9NRvxjvJTn ipfs-elemefe/ELEMEFE.jpg
added QmR62NLdnTykcukmSyKS4emyAykL2eXaoiisBa7CVhqqEJ ipfs-elemefe/index.html
added QmUn69seNQTSRAcQb1bfqbVQKh6VnVHeocDZSoWia8vN3N ipfs-elemefe

等待本地节点同步完数据后,我们便可以在 ipfs.io 上访问这个网页了。

网页地址

duang~ 一个永久保存在 IPFS 上的网页就出来了!

大前端合照

修改文件

在 IPFS 上其实并不存在修改文件这么一说,只要你将文件上传至 IPFS 网络后,这份文件将一直保存在 IPFS 网络中,除非所有保存该数据的节点都丢失了该数据。如果想修改文件,只能重新使用 add 命令来上传修改后的文件,生成一个新的 HASH。这次,我们修改一下标题的颜色,然后重新上传。

$ ipfs add -r ./ipfs-elemefe 
added QmVDvVCpco8vqsXZ5uuoJn2GA8Tqtcrh5trN9NRvxjvJTn ipfs-elemefe/ELEMEFE.jpg
added QmP5mbCYJqKjiZnBrJPSuiYz5rWWqr6wFES98GDCKSnj9D ipfs-elemefe/index.html
added QmTQLbdGA9pQcwj7Wgf17AYAUcZcEyuijftupz1YCcf9Mn ipfs-elemefe

修改后的网页链接

但是这样的话会给网页更新造成很大的不便,每次更新后地址都会变化。为了解决这个问题,我们可以使用 IPNS (Interplanetary Naming System) ,IPFS内部的域名系统, 将新的 HASH 与自己的节点 ID 绑定。使用 ipfs name publish 命令:

$ ipfs name publish QmTQLbdGA9pQcwj7Wgf17AYAUcZcEyuijftupz1YCcf9Mn
Published to QmbBsAzF69zvuseNgsE1t8wPYnJrXaYTpt6z6Kitsnc7ZA: /ipfs/QmTQLbdGA9pQcwj7Wgf17AYAUcZcEyuijftupz1YCcf9Mn

之后我们就可以使用 固定的地址 来进行访问了。(IPNS 目前存在一些问题,会导致访问速度较慢或超时,详见此issue

在有了固定的地址后,我们还可以通过反向代理或者修改 DNS TXT 的方式来绑定自己的域名。

修改了标题颜色并绑定了 IPNS

结语

现在, IPFS 上已经运行了不少有趣的项目,证明 IPFS 有着非常大的实用价值,也许在不久的将来 IPFS 真的能成为一个流行通用的网络协议,真正实现一个更快更安全以及更加开放的网络。 作为历史的见证者,我们可以在 IPFS 上创造并分享属于我们的永恒的时刻。