IPFS 是一个新鲜事物,虽然早在 2014 年就已经发布,也一直有关注它。直到最近 CloudFlare 建设了 IPFS 的节点后觉得应该写一篇关于 IPFS 的文章了,不然博客咕了 2 个月没更新也不太好。

IPFS 的官方网站在 https://ipfs.io/,在其官方网站上有介绍到其主要特性,其中一个最吸引我的特性是“IPFS removes duplications across the network.”,也就是去重功能。

试想一下 Torrent 下载也是属于 P2P 网络下载,但是其有一个不好的地方就在于文件的任意一个字节被修改,就需要重新做种,这就造成了极大的资源浪费,而 IPFS 天生就可以避免重复的资源浪费。

这是如何实现的呢?

首先,IPFS 并不存储文件,而是将文件打散后分为一个个“区块”(block),再存储这些区块的内容。而文件则是一个个 block 的 reference,将这些 references 重新拼接在一起就成为了一个可以读取的文件。

而根据这篇问题,IPFS 的区块大小是 256 KB,也如同问题所说,如果将一个文件切割成一半,加些东西进去,IPFS 只会存储另一半没有在网络上出现的部分,已存在的部分不需要重新上传,所以去重成功完成了。

下载及安装:

可以到 IPFS 的官方网站下载并安装,Linux 用户可以直接用包管理器安装,能打开本站点的应该都有能力完成这一步,就不多说了。

使用:

安装好 IPFS 之后,需要对其进行初始化,然后创建节点私钥之类的,使用 ipfs init 命令即可完成创建。在默认情况下,IPFS 会创建一个 2048-bit RSA 钥匙对,不过你也可以选择自定义长度,在这里我将使用 4096。所以初始化的命令为 ipfs init --bits 4096

初始化成功后,会得到如下输出

ipfs init --bits 4096
initializing IPFS node at /home/yanderemoe/.ipfs
generating 4096-bit RSA keypair...done
peer identity: QmYu**********************************MTLA

其中,“peer identity”为你的节点地址。

运行 IPFS,输入 ipfs daemon 命令来运行一个 IPFS 节点。

$ ipfs daemon
Initializing daemon...
Successfully raised file descriptor limit to 2048.
Swarm listening on /ip4/**.*.*.*/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/**.***.**.***/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit/ipfs/Qm*******************************************MTLA
Swarm announcing /ip4/**.*.*.*/tcp/4001
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/**.***.**.***/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

Daemon is ready 说明了节点运行成功,现在你可以使用 IPFS 获取网络上的资源了。

假设你知道一个 IPFS 资源,想获取它,那么可以使用 ipfs cat 命令。

比如我知道 QmebCzFGo6TnYj8hvexCc2D9xHeFcQXdBu31c5qL5ASJbw 这个 IPFS 资源,就可以使用

ipfs cat QmebCzFGo6TnYj8hvexCc2D9xHeFcQXdBu31c5qL5ASJbw > output.jpg 来下载它,下载的结果会被保存在 output.jpg 中。现在,试试吧。

如果成功了,你应该能看到 output.jpg 是一只可爱的二哈。

如果想上传一个文件,就可以使用 ipfs add 来运行,比如我想上传一个名为“Frustrated Husky.mp4”的文件,就需要执行 ipfs add "Frustrated Husky.mp4"

ipfs add "Frustrated Husky.mp4"
added QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi Frustrated Husky.mp4
1.86 MiB / 1.86 MiB [=================================================] 100.00%

其中 QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi 就是这个资源的 IPFS 地址啦,其他人也可以通过这个来访问它。

添加目录:

和添加文件一样,只是需要 ipfs -r folder_name 来 recursive add 资源。

如:ipfs -r moe-site

ipfs add -r moe-site/
added QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi moe-site/Frustrated Husky.mp4
added QmQeKrEHr9DcCvEJynd3zDzbVAcTmzQFJ9jBrmLDBD9HgT moe-site/Golden Retriever and Cat.mkv
added QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW moe-site
3.35 MiB / 3.35 MiB [=================================================] 99.88%

如果你希望动态更新内容,则需要添加一个目录进去。

缓存资源:

当你上传了一个资源之后希望别人也能下载,就需要在公共节点或一个服务器上来缓存它,其中比较有名的是 CloudFlare 的 IPFS 节点和 IPFS.io 的节点。

通过:

https://cloudflare-ipfs.com/ipfs/QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi

https://ipfs.io/ipfs/QmYZo6yQH1bYYYtQ1wvtyfinXufpnKYED18eG4QrFr3DGi

可以使文件被传送至公共节点,这样即使你下线了别人也可以访问到这个文件。

IPNS:

由于每个文件都有唯一的 hash,每次更新都会导致文件 hash 改变,从而 IPFS 的资源地址也会改变。那么该如何动态更新一个资源呢?很不幸,资源没办法被动态更新,但是,你可以更新指向资源的指针。这里就要介绍下 IPNS 的使用了。

回到上面添加目录的例子,从标粗的黑体字可以得知目录的 IPFS 资源名为“QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW”,这就是你的 IPNS 不变的地址了,当你想要更新内容,只需要修改好内容,然后执行

ipfs name publish QmYeie5dNtfsYprQwcMX7H7deH97QUKZQx8PRmSLdwk4WW

重新发布,这样其他用户就可以看到当前版本的目录了。

是不是很像 git?

试试它吧。

Leave a Reply

Your email address will not be published.

*

code