IPFS上传文件并绑定域名

IPFS是一种分布式存储系统,保存在IPFS系统里的文件具有以下特点:

  • 不可删除也不可修改
  • 理论上会永久储存
  • 历史记录会永久保存 (这是由前两个特点自然得出的)
  • 如果一份文件十分冷门,这个文件可能会从IPFS消失。

IPFS自身并不储存文件,上传至IPFS的文件实际上是被分块保存在节点上。刚上传时,文 件会被分块保存在当前节点上(也就是运行IPFS进程的主机),当有其他节点请求并下载 这个文件后,这个文件会被这些节点缓存。如果一份文件十分冷门,导致所有节点缓存的 数据块拼在一起也无法重建完整文件时,这个文件也就从IPFS系统里消失了。

本文介绍如何上传文件到IPFS,以及如何使用自己的域名访问IPFS文件。

安装IPFS

参考IPFS官方文档安装IPFS并启动。

若使用Arch Linux,可使用以下命令安装并启动:

yay -S --needed --noconfirm go-ipfs
ipfs daemon

启动IPFS后台进程后可以通过浏览器访问http://127.0.0.1:5001/webui查看IPFS状态,上传文件等操作。

上传文件

除可以使用Web界面上传文件外,也可以使用ipfs命令上传:

❯  ipfs add 唐诗三百首.txt
added QmQ1kudPmN6Q2FMroAws2YQWwBcehfz2BLzy7jpU3unfSg 唐诗三百首.txt

上传成功后会返回文件的Hash值,可通过这个Hash访问文件,例如可通过https://ipfs.io/ipfs/QmQ1kudPmN6Q2FMroAws2YQWwBcehfz2BLzy7jpU3unfSg访问刚上传的文件。

若想保留文件名,可使用-w参数,此时IPFS会创建仅包含待上传文件的文件夹:

❯  ipfs add  -w 唐诗三百首.txt
added QmQ1kudPmN6Q2FMroAws2YQWwBcehfz2BLzy7jpU3unfSg 唐诗三百首.txt
added QmNmqmMDQnB5Fcbtxv5QMN8YhFCTzHZ6QB99jRsokVjHrM

使用https://ipfs.io/ipfs/QmNmqmMDQnB5Fcbtxv5QMN8YhFCTzHZ6QB99jRsokVjHrM访问时会发现唐诗三百首.txt作为子文件出现在目录中。

上传文件夹

以上传shici/目录为例,此目录当前包含一个文件:

❯  tree shici/
shici/
└── 唐诗三百首.txt

上传此目录:

❯  ipfs add -rq shici | tail -n 1
Qme3HDRBVWHCpSWnCMY3Tp396vPnVAPgrU9f1oZwkdAVTg

使用返回的Hash值访问文件夹:https://ipfs.io/ipfs/Qme3HDRBVWHCpSWnCMY3Tp396vPnVAPgrU9f1oZwkdAVTg/

使用IPNS访问文件

如果修改了shici目录,即添加或修改了目录里的文件,就需要重新执行上面的上传操作。此时目录的Hash值会变化,用户需要使用新的ID才能访问更新后的目录或文件。这对于网站部署来说是十分不便的,为了解决这个问题IPFS提供了IPNS服务,可以将一个唯一ID绑定到IPFS的Hash上。通过这个唯一ID访问IPFS文件/文件夹。

使用ipfs name publish命令进行绑定操作,例如,

❯  ipfs name publish Qme3HDRBVWHCpSWnCMY3Tp396vPnVAPgrU9f1oZwkdAVTg
Published to k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp: /ipfs/Qme3HDRBVWHCpSWnCMY3Tp396vPnVAPgrU9f1oZwkdAVTg

其中的Qme...就是上传目录时返回的Hash值。返回的k2k...就是IPNS ID,对于同一个节点来说默认情况下是相同的。我们可使用这个ID生成新的访问链接:

https://ipfs.io/ipns/k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp/唐诗三百首.txt

在文件夹里添加文件:

❯  cd shici/
❯  wget 'https://raw.githubusercontent.com/rime-aca/corpus/master/%E5%AE%8B%E8%A9%9E%E4%B8%89%E7%99%BE%E9%A6%96.txt'
❯  cd ../

重新上传并绑定IPNS id

❯  ipfs add -rq shici | tail -n 1
Qmcg2o465V4CxgziV2VzH6u1ngXxhqG19J6vbfYWGFPPvt

❯  ipfs name publish Qmcg2o465V4CxgziV2VzH6u1ngXxhqG19J6vbfYWGFPPvt
Published to k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp: /ipfs/Qmcg2o465V4CxgziV2VzH6u1ngXxhqG19J6vbfYWGFPPvt

再查看https://ipfs.io/ipns/k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp/会发现新创建的文件出现在此目录中。

使用域名访问

使用ipfs name publish绑定ID后,虽然用户可通过固定网址访问文件,但仍存在两个问题

  1. 用户仍需要输入很长的网址
  2. 用户只能通过ipfs.io访问这些文件

第1个问题可以通过添加DNS记录解决,方法是添加一条TXT记录,名称为shici,值为dnslink=/ipns/k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp。 然后就可以通过https://ipfs.io/ipns/shici.example.com/访问刚上传的文件了。

第2个问题也可以通过添加DNS记录解决,

  • 先添加DNS TXT记录,名称为_dnslink.shici,值为dnslink=/ipns/k2k4r8osxpzc36zwtdx18jgo1ovo3djhbne0y4tqh1ndgxollubumuzp
  • 添加DNS CNNANE记录,名称为shici,值为gateway.ipfs.io

此时就可以通过域名访问IPFS文件了,http://shici.example.com

不过缺点是只支持HTTP,可以使用DNS服务商的SSL服务,例如在Cloudlfare里将SSL/TLS的安全模式设为Flexible后就可以使用HTTPS访问了: https://shici.example.com/

绑定其它IPNS ID

如果有多个文件夹需要上传至IPFS,但又不想这些文件夹共用IPNS ID,即上面的k2k4...值,可以使用--key参数绑定新的IPNS id:

ipfs key gen --type=rsa --size=2048 new-key-name
ipfs name publish --key=new-key-name Qmcg2o465V4CxgziV2VzH6u1ngXxhqG19J6vbfYWGFPPvt

Filecoin

https://docs.filecoin.io/store/slate/#create-a-one-off-storage-deal

参考

Comment