目錄

IPFS 問與答

最後更新:2021-04-07

IPFS 是最近討論非常多的話題,經過自己嘗試,加上資料整理,本文用問答的形式來簡單介紹一下 IFPS 這個東西。

IPFS 是什麼?

IPFS,即 InterPlanetary File System,中文名可以叫做 「星際檔案系統 」。這麼夢幻的名字,是因為 IPFS 是一個分散式的存儲系統, 基於內容尋址、版本化、點對點的超媒體傳輸協議。

每一個上載到 IPFS 中的檔案,都對應一個唯一的 hash ,所謂基於內容尋址,即可以根據這個唯一的 hash 在 IPFS 中找到這個檔案。 比如這張照片

IPFS 相比現在的網際網路檔案存儲,最大的區別在於 IPFS 中並沒有一個中心化的伺服器。所有檔案都是保存在千千萬萬個分散的 IPFS 節點中。因為是基於 hash 的檔案系統,因此一旦檔案上載到 IPFS 網絡中,檔案便無法更改,一旦有任何修改,對應的 hash 隨即發生變化。舉例 這張照片 ,他的 hash 是QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g 那麼這個 ID 將永遠對應這張照片,任何時候,透過這個 hash 找到的照片都一定會是這一張照片,直到地球毀滅。

https://ipfs.io/ipfs/QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g

IPFS 是區塊鏈(Blockchain) 嗎?

先回答,不是。 IPFS 是一種分散式的檔案存儲網絡,是一種類似 HTTP 的協議( protocol )。而區塊鏈則可被理解為是一個去中心化的分散式資料庫。 IPFS 作為檔案存儲協議,其本身並不是基於區塊鏈技術開發,因此 IPFS 本身和區塊鏈並沒有關係。

但為什麼經常會聽人將 IPFS 和區塊鏈一起說,甚至還會提到 IPFS 挖礦? 回答這個問題首先要說說區塊鏈本身的一個問題。區塊鏈作為一個去中心化的分散式資料庫,如要想在區塊鏈上存儲大量的數據,如影片,照片等等,理論上可以做到,但因為區塊鏈本身的設計導致花費也高的驚人。根據以太坊黃皮書,存儲 256 bit 的數據需要花費20k gas ,推算出若要存儲 1GB 的數據, 需要花費 32,000 ETH,根據本文撰寫時的ETH價格,需要5700萬美金

正因如此,IPFS 因為其 hash 唯一,不可變更的特性,和區塊鏈不謀而合。如果需要在區塊鏈上保存數據,只需要在區塊鏈記錄對應檔案的 IPFS hash ,則可保證相對應檔案唯一,不可更改。

至於 IPFS 挖礦, 則又是另外一個故事,會在下面一個問題提到。

IPFS 和 Filecoin 是什麼關係?

IPFS 和 Filecoin, 都是Protocol Labs  的項目。正如上面所說, IPFS 是一種類似 HTTP 的協議。 而 Filecoin, 則是基於 IPFS 的一個應用,引入了經濟激勵機制,透過經濟刺激,提供更穩定的去中心化存儲方案。

在 IPFS 中,所有提供存儲的節點都是自願性質,存儲提供者沒有經濟回報,自然就難以保證服務的穩定性。Filecoin 的誕生正是為了解決 IPFS 缺乏激勵機制的問題。在 Filecoin 網絡中,礦工可以透過為客戶提供存儲和檢索服務來獲取 Filecoin 代幣 FIL 獎勵,因此,Filecoin 的一大意義是作為 IPFS 的激勵工具,藉此來吸引專業的存储服務提供者來為 IPFS 提供更專業和穩定的存儲資源。

不難理解 IPFS 和 Filecoin 是良性共生關係,IPFS 越多人用,對網絡穩定性要求越高,因此礦工就會越積極,獲得越多的 FIL ,IPFS 系統也就越穩定。

IPFS 上檔案會永久保存嗎?

