IPFS 圖形版與命令列版的概念釐清、檔案錨釘和排除資料夾匯出檔案 CID 教學

ipfs 批次錨釘 圖形版 GUI 命令列 CLI 操作實戰

用星際檔案系統來作為網站圖床一段時間了,而這段日子也逐步解決了一些 IPFS 原生問題,像是上傳後找不到檔案 (504)開圖緩慢、冷門檔案被 Garbage Collection 等困境。


但 IPFS 值得拿來當網站圖床嗎?反應和下載速度有辦法頂住網站流量嗎?以下糊塗流浪貓將會針對這些問題進行探討與心得分享。



文章目錄

  1. 為什麼要用 IPFS 來放圖?
  2. 原生圖床 vs IPFS
  3. IPFS 上傳檔案的工具
  4. 用 IPFS Desktop 匯入並錨釘檔案
  5. 批次匯出 IPFS Desktop 的檔案列表
  6. 用 ipfs add 加入檔案
  7. 手動錨釘 image.jpg 後解除 Data 資料夾的錨釘
  8. 排除資料夾,匯出所有檔案的 CID
  9. 以指令批次錨釘後,IPFS圖形版的錨釘圖示變化
  10. IPFS 的錨釘三態
  11. 結語
  12. 延伸閱讀


為什麼要用 IPFS 來放圖?

其實我會用星際檔案系統當圖床的原因,並非為了自由、隱私、去中心化或避免審查這類高尚的理由,單純是討厭 Blogger 的圖片網址罷了。


AVvXsEjQEA6BNPU1dx7i54QEmNa3ttkRWceazvt1kkTD4pjNTx1sVmh3BpxDdfnEeoaG4TBWiHRaaDGQpu59ffh9L6u3Oa0BgpNLTrFN3lwnNhoHGSdrftgjsetj7oYRGSD1xUQNFTdjP0lyLu2CG3T5JE6PQBozmuN3r3Y2_KesCm6Q1d2Gbq1ZEvT3r68Q

 

沒錯,上面那串將近 200 字的東東就是 Blogger 預設的圖片網址。Google 之所以會這樣設計網址路徑,可能是有資安上的考量,但一長串的英數符號組合看了總是讓人煩躁。

 

而這樣的圖片網址也不利於未來進行遷站,雖然 Google Takeout 可以直接匯出原始解析度的圖片,但若遇上重複檔案或檔名消失的話,該怎用正規表達式 (Regular Expression) 將其放回去就真的是一大考驗。

 

對於這個問題,應該早已經有高手開發了好用的工具,協助 Blogger 使用者進行遷站。但把希望寄託在別人身上的話,自己的人生總是有點虛無飄渺。因此除了原生圖床之外,還有什麼方法能讓我們儲存圖片?

 

星際檔案系統 (IPFS) 或許就是解答。

 

 

原生圖床 vs IPFS

雖然 IPFS 的檔名也是一長串英數組合,但星際檔案系統的 CIDv0 只有 47 字,CIDv1 頂多 60 字。相較於 Blogger 原生圖床的 200 字來說親切許多。不過很多讀者可能認為幹麻自討苦吃,直接乖乖用 Blogger 放圖不就好了,你看一堆人不也用的好好的?

 

確實,如果今天有人想用 Blogger 經營自己的事業,那購買外部圖床或直接用它內建的圖片空間即可,真的沒必要像我這樣搞 IPFS 圖床。

 

但無奈,我就是個喜歡自找麻煩的傢伙。

 

另外 IPFS 有個好處:只要檔案 CID 沒有改變,我們都可以用 JavaScript 來切換網站上所有檔案 CID 的閘道器。


也就是說,如果你今天覺得 ipfs.io 或 dweb.link 速度太慢的話,可以將它切換成更快速的 cloudflare-ipfs.com,不必重新上傳檔案到新的伺服器或修改文章,省去不少麻煩。


用 JavaScript 修改 Blogger 網站上的 IPFS 圖片閘道器位置 (Gateway)

 

另外如果你手上有多餘的加密貨幣 (BTC, ETH) ,也可以買 Arweave 幣來建構區塊鏈與 IPFS 的永久圖床。維翠尼


永久圖床!Arweave 幣的購買與轉入錢包

永久圖床!用 arkb 將檔案上傳至 Arweave 區塊鏈並以 IPFS 連結分享

 

