ipfs pin 簡介
pin 在英文中是大頭針、釘住的意思。在 ipfs 中, pin 表示將文件長期保存在本地,不被垃圾回收。
ipfs pin 原理
每個文件塊都有自己的 pin 狀態(tài),由 pin 管理器 Pinner 進行管理。
ipfs 在做 GC 等操作時,會根據(jù)每個文件塊在 pin 狀態(tài),對其做出相應的處理。
文件塊 的 5 種 Pin 狀態(tài)
Recursive 狀態(tài)
文件塊樹被遞歸添加到 pin 中,根文件塊的狀態(tài)是 Recursive,非根文件塊的狀態(tài)是 Indirect
Direct 狀態(tài)
只有目標文件塊添加到 pin 中, 子孫塊不做處理,目標文件塊的狀態(tài)就是 Direct
Indirect 狀態(tài)
文件塊樹被遞歸添加到 pin 中,根文件塊的狀態(tài)是 Recursive,非根文件塊的狀態(tài)是 Indirect
Internal 狀態(tài)
ipfs 使用文件塊來保存 pinner 狀態(tài),這些文件塊的狀態(tài)就是 Internal
NotPinned 狀態(tài)
文件塊沒有被 pin,在 GC 時會被刪除
存儲文件塊 pin 狀態(tài)的數(shù)據(jù)結構

查詢文件塊的 pin 狀態(tài)

文件塊的 pin 狀態(tài)持久化

根據(jù) 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 包含所有狀態(tài)為 direct 的 cid,internal ipld node B 的 links 包含的都是狀態(tài)為 internal 的 cid,這些internal ipld node包含所有狀態(tài)為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 為指定狀態(tài)的塊
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 在快速演進,所有使用方式和原理有可能會發(fā)生改變,在此標注該文章對應的 ipfs 版本號。
ipfs version 0.4.18-dev