不一定

現在只能說,沒有任何第三方,可以主動刪除 IPFS 上的數據。但這並不等同於 IPFS 上的檔案會永久保存。

根據 IPFS 的工作原理,當你把檔案上載到 IPFS 網絡中,如果檔案大小超過 256KB,系统就会将檔案分隔成若干份 256KB 的碎片,這些碎片中每一片都會被存儲在系統的若干個節點中。可能有些在你的本地節點,有些在大洋彼岸的另一個節點中。

舉例,這張照片,假設檔案大小是 512 KB。因為檔案大小超過 256KB,因此它會被切割成 A,B 2 份。每一份,都會被根據一定機制,保存在某些節點中。 即 A 可能被同時保存在香港,紐約,馬尼拉節點,B 可能被同時保存在台北,深圳,東京節點。當有人需要這個檔案時,系統隨機在香港獲取 A,在深圳獲取B,之後再拼湊到一起,形成一個完整的檔案。如果在此過程中系統發現香港的節點無響應,則會轉而尋找馬尼拉節點中的 A 內容,從而保證檔案能夠被完整拼湊。一般情況下,越多節點提供相同的內容,檔案就會越快的被拼湊好。而正因為檔案被分佈存儲在不同的節點,所有節點同時失效的可能性相對不高,因此 IPFS 上的檔案便能保持在線。

如果該檔案的某部分資料所在的所有節點,都因為某種原因離線了,或是該節點上的數據被刪除或垃圾回收, 那麼該檔案便無法被正常拼湊,因此該檔案便無法獲取。如果所有存儲該資料的節點都刪除了對應內容,那麼該檔案也就理論上被刪除了。

IPFS 垃圾回收是什麼?

當我們請求一個 IPFS 網絡上的檔案,如 這張照片 時,IPFS 都會將對應的內容緩存到你所訪問節點的本地存儲中,因此這會慢慢導致節點緩存的檔案越來越多。因此,為了給系統「減肥」,IPFS 會在當該檔案不再被使用時,「回收」這些檔案以釋放空間。一般情況下,IPFS 每小時都會進行一次垃圾清理,刪除不再使用的緩存檔案。

IPFS Pin 是什麼?

Pin 是 IPFS 中一個非常重要的概念。簡單來說,當你Pin 了一個 IPFS 中的檔案,便等同於告訴 IPFS 「這個檔案很重要」,因此 IPFS 便會在該節點本地長期保留此檔案,不會被上面講到的垃圾回收機制清除。

目前市面上也有提供 Pin 服務的機構,例如最出名的 Pinata。藉助它們的服務,你便能夠更進一步將檔案 Pin 在他們的 IPFS 節點中,從而極大提升該檔案的可用性。

/image/blog/2huzu.png

IPFS 上的檔案可以被刪除嗎?

理論上可以

正如上面所說,如果一個檔案沒有被任何節點 Pin,或者保存檔案的所有 IPFS 節點都離線或者刪除了對應數據,那麼 IPFS 上的檔案理論上就無法再被取得。

IPFS 為了防止節點離線,引入激勵機制 Filecoin,想要獲取 Filecoin 的存儲節點,必須質押一部分 FIL,如果該節點在規定時間內離線或失效,系統便會啟用懲罰機制,沒收其質押的部分或全部 FIL。因為這個機制,這些節點便會盡可能提供穩定的服務,從而維持 IPFS 的正常運作。

如何永久保存 IPFS上的檔案?

想要永久保存 IPFS上的檔案,最簡單的辦法就是讓更多的節點 Pin 你的檔案,最直接可以使用市面上的 Pin 服務,例如 Pinata

/image/blog/pc083.png

IPFS 上的檔案可以被修改嗎?

不能。