雖然 IPFS 的效率時好時壞,但搭配輔助方案和自動下載腳本可達到更快的開圖速度。因此星際檔案系統確實是可以拿來做網站圖床,且速度和效率其實都不錯,只是處理起來有點麻煩罷了。


言歸正傳,那 IPFS 在使用上有什麼地方要注意的?不是直接將檔案丟上去就好了嗎?以下我將對圖形版命令列版的差異與操作技巧進行解釋與驗證。


 

IPFS 上傳檔案的工具

目前星際檔案系統官方推出的工具主要有兩種:

 

IPFS Desktop GUI 圖形桌面版

IPFS command line CLI 命令列

 

但這兩項工具頂多是「堪用」罷了,一些該有的功能 (如:批次匯出特定類型的檔案 CID) 都還沒有,實在相當可惜。而以下我將示範用 IPFS 圖形版與 IPFS 命令列版上傳檔案至星際檔案系統。


 

用 IPFS Desktop 匯入並錨釘檔案

建立一個名為 Data,內含一個子資料夾 pic 與兩張圖片的示範資料夾。將其匯入 IPFS Desktop 後,它會被加入 ipfs 的「files」應用程式界面 (API, Application Programming Interface) 中。

 

Data
--pic
----image_1.jpg
----image_2.jpg

 

用 ipfs files 指令查詢。

$ ipfs files ls -l /Data/pic
image_1.jpg QmCID...fnceP 45009
image_2.jpg QmCID...aQoch 85481

 

由於 files 是獨立於 pin 指令的可變動檔案系統 (MFS, Mutable File System),因此預設的情況下 ipfs pin ls 指令不會列出 ipfs files 內的檔案。

 

根據官方說明文件指出,被加入 ipfs files 的檔案不會被 IPFS Garbage Collections 清除掉,即便沒有錨釘圖示也能保護檔案在本機節點上存續。

 

只有在 IPFS Desktop 界面手動對檔案進行「錨釘」的情況下,ipfs pin ls 指令才會將該檔案以 recursive 錨釘類型列出。

 

$ ipfs pin ls
QmCID...fnceP recursive

 

 

批次匯出 IPFS Desktop 的檔案列表

目前 Desktop 圖形桌面版無法一次匯出所有檔案 CID,頂多只能勾選資料夾並下載其內的所有檔案。雖然 ipfs files ls 指令僅能輸出指定資料夾內的檔案 CID,尚不支援遞迴資料夾 (-r),但我們可以用 ipfs refs -r 這個指令來匯出遞迴子資料夾內所有檔案的 CID。

 

$ ipfs files ls -l /Data/pic
image.jpg Qm...fnceP 24167

$ ipfs refs -r Qm...vXX2b #Data 資料夾的 CID
QmCID...BA3g8
QmCID...fnceP

 

 

用 ipfs add 加入檔案

與 IPFS Desktop 匯入檔案的情況相反,用 ipfs add 指令加入的資料夾與檔案不會在 ipfs files 中顯示;圖形桌面版中也不會看到檔案與資料夾的存在;但如果你先用 ipfs add 匯入檔案,再將相同的檔案導入 IPFS Desktop 中的話,該檔案會標示為「已錨釘」狀態。


這代表圖形桌面版的錨釘功能與 ipfs add / pin 指令都會將檔案設為遞迴錨釘 (recursive)。只是它們倆的查詢、匯入與輸出方式不太相同罷了。



簡單來說

  • 以 ipfs add 加入的檔案要用 ipfs pin ls 查詢。
  • 用 IPFS Desktop 圖形版匯入的檔案要以 ipfs files 查詢。
  • 被 IPFS Desktop 圖形版錨釘的檔案會被列入 ipfs pin ls (recursive)。



接著,我們來進行驗證。請用下面的指令將 Data 資料夾上傳到 IPFS 系統,記得要加上 -r 讓它能遞迴子資料夾。

$ ipfs add -r Data
added QmCID...fnceP Data/pic/image.jpg
added QmCID...BA3g8 Data/pic
added QmCID...vXX2b Data
 23.45 KiB / 23.45 KiB [====================] 100.00%

 

用 ipfs pin ls 來顯示上傳後的結果。

$ ipfs pin ls
QmCID...XX2b recursive   #Data
QmCID...A3g8 indirect    #pic
QmCID...nceP indirect    #image.jpg

 

$ ipfs pin rm Qm...vXX2b #解除Data資料夾錨釘
unpinned Qm...vXX2b

$ ipfs pin ls
$ 

Σ(゚Д゚;≡;゚д゚)

 

