Juan Benet:ipfs——content Addressed, Versioned, P2p File System@2014
IPFS (星際檔案系統) 主要論點詳盡解釋
本文檔(草稿 3)介紹了星際檔案系統(InterPlanetary File System,IPFS),這是一個雄心勃勃的點對點(P2P)分散式檔案系統專案,旨在將所有計算裝置連接到一個統一的檔案系統中。IPFS 的核心願景是建立一個更具彈性、效率和持久性的網路基礎設施,解決當前以 HTTP 為主的中心化網路所面臨的挑戰,例如單點故障、資料消失風險、低效率的資料傳輸以及難以處理巨量資料等問題。
IPFS 的主要論點可以歸納為以下幾個核心概念及其綜合應用:
-
以內容定址的 Merkle DAG 作為基礎資料結構: 這是 IPFS 最根本的創新之一。不同於傳統檔案系統以位置定址(例如,基於伺服器位址和路徑),IPFS 以內容本身的加密雜湊值作為物件的唯一識別碼和位址。所有 IPFS 中的資料都建模為一個 Merkle 有向無環圖(Merkle DAG)。這個結構繼承並擴展了 Git 的物件模型,具有以下關鍵特性:
- 內容定址 (Content Addressing): 每個物件的雜湊值都由其內容計算而來。這意味著只要內容不變,其雜湊值就不變,提供了一種固定的、與位置無關的資料連結方式。
- 不可變動性 (Immutability): 一旦一個物件被創建,其內容和雜湊值就確定下來,無法更改。任何內容的修改都會產生一個新的物件和新的雜湊值。這提供了資料的持久性和版本控制的基礎。
- 資料完整性與驗證 (Data Integrity and Verification): 通過驗證物件的內容與其雜湊值是否匹配,可以確保資料在傳輸或儲存過程中未被篡改或損壞。這使得 IPFS 節點可以在不信任提供資料的對等節點的情況下驗證資料的真實性。
- 重複資料刪除 (Deduplication): 如果兩個不同的檔案或資料區塊擁有完全相同的內容,它們在 IPFS 中將被儲存為同一個物件。這顯著提高了儲存效率,尤其是在處理共享內容或資料的不同版本時。
- 版本控制基礎: Merkle DAG 結構天然支援版本控制。通過建立新的物件並將其鏈接到舊的物件,可以輕鬆地追蹤資料的變更歷史。Git 的提交(commit)物件就是這種應用的一個典型例子。
- 鏈接結構: IPFS 物件可以包含指向其他 IPFS 物件的鏈接(以其雜湊值表示)。這些鏈接構成了 Merkle DAG 的邊,允許構建任意複雜的資料結構,包括檔案系統目錄、資料庫、區塊鏈等。這種結構使得遍歷和引用資料變得簡單且安全。
-
融合現有成功分散式系統的優點: IPFS 並非從零開始設計,而是巧妙地整合了許多已經被證明成功的技術和思想,並將它們組合成一個內聚的系統:
- 分散式雜湊表 (Distributed Hash Table, DHT): 借鑑了 Kademlia 和 Coral DSHT 的思想。DHT 在 IPFS 中扮演著路由和索引的角色,用於儲存和查詢哪些節點擁有特定的內容(以其雜湊值表示)或尋找特定對等節點的網路位址。Coral 的「就近優先」以及區塊大小區分儲存方式的思想有助於降低延遲和避免熱點。S/Kademlia 的安全性增強(如 NodeId 的自我證明和 Sybil 攻擊防護)也為 IPFS 的身份系統提供了基礎。
- 點對點區塊交換 (P2P Block Exchange): 吸取了 BitTorrent 的經驗,設計了一個名為 BitSwap 的區塊交換協議。BitSwap 允許節點在不同的檔案或資料結構之間交換數據區塊,而不僅僅限於單個檔案。它引入了一個簡單的「信用」系統來激勵節點分享數據,懲罰只下載不分享的節點(leeches),從而促進數據在網路中的有效分發和複製。這個機制是 IPFS 實現高效數據傳輸的關鍵。
- 版本控制系統 (Version Control Systems): 受到 Git 的深遠影響。IPFS 的檔案物件模型(blob, list, tree, commit)直接來源於 Git,並針對分散式檔案系統的需求進行了調整。這使得 IPFS 能夠原生支援檔案和目錄的版本控制,並能夠利用 Git 的強大工具鏈和工作流程。
-
自我證明檔案系統 (Self-Certified Filesystems, SFS): 應用了 SFS 中的自我證明命名思想。IPFS 引入了 IPNS(InterPlanetary Name System),這是一個基於節點公鑰雜湊的命名空間 (
/ipns/<NodeId>)。節點可以使用其私鑰簽署一個指向 Merkle DAG 中某個物件(通常是一個提交物件)的指標,並將這個指標發布到 DHT 中。這樣,使用者就可以通過這個可變動的 IPNS 名稱來獲取由特定節點發布的最新版本的內容,同時通過公鑰驗證其來源的真實性,而無需信任任何中心化的命名服務。
-
分層設計的協定堆疊: IPFS 的設計被分解為一系列相互協作的子協定層。這些層共同構成了 IPFS 的功能堆疊,包括:
- 身份層 (Identities): 處理節點身份的生成與驗證,基於 S/Kademlia 的自我證明機制。
- 網路層 (Network): 管理節點之間的連接,支援多種底層網路傳輸協議(如 TCP, uTP, WebRTC),並處理網路位址(使用 multiaddr 格式)以及連接性、可靠性、完整性和真實性等問題。
- 路由層 (Routing): 負責定位對等節點和物件,預設使用基於 S/Kademlia 和 Coral 的 DSHT,但可替換以適應不同網路環境。
- 交換層 (Exchange): 實現 BitSwap 協議,處理數據區塊的 P2P 交換與激勵。
- 物件層 (Objects): 定義了核心的 Merkle DAG 結構和物件格式,實現內容定址和鏈接。
- 檔案層 (Files): 在物件層之上定義了檔案系統的物件模型(blob, list, tree, commit),提供版本控制和檔案系統的抽象。
- 命名層 (Naming): 實現 IPNS,提供可變動的自我證明命名。
這種分層設計提高了系統的模組化程度和可替換性,使得 IPFS 能夠適應多樣化的應用場景和底層網路環境。
-
解決現有網路挑戰並開創新的應用場景: IPFS 的設計直接針對了 HTTP 等現有協定的不足,並開啟了新的可能性:
- 高效的數據分發: 通過內容定址和 BitSwap,IPFS 可以從多個節點同時獲取數據,並且在區域網路或地理位置接近的節點之間優先交換數據(受 Coral 的影響),大大提高了大型檔案和數據集的下載速度和效率。內容定址帶來的重複資料刪除也減少了不必要的數據傳輸。
- 抵抗單點故障與資料消失: 由於資料以區塊形式分發並儲存在多個節點上,IPFS 沒有中心化的伺服器。即使某些節點離線,只要還有其他節點儲存了數據,數據就可以被訪問。通過「物件釘選」(Pinning),使用者可以確保他們關心的數據及其鏈接的數據被保留在自己的節點上,從而有效防止檔案因託管伺服器關閉而消失,為「永久的網路」奠定基礎。
- 無需信任的內容傳遞: 內容定址和雜湊驗證意味著使用者可以驗證獲取到的數據是否與其預期的內容一致,而無需信任提供數據的節點。這增強了數據的安全性。
- 支援離線訪問: 由於 IPFS 將數據儲存在本地節點的快取中,一旦數據被下載過,即使在離線狀態下,只要本地節點仍然運行,就可以從本地快取中快速訪問這些數據。
- 多樣化的應用: IPFS 不僅僅是一個檔案系統,其基礎 Merkle DAG 結構足夠靈活,可以用於構建各種分散式應用,如版本控制的資料庫、加密的通訊平台、分散式應用程式的發布平台、內容分發網路(CDN)、甚至作為虛擬機器的檔案系統或開機系統等。它提供了一個通用的、分散式的數據管理與分發層。
總之,IPFS 的主要論點在於,通過巧妙地綜合內容定址、Merkle DAG、分散式雜湊表、點對點區塊交換以及自我證明命名等已驗證的技術,可以構建一個高性能、彈性、安全且去中心化的分散式檔案系統。這個系統不僅能解決現有網路架構的痛點,更能為未來更開放、更強健的網路應用提供堅實的基礎,最終實現一個更接近「永久網路」的願景。IPFS 的力量在於其各個組件的協同作用,使其整體效能遠超單個組件的總和。
comments
comments for this post are closed