被上載到 IPFS 上的檔案,在上載完成並生成對應的檔案 ID 後,就永遠,永遠,永遠的被「固定」了。該檔案無法被以任何形式修改。任何擁有該檔案 ID 的人,都可以獲取該檔案。正如 這張照片 ,任何人,包括照片的攝影者,上載者,Frank,就是我本人,都無法修改。任何時候,這個 QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g hash, 一定是對應這隻我在台灣猴硐貓村拍攝的黑白貓貓。

IPFS vs BitTorrent

可能會有人覺得 IPFS 聽起來和之前風靡一時的 BT 下載很相似? 那 IPFS 和 BitTorrent 有什麼分別?

先說相同之處:

IPFS 和 BitTorrent 兩者都是一種點對點 (peer to peer)協議。兩者都是基於檔案內容對應的 hash 尋找檔案,一個大型檔案,都會被拆分成若干小塊,從不同的節點處下載,之後再拼接成一個完整的檔案。

那兩者有什麼不同?

雖然 IPFS 和 BitTorrent 兩者都是一種點對點協議, 但是 BitTorrent 並沒有做到完全去中心化。BitTorrent 協議中會有一種伺服器叫做 BitTorrent tracker,用以輔助眾多 peers 之間的通訊。因此從這個層面上來講 BitTorrent 並不是完全的去中心化。而 IPFS 則完全沒有任何中心伺服器,整個網路都是純粹點對點。

BitTorrent 下載檔案,需要 torrent 檔案,torrent 檔案內包含了所有檔案塊的 hash ,tracker 的地址等資料。下載開始時,先要連接 tracker,獲取到提供檔案的 IP 地址,然後,你的機器便和這些 IP 地址組成一個 Swarm 集群,開始點對點通訊,互相詢問大家都有哪些資源,開始下載過程。 而 IPFS 則不同, 當一個節點加入到 IPFS 網絡後,便會向整個 IPFS 網絡廣播該節點中存儲內容的 DHT (分散式雜湊表), DHT 簡單的理解,就是一個先進的檔案目錄,能夠快速找到對應檔案內容。因此當有用戶想要取得一個正好存儲在這個節點中的文檔案時,IPFS 網絡就會告訴他應該到哪裡下載。另外, IPFS 的節點還分為存儲節點和檢索節點,顧名思義,檢索節點就是專門負責檢索檔案,告訴用戶特定檔案應該在哪裡獲取;而存儲節點則是負責提供內容。

/image/blog/j35oy.png

另外,IPFS 亦可透過 IPLD,IPNS 來維護檔案的不同版本,具體的技術細節,可以參閱這裡

綜上,簡單來說 IPFS 是基於 BitTorrent、DHT、Git 和 SFS 等多種技術的一個「升級版」。借用 IPFS 白皮書中的說法:

IPFS is a distributed file system which synthesizes successful ideas from previous peer-to-peer systems, including DHTs, BitTorrent, Git, and SFS.

瀏覽器可以直接訪問 IPFS 上的檔案嗎?

截至撰文日期時,Brave 瀏覽器可以透過 ipfs://hash 的形式直接訪問 IPFS 上的檔案。例如 ipfs://QmcRR29ZNo…85tZ2g

而 Chrome 等其它瀏覽器,無法直接透過 ipfs:// 的方式訪問,但可以透過安裝 plugin 做到。另外任何瀏覽器都可以使用 ipfs gateway 服務,如 https://ipfs.io/ipfs/xxxxxxxx 或者 https://dweb.link/ipfs/xxxxxx (其中 xxx 為檔案 IPFS hash ) 的形式訪問。

IPFS 可以寄存網站嗎?

可以。 任何靜態的網站內容,都可以使用 IPFS 來寄存。類似這個網站。具體的技術操作,可參考這裡。如果結合 IPNS,可以獲得更接近現實網站的效果,具體可以參考這篇文章

什麼是 IPNS (星際命名系統)?

因為 IPFS 是基於內容尋址,多有 IPFS 中的檔案都是對應一個固定且不可更改的 hash ,例如QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g ,如果要更新檔案內容,則會生成一個全新的 hash ,需要重新發給檔案的使用者。這樣的操作自然非常麻煩。