從上面的實驗可以看到,將 Data 資料夾解除錨釘狀態後,其下的 pic 與 image.jpg 也一併消失了。但它們只是從你的電腦中移除罷了,在還沒被 Garbage Collection 之前,用 IPFS 探索 Data 資料夾 CID 都還能找到完整檔案目錄。

 

 

手動錨釘 imagejpg 後解除 data 資料夾的錨釘

$ ipfs add -r Data
added Qm...fnceP Data/pic/image.jpg
added Qm...BA3g8 Data/pic
added Qm...vXX2b Data
 23.45 KiB / 23.45 KiB [===============] 100.00%
 
$ ipfs pin ls
Qm...fnceP indirect
Qm...BA3g8 indirect
Qm...vXX2b recursive

$ ipfs pin add Qm...fnceP recursively #錨釘image.jpg

$ ipfs pin rm Qm...vXX2b #解除Data資料夾錨釘
unpinned Qm...vXX2b

$ ipfs pin ls
Qm...fnceP recursive #僅剩下image.jpg

 

從以上的實驗可得知,IPFS 資料夾 CID 主要是用來「歸檔」的,資料夾與檔案都是平行的存在。

 

將 recursive 解除錨釘後,其下的 indirect 自然也會被解除。由於上傳的頂層目錄是 Data 資料夾,因此 IPFS 預設將它以 recursive 錨釘;而 pic 資料夾與內部的 image.jpg 皆是以 indirect 錨釘。

 

但在本例中,我將 image.jpg 也一併錨釘 (recursive) 了,因此解除 Data 資料夾的錨釘狀態後,image.jpg 還是會留在你的電腦上。

 

 

排除資料夾,匯出所有檔案的 CID

為了獲得電腦中完整的檔案列表,你可能會用 refs 或 files ls -l 來匯出,但這兩種指令無可避免的都會將子資料夾 CID 也一併匯出,造成明明檔案只有 100 個,匯出的 CID 列表卻有 129 行的奇怪現象。

 

不過 ipfs add 在匯入的過程中,會自動依路徑進行排列,通常「檔案」都會在列表開頭,而「資料夾」則在尾部。因此我們可以利用這點,將匯入過程另存新檔,以文字編輯或試算表軟體排除多餘的數據與資料夾 CID,產生純粹的檔案列表。

 

$ ipfs add -r Data > list.txt
added Qm...fnceP Data/pic/image.jpg #保留
added Qm...BA3g8 Data/pic #刪除
added Qm...vXX2b Data #刪除

 

最後,我們就能用這個純粹的檔案 CID 列表來進行錨釘 (recursive),且不用擔心刪除了資料夾,導致遺失檔案的問題。

ipfs pin add -r < listCID.txt #批次錨釘
ipfs pin rm -r < rmCID.txt #批次解除錨釘


 

以指令批次錨釘後,IPFS圖形版的錨釘圖示變化

從下圖可以看到,排除子資料夾匯出 CID 列表之後,在以 ipfs pin add -r 進行錨釘,可以讓 IPFS Desktop 得到「僅釘選檔案而不錨釘資料夾」的成果。

 

ipfs-cid-pin-batch-1

 

 

IPFS 的錨釘三態

以下三種 pin 錨釘類型與被匯入 ipfs files 的檔案,將不會被 IPFS Garbage Collection 清理掉。

recursive
indirect
direct

$ ipfs pin ls -t direct
$ ipfs pin ls -t indirect
$ ipfs pin ls -t recursive

 

 

結語

由於 IPFS 功能尚未開發完善的關係,我目前是以命令列與圖形版交替使用的方式來操作,畢竟兩者在彼此的優點、缺點、功能上都能互補。雖然圖形化版本的 IPFS 使用起來較直覺且方便,但在面對大量檔案的批次操作 (Batch) 時,還是以命令列執行比較快,用手工的方式一個個慢慢按是會出人命的。

 

 

延伸閱讀

IPFS docs

IPFS - 取代過度集中化的網路空間儲存方案

用 IPFS-Cli 命令列版星際檔案系統匯出所有檔案列表 CID

解決 IPFS 上傳後找不到檔案的問題 (504 time out)

永久圖床!Arweave 幣的購買與轉入錢包

永久圖床!用 arkb 將檔案上傳至 Arweave 區塊鏈並以 IPFS 連結分享

加快與維持 IPFS 檔案下載速度的幾種方式

更多 IPFS 教學

 

留言