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后,虽然用户可通过固定网址访问文件,但仍存在两个问题
- 用户仍需要输入很长的网址
- 用户只能通过
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