而 IPNS(Inter Planetary Name System)則可以透過建立可以更新的地址來解決這個問題。

frank@Mac ipfs % ipfs name publish /ipfs/QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g
Published to k51qzi5uqu5dl13pbtc0qdz1y7xf7rzzc1zt4ih937qazyj69q1gkuq4x31xaq: /ipfs/QmcRR29ZNo5zNda2dPS2UQXSV8i3peE7u7SEUm2q85tZ2g

上面的 k51q...xaq 就是 IPNS 的 key, 之後就可以透過 https://gateway.ipfs.io/ipns/k51…xaq 來訪問到對應的檔案。如果想樣更新內容,便可透過

ipfs key gen SecondKey

> k51qzi5uqu5dh5kbbff1ucw3ksphpy3vxx4en4dbtfh90pvw4mzd8nfm5r5fnl

ipfs name publish --key=SecondKey /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG

> Published to k51qzi5uqu5dh5kbbff1ucw3ksphpy3vxx4en4dbtfh90pvw4mzd8nfm5r5fnl: /ipfs/<檔案 hash >

將新的檔案發佈到這個 IPNS 上。當其他人再訪問 https://gateway.ipfs.io/ipns/k51…xaq 時,就會看到更新後的檔案。

IPFS 有什麼主要缺點?

IPFS 的缺點,本人認為有如下幾點:

  • 使用人數不多,這或許是目前最大的缺點;
  • 訪問速度,截止今天,IPFS 使用的人不算多,因此導致其數據傳輸速度相比中心化的伺服器,相對比較緩慢;
  • 任何人只要擁有檔案 hash,就可以獲取到檔案,而且檔案一旦被上載到 IPFS 網絡中,就不能夠簡單的刪除。這就引申出數據安全性的問題;
  • 儘管 IPFS 有機制盡量確保獲取檔案的穩定性,但正如上面所說的節點斷線等問題,IPFS 並無法確保檔案的穩定存儲;
  • 作為一個檔案系統,僅僅支援靜態檔案的存儲,還不能執行一些程式,因此例如需要程式驅動的動態網站,則無法利用 IPFS 運行。

IPFS 可以取代 HTTP 嗎?

這個問題有點像討論 Bitcoin 可否取代傳統金錢。不是不可能,但是這個過程可能很漫長。網路上已有相關的討論,有興趣可以參考這裡

要怎樣才可將檔案上載到 IPFS 中?

將檔案上載到 IPFS ,首先要有一個 IPFS 節點。 如果想自己安裝一個節點,可以安裝 IPFS Desktop ,這就像一個普通應用程式一樣裝在你的電腦或伺服器中。

/image/blog/y6vdp.png

之後便可以透過這個應用程式,將檔案或目錄上載到 IPFS 中。 如果不想安裝 IPFS,也可以用第三方 IPFS 節點,如 Pinata,將檔案上載到 IPFS 中。

/image/blog/n1ozd.png

如何使用 Docker 安裝 IPFS ?

可以參考上一篇文章: 用 Docker 安裝 IPFS 。

IPFS 是怎樣尋找到目標檔案的?

回答這個問題前首先我們要知道 IPFS 是「基於內容尋址」。舉例你想要買一本書,你可以說「我想要買《福爾摩斯》」,這就是「基於內容尋址」。你也可以說「我想要銅鑼灣軒尼詩道500號誠品書店8樓第二個貨架第二層左邊數第二本書」,這個就是「基於地址尋址」。

上面說過, IPFS 使用 DHT (分散式雜湊表) 來保存檔案「目錄」。 DHT 簡單的理解,就是一個先進的檔案目錄,能夠快速找到對應檔案內容。當一個節點加入到 IPFS 網絡後,它便會向整個 IPFS 網絡廣播該節點中存儲內容的 DHT,因此當有用戶想要取得一個正好存儲在這個節點中的文檔案時,IPFS 網絡就會告訴他應該到哪裡下載。

