对IPFS中,有这样一个误解----认为存储在其中的文件是永久保存的。实际上并不是这样,存储在IPFS中的文件只在某种特殊状态下才会被一直保存,这个特殊状态就是“Pin”。
“Pin”是IPFS中一个非常重要的概念。IPFS试图让用户认为系统中的每个文件都像是在本地一样-----“要获得这个文件得从远处的服务器下载”这样的感觉是要尽量避免的。
在IPFS中常用的“ipfs cat”或“ipfs get”命令执行起来是不分文件存放的位置的。尽管这已经很好了,但有时用户还希望能把某些文件或数据放在离自己更“近”的地方。
“Pin”就是这样一种机制,它让用户告诉IPFS系统总是把文件在本地保留一个备份。
IPFS的缓存机制是比较激进的,在这种机制的作用下,通常当用户对某个文件执行了某种操作后,系统会将该文件在本地保留,但只在本地保留很短的一段时间,因为它会被IPFS的垃圾清理机制所清理掉。
IPFS的这种垃圾清理机制每隔一段时间会清理一些被视为“垃圾”的文件。
为了防止保存在本地的文件被垃圾清理机制清理掉,用户就要用到“pin”的功能了。在默认状况下通过“ipfs add”的文件会被循环地“pin”住,以保证它们不被清理。
具体的命令如下:
将文件“foo”添加到IPFS中:
echo "ipfs rocks" > foo
ipfs add foo
注意,这里将“foo”文件添加到IPFS后,会产生一个该文件的哈希值。这个哈希值后面会用到。
列举所有被pin的文件:
ipfs pin ls --type=all
将“foo”文件从被“pin”文件中移走:
ipfs pin rm <foo hash>
ipfs pin rm -r <foo hash>
注意,这里“foo hash”的意思是“foo”文件的哈希值。
检查“foo”文件是否还在被“pin”文件列表中:
ipfs pin ls --type=all
pin的状态有三种:
在上面的命令中,可能你已经注意到了“ipfs pin rm”是不能执行的,运行这个命令后,系统会提示用户,foo文件的哈希值被“循环pin”住了。
这是什么意思呢?在IPFS中有三种“pin”的状态。
- 直接pin(Direct Pin),这种pin只会pin一个数据块,其它与这个数据块相关的数据块都不会被pin。
- 循环pin(Recursive Pin),这种pin会pin一个数据块以及这个数据块所有的子块。
- 简介pin(Indirect Pin),这种pin会pin这个数据块的父块。
当一个文件或数据被pin后,垃圾清理器是不能清理它的,不信可以试试下列命令:
首先添加foo文件(默认该文件会被pin):
ipfs add foo
运行垃圾清理器清理垃圾:
ipfs repo gc
检查该文件是否还存在:
ipfs cat <foo hash>
但是如果文件“foo”不再是pin的状态了(变成了unpinned)。
将foo文件从被pin文件中拿掉,使其状态变为unpinned
ipfs pin rm -r <foo hash>
运行垃圾清理器:
ipfs repo gc
查看该文件是否还存在于IPFS中:
ipfs cat <foo hash>
这时我们会发现不是pin状态的foo文件被垃圾清理器删掉了。
我是IPFS/Filecoin社区发起人晓熙(加入社区,联系v号: liandaoxixi),IPFS/Filecoin是全球共识最大的去中心化存储项目,我会定期在社区分享专业的资讯,为IPFS/Filecoin爱好者建设一个共赢的学习社区。
参考链接:
https://docs.ipfs.io/how-to/pin-files/#three-kinds-of-pins
用户评论