ipfs|ipfs pin 详解
ipfs pin 简介
pin 在英文中是大头针、钉住的意思。在 ipfs 中, pin 表示将文件长期保存在本地,不被垃圾回收。
ipfs pin 原理
每个文件块都有自己的 pin 状态,由 pin 管理器 Pinner 进行管理。
ipfs 在做 GC 等操作时,会根据每个文件块在 pin 状态,对其做出相应的处理。
文件块 的 5 种 Pin 状态
Recursive 状态
【ipfs|ipfs pin 详解】文件块树
被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect
Direct 状态
只有目标文件块添加到 pin 中, 子孙块不做处理,目标文件块的状态就是 Direct
Indirect 状态
文件块树
被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect
Internal 状态
ipfs 使用文件块来保存 pinner 状态,这些文件块的状态就是 Internal
NotPinned 状态
文件块没有被 pin,在 GC 时会被删除
存储文件块 pin 状态的数据结构
文章图片
查询文件块的 pin 状态
文章图片
文件块的 pin 状态持久化
文章图片
根据 cid 列表长度的不同,会有两种情况。
- 情况1,如果 cid 列表的长度小等于 8192,仅会生成一个
internal ipld node
,该 node 的 links 记录 cid 列表的所有 cid。 - 情况2,如果 cid 列表的长度大于 8192,会对每个 cid 做 hash 后取模,放到 256 个桶中。遍历每个桶,如果桶不为空,则生成一个
internal ipld node
,并且该 node 的 links 记录桶内所有 cid。然后,会生成一个internal ipld node
, 该 node 的 links 记录所有非空桶对应的internal ipld node
。
direct cid 列表
属于情况1,recurse cid 列表
属于情况2。internal ipld node A
的 links 包含所有状态为 direct
的 cid,internal ipld node B
的 links 包含的都是状态为 internal
的 cid,这些internal ipld node
包含所有状态为recurse
的cid。root internal ipld node
的 links 包含internal ipld node A
和internal ipld node B
。root internal ipld node
的 cid 会被存储到 leveldb 中。ipfs pin 使用 展示 列出所有被 pin 的块
ipfs pin ls
列出 pin 为指定状态的块
ipfs pin ls -t direct
ipfs pin ls -t indirect
ipfs pin ls -t recursive
增加 递归 pin
ipfs pin add QmZ98HahPRKRcfoYoJchZNKzFxSHFWw6WxvQc1hpFEoFca
直接 pin(只 pin 指定 hash 的文件块)
ipfs pin add --recursive=false QmZ98HahPRKRcfoYoJchZNKzFxSHFWw6WxvQc1hpFEoFca
移除 递归从 pin 中移除
ipfs pin rm QmZ98HahPRKRcfoYoJchZNKzFxSHFWw6WxvQc1hpFEoFca
直接从 pin 中移除
ipfs pin rm --recursive=false QmZ98HahPRKRcfoYoJchZNKzFxSHFWw6WxvQc1hpFEoFca
参考版本 ipfs 在快速演进,所有使用方式和原理有可能会发生改变,在此标注该文章对应的 ipfs 版本号。
ipfs version 0.4.18-dev
推荐阅读
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- 虚拟DOM-Diff算法详解
- LSTM网络层详解及其应用实例
- OC:|OC: WKWebView详解
- vue中的条件判断详解v-if|vue中的条件判断详解v-if v-else v-else-if v-show
- Vue组件之事件总线和消息发布订阅详解
- JS截取字符串的方法详解
- C语言进阶栈帧示例详解教程
- C#中类的异常处理详解