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 状态的数据结构 ipfs|ipfs pin 详解
文章图片
查询文件块的 pin 状态 ipfs|ipfs pin 详解
文章图片
文件块的 pin 状态持久化 ipfs|ipfs 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 Ainternal 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

    推荐阅读