最後更新: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 找到的照片都一定會是這一張照片,直到地球毀滅。
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 節點中,從而極大提升該檔案的可用性。
IPFS 上的檔案可以被刪除嗎?
理論上可以。
正如上面所說,如果一個檔案沒有被任何節點 Pin,或者保存檔案的所有 IPFS 節點都離線或者刪除了對應數據,那麼 IPFS 上的檔案理論上就無法再被取得。
IPFS 為了防止節點離線,引入激勵機制 Filecoin,想要獲取 Filecoin 的存儲節點,必須質押一部分 FIL,如果該節點在規定時間內離線或失效,系統便會啟用懲罰機制,沒收其質押的部分或全部 FIL。因為這個機制,這些節點便會盡可能提供穩定的服務,從而維持 IPFS 的正常運作。
如何永久保存 IPFS上的檔案?
想要永久保存 IPFS上的檔案,最簡單的辦法就是讓更多的節點 Pin 你的檔案,最直接可以使用市面上的 Pin 服務,例如 Pinata。
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 的節點還分為存儲節點和檢索節點,顧名思義,檢索節點就是專門負責檢索檔案,告訴用戶特定檔案應該在哪裡獲取;而存儲節點則是負責提供內容。
另外,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 ,這就像一個普通應用程式一樣裝在你的電腦或伺服器中。
之後便可以透過這個應用程式,將檔案或目錄上載到 IPFS 中。 如果不想安裝 IPFS,也可以用第三方 IPFS 節點,如 Pinata,將檔案上載到 IPFS 中。
如何使用 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 獎懲機制中的重要環節。當礦工發生以下情況時,抵押會被部分甚至全部扣除:
- Storage Fault,存儲失當;
- 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/#/
基於 IPFS 的安全檔案存儲 https://peergos.org/
結語
以上內容均為本人使用 IPFS 的經驗,以及多方資料搜集所得。個人能力有限,定會有不足和錯漏。如有發現問題,希望讀者不吝告知。我會盡快更新。