另外, IPFS 的節點還分為存儲節點和檢索節點,顧名思義,檢索節點就是專門負責檢索檔案,告訴用戶特定檔案應該在哪裡獲取;而存儲節點則是負責提供內容。

安裝了 IPFS 就可以賺 Filecoin 嗎?

不是

安裝了 IPFS 節點,並不等於就可以開始挖礦。如前所說 IPFS 和 Filecoin 是兩個不同的項目。IPFS 是一種協議 (Protocol),而 Filecoin 則是屬於區塊鏈的範疇,作為 IPFS 的激勵層而存在。

怎樣挖 Filecoin?

首先,並不是每個人都能夠參與 Filecoin 挖礦,也並不是隨便一部電腦都可以用來 Filecoin 挖礦。

根據官網,參與挖礦的電腦最低要求:

  • 8核心以上 CPU;
  • 128 GB 以上 RAM;
  • 一個強大的GPU;
  • 至少1 TiB 的非揮發性記憶體儲存裝置 (NVMe-based Disk);

是不是已經開始歎氣?還沒有完。想參與挖礦,還需要進行一定數量的 FIL 抵押。

Filecoin also uses upfront token collaterals, as in proof-of-stake protocols, proportional to the storage hardware committed. This gets the best of both worlds: attacking the network requires both acquiring and running the hardware, but it also requires acquiring large quantities of the token.

而所需的 FIL 抵押數並不是一個固定的數值,而是根據一定的公式計算得出:

單個礦工算力質押 = 總算力質押 * 礦工算力 / 全網算力
單個礦工人均質押 = 總人均質押 / 礦工總數
單個礦工的質押量 = 單個礦工算力質押 + 單個礦工人均質押 = 可用 Fil*(算力_質押_配比 * 礦工算力 / 全網算力+人均_質押_配比 / 礦工總數)

而這個抵押,則是 Filecoin 獎懲機制中的重要環節。當礦工發生以下情況時,抵押會被部分甚至全部扣除

  1. Storage Fault,存儲失當;
  2. Consensus fault,共識失當,即區塊鏈維護失當;

其中存儲失當,參閱官網的解釋,包括以下幾點:

  • Fault fees: a penalty that a miner incurs for each day a miner’s sector is offline (fails to submit Proofs-of-Spacetime to the chain). Fault fees continue until the associated wallet is empty and the miner is removed from the network. In the case of a faulted sector, there will be an additional sector penalty added immediately following the fault fee.
  • Sector penalties: a penalty that a miner incurs for a faulted sector that was not declared faulted before a WindowPoSt check occurs. The sector will pay a fault fee after a Sector Penalty once the fault is detected.
  • Termination fees is a penalty that a miner incurs when a sector is voluntarily or involuntarily terminated and is removed from the network.

如果確認自己滿足要求並了解 Filecoin 的運作,可以安裝 Lotus Miner 開始你的挖礦之旅。

IPFS 有哪些好用的工具和應用?

Pinata。 第三方 IPFS 上載和 Pin 工具。 https://pinata.cloud/

IPFS 搜尋工具 https://www.ipse.io/

利用 IPFS 分享檔案 https://busterlabs.github.io/Partyshare/

利用 IPFS 的影片分享平台,類似 Youtube https://d.tube/

音樂售賣平台 https://ujomusic.com/

服裝購物平台 一個利用以太坊,IPFS 和 PGP 的去中心化電子商務網站。所有內容都寄存在IPFS上。 https://originswag.eth.link/#/

購物平台 https://openbazaar.org/

基於 IPFS 的安全檔案存儲 https://peergos.org/

結語

以上內容均為本人使用 IPFS 的經驗,以及多方資料搜集所得。個人能力有限,定會有不足和錯漏。如有發現問題,希望讀者不吝告知。我會盡快更新。

另請參閱