ipfs pin 详解

ipfs pin 简介

pin 在英文中是大头针、钉住的意思。在 ipfs 中, pin 表示将文件长期保存在本地,不被垃圾回收。

ipfs pin 原理

每个文件块都有自己的 pin 状态,由 pin 管理器 Pinner 进行管理。
ipfs 在做 GC 等操作时,会根据每个文件块在 pin 状态,对其做出相应的处理。

文件块 的 5 种 Pin 状态

Recursive 状态

文件块树被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect

Direct 状态

只有目标文件块添加到 pin 中, 子孙块不做处理,目标文件块的状态就是 Direct

Indirect 状态

文件块树被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect

Internal 状态

ipfs 使用文件块来保存 pinner 状态,这些文件块的状态就是 Internal

NotPinned 状态

文件块没有被 pin,在 GC 时会被删除

存储文件块 pin 状态的数据结构

ipfs pin 详解_第1张图片

查询文件块的 pin 状态

ipfs pin 详解_第2张图片

文件块的 pin 状态持久化

ipfs pin 详解_第3张图片

根据 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

你可能感兴趣的:(ipfs pin 详解)