一文讀懂IPFS:新一代網際網路底層協議

語言: CN / TW / HK

什麼是IPFS

為去中心化網際網路(web3.0)提供動力。

一種點對點超媒體協議,通過使網路可升級、彈性和更開放的方式儲存與發展人類的知識。

IPFS 是一個分散式系統,用於儲存和訪問檔案、網站、應用程式和資料。

HTTP

"IPFS"對標的是一個叫"HTTP"的東西,這你可能比較熟悉,當你上網開啟百度搜索頁面時,它所見即所得。

web的應用層協議是超文字傳輸協議(HTTP),它是傳統web的核心。HTTP由兩個程式實現:一個客戶程式和一個伺服器程式。客戶程式和伺服器程式執行在不同的端系統,通過交換HTTP進行會話。HTTP定義了這些資料的結構以及客戶端和伺服器進行互動的方式。

web頁面是由物件組成的,一個物件只是一個檔案,諸如一個HTML檔案,一個JPEG圖形,或一段小影片片這樣的檔案,且它們可以通過URL地址定址。多數web頁面含有一個html基本檔案,以及幾個引用物件。

HTTP定義了web客戶向web伺服器請求web頁面的方式,以及伺服器向客戶傳送web頁面的方式。

而瀏覽器做的工作就是執行和解析HTTP協議與前端程式碼然後將內容展示出來,提交查詢的時候通常是web端查詢它的資料庫然後將結果返回給請求方,也就是瀏覽器,然後瀏覽器展示出來。

HTTP協議的弊端

我們現在使用網際網路都是在http或https協議下執行的,http協議也就是超文字傳輸協議,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議,從1990年提出至今已經32年了,他對於目前網際網路的爆炸性成長居功至偉,成就了網際網路的繁榮。

但是HTTP協議是基於C/S架構下的網際網路通訊協議,基於主幹網路中心化執行的機制,也存在諸多弊端。

  1. 網際網路上的資料經常因為檔案被刪除或伺服器關閉而永久被抹去。有人統計過目前網際網路上的web頁面平均儲存壽命只有100天左右,我們經常看到一些網站出現"404錯誤"。

  2. 主幹網路執行效率低,使用成本高。使用HTTP協議每次需要從中心化的伺服器下載完整的檔案,速度慢、效率低。

  3. 主幹網路併發機制制約網際網路訪問速度。這種中心化主幹網路的模式也導致在高併發情況下網路訪問時候的擁堵。

  4. 在現有的http協議下,所有的資料都儲存在這些中心化伺服器上,網際網路巨頭們不但對我們的資料有絕對的控制權和解釋權,各種各樣的監管、封鎖、監控一定程度上也極大的限制了創新和發展。

  5. 成本高,易被攻擊,為了支撐HTTP協議,對於大流量公司,比如百度、 騰訊 、阿里等,投入大量資源維護伺服器和安全隱患,防止DDoS等攻擊。主幹網路受制於戰爭,自然災害,中心伺服器宕機等因素,都可能造成整個網際網路中斷服務。

IPFS的解決方案

  1. IPFS提供了檔案的歷史版本回溯功能,可以很容易的檢視檔案的歷史版本, 且資料無法刪除,可以得到永久儲存。

  2. IPFS是基於內容定址的儲存模式,相同的檔案都不會重複儲存,它會把過剩的資源擠壓下來,包括儲存空間都釋放出來,資料儲存成本就會降低。如果改用P2P的方式下載,頻寬使用成本可以節省近60%。

  3. IPFS是基於P2P網路,可以有多個源儲存了資料,可以併發從多個節點下載資料。

  4. 建立在去中心化的分散式網路上的IPFS很難被中心化管理和限制,網際網路將更加開放。

  5. IPFS分散式儲存可以極大的降低對中心主幹網路的依賴。

言簡意賅地說:

HTTP依賴中心化伺服器,容易遭受攻擊,訪問量暴增伺服器容易宕機,下載速度慢,儲存成本高;

而IPFS是分散式節點,更加安全不易被DDoS攻擊,不依賴主幹網,降低儲存成本且儲存空間大,下載速度快還能查詢檔案歷史版本記錄,並且理論上能永久儲存。

新的技術取代老的技術,無非就兩點:

第一,能提高系統效率;

第二,能夠降低系統成本。

IPFS把這兩點都做到了。

IPFS的團隊在開發時,採用高度模組整合化的方式,像搭積木一樣去開發整個專案。協議實驗室團隊2015年創立,到17年的時間裡都在做IPLD、LibP2P、Multiformats這三個模組的開發,它們服務於IPFS底層。

Mutiformats是一系列 hash 加密演算法和自描述方式(從值上就可以知道值是如何生成)的集合,它具有 SHA1 \ SHA256 \ SHA512 \ Blake3B 等6種主流的加密方式,用以加密和描述nodeID以及指紋資料的生成。

LibP2P是IPFS核心中的核心,面對各式各樣的傳輸層協議以及複雜的網路裝置,它可以幫助開發者迅速建立一個可用P2P網路層,快速且節約成本,這也是為什麼IPFS技術被眾多區塊鏈專案青睞的緣由。

IPLD其實是一個轉換中介軟體,將現有的異構資料結構統一成一種格式,方便不同系統之間的資料交換和互操作。現在IPLD支援的資料結構,例如 比特幣以太坊 的區塊資料,也支援IPFS和IPLD。這也是IPFS為什麼受到區塊鏈系統歡迎的原因之二,它的IPLD中介軟體可以把不同的區塊結構統一成一個標準進行傳遞,為開發者提供了成功性比較高的標準,不用擔心效能、穩定和bug。

IPFS好處

  • 融合了Kademlia、BitTorrent、Git等理念的一種 超媒體分發協議

  • 避免了中心節點失效,無審查和管控的完全去中心化的 點到點傳輸網路

  • 駛入網際網路的明天——新的瀏覽器已經預設支援IPFS協議(brave,opera),傳統瀏覽器可以通過訪問地址如 https://ipfs.io 等的公共IPFS閘道器,或者安裝 IPFS 伴侶 擴充套件來訪問儲存在IPFS網路中的檔案

  • 下一代內容分發網路CDN——只需要在本地節點新增檔案就可以使得全球都可以通過快取友好的內容雜湊地址和類BitTorrent網路頻寬分發來獲得檔案

  • 依託強大的開源社群為後盾,為構建 完整分散式應用和服務 的一個 開發者工具集

IPFS把檔案在系統中如何儲存、索引和傳輸都定義好,也就是將上傳好的檔案轉換成專門的資料格式進行儲存,同時IPFS會將相同的檔案進行了hash計算,確定其唯一的地址。所以無論在任何裝置,任意地點,相同的檔案都會指向相同的地址(不同於URL,這種地址是原生的,由加密演算法保證的,你無法改變,也無需改變)。然後通過一個檔案系統將網路中所有的裝置連線起來,然後讓儲存在IPFS系統上的檔案,在全世界任何一個地方快速獲取,且不受防火牆的影響(無需網路代理)。所以從根本上說,IPFS能改變WEB內容的分發機制,使其完成去中心化。

IPFS工作原理

IPFS 是一個點對點 (p2p) 儲存網路。可以通過位於世界任何地方的節點訪問內容,這些節點可能會傳遞資訊、儲存資訊或兩者兼而有之。IPFS 知道如何使用其內容地址,而不是其位置來查詢您要求的內容。

理解 IPFS 的三個基本原則:

  1. 通過內容定址的唯一標識

  2. 通過有向無環圖 (DAG) 進行內容連結

  3. 通過分散式雜湊表 (DHT) 發現內容

這三個原則相互依賴,而打造的IPFS 生態系統。讓我們從 內容定址內容的唯一標識 開始

內容定址和內容的唯一標識

IPFS 使用 內容定址 來根據內容而不是位置來識別內容。按內容查詢專案是每個人一直在做的事情。

比如你在圖書館找一本書,經常是按書名來找的;那是內容定址,因為你在問它是什麼。

如果你使用位置定址來查詢那本書,你會通過它的位置來找:"我想要在二樓的書,第三個書架,第四層,從左邊算起四本書。"

如果有人搬了那本書,那你就倒黴了!

網際網路和您的計算機上都存在這個問題!現在,內容是按位置查詢的,例如:

  • https://en.wikipedia.org/wiki/Aardvark

  • /Users/Alice/Documents/term_paper.doc

  • C:\Users\Joe\My Documents\project_sprint_presentation.ppt

相比之下,每條使用 IPFS 協議的內容都有一個* 內容識別符號 *,即 CID。雜湊對於它所來自的內容來說是唯一的,即使它與原始內容相比可能看起來很短。

許多分散式系統通過雜湊使用內容定址,不僅可以識別內容,還可以將其連結在一起——從支援程式碼的提交到執行加密貨幣的區塊鏈,一切都利用了這種策略。然而,這些系統中的底層資料結構不一定是可互操作的。

CID (Content Identifiers )

CID 規範 起源於 IPFS,現在以多格式存在,並支援包括 IPFS、IPLD、libp2p 和 Filecoin 在內的廣泛專案。儘管我們將在整個課程中分享一些 IPFS 示例,但本教程是關於 CID 本身的剖析,每個分散式資訊系統都將其用作引用內容的核心識別符號。

內容識別符號或 CID 是一個自描述的內容定址識別符號。它並不表示內容儲存_在哪裡_,而是根據內容本身形成一種地址。CID 中的字元數取決於基礎內容的 加密雜湊 ,而不是內容本身的大小。由於 IPFS 中的大多數內容都使用 雜湊 sha2-256 ,因此您遇到的大多數 CID 將具有相同的大小(256 位,相當於 32 位元組)。這使它們更易於管理,尤其是在處理多條內容時。

例如,如果我們在 IPFS 網路上儲存了土豚的影象,它的 CID 將如下所示: QmcRD4wkPPi6dig81r5sLj9Zm1gDCL4zgpEj9CfuRrGbzF

之前的演示過的uniswap的IPFS連結:

建立 CID 的第一步是轉換輸入資料,使用 加密演算法 將任意大小的輸入(資料或檔案)對映到固定大小的輸出。這種轉換稱為 雜湊數字指紋 或簡稱 雜湊 (預設使用sha2-256)。

使用的 加密演算法 必須生成具有以下特徵的雜湊值:

  • 確定性:相同的輸入應該總是產生相同的雜湊。

  • 不相關:輸入資料中的一個小變化應該會產生一個完全不同的雜湊。

  • 單向:從雜湊值中回推輸入資料是不可行的。

  • 唯一性:只有一個檔案可以產生一個特定的雜湊。

請注意,如果我們更改土豚影象中的單個畫素,加密演算法將為影象生成完全不同的雜湊。

當我們使用內容地址獲取資料時,我們可以保證看到該資料的預期版本。這與傳統Web 上的位置定址完全不同,在傳統 Web 上,給定地址 (URL) 上的內容會隨時間而變化。

CID的結構

Multiformats

Multiformats在IPFS體系中主要負責身份的加密和資料的自我描述。

Multiformats是未來安全系統的協議集合,自描述格式可以讓系統可互相協作和升級。

Multiformats協議裡面包含以下協議:

multihash - 自描述雜湊

multiaddr - 自描述網路地址

multibase - 自描述基編碼

multicodec - 自描述序列化

multistream - 自描述流網路協議

multigram (WIP) - 自描述分組網路協議

內容連結 有向無環圖(DAG)

Merkle DAG 繼承了CID的可分配性。對 DAG 使用內容定址會對它們的分發產生一些有趣的影響。首先,當然,任何擁有 DAG 的人都能夠充當該 DAG 的提供者。第二個是當我們檢索編碼為 DAG 的資料時,比如檔案目錄,我們可以利用這一事實並行檢索節點的所有子節點,可能來自許多不同的提供者!

三是檔案伺服器不僅限於集中式資料中心,讓我們的資料覆蓋範圍更廣。最後,因為 DAG 中的每個節點都有自己的 CID,所以它所代表的 DAG 可以獨立於它本身嵌入的任何 DAG 進行共享和檢索。

可驗證性

是否曾經備份了檔案,然後在幾個月後找到這兩個檔案或目錄並想知道它們的內容是否相同?你可以為每個備份計算一個 Merkle DAG,而不需要費力地比較檔案:如果根目錄的 CID 匹配,就會知道哪些可以安全地刪除,並釋放硬碟驅動器上的一些空間!

可分配性

例如,一個大型資料的分發。在傳統web網路上:

  • 共享檔案的開發人員負責維護伺服器及其相關費用

  • 同一臺伺服器很可能用於響應世界各地的請求

  • 資料本身可以作為單個檔案存檔以單片方式分佈

  • 很難找到相同資料的替代供應者

  • 資料可能是大塊的,必須從單個供應者那序列下載

  • 其他人很難共享資料

Merkle DAG 幫助我們緩解所有這些問題。通過將資料轉換為內容定址的 DAG:

  • 任何想要的人都可以幫助收發檔案

  • 來自世界各地的節點都可以參與服務資料

  • DAG的每一部分都有自己的CID,可以獨立分發

  • 很容易找到相同資料的替代供應者

  • 構成 DAG 的節點很小,可以從許多不同的供應者處並行下載

所有這些都有助於重要資料的可擴充套件性。

重複資料刪除

例如,以瀏覽網頁為例!當一個人使用瀏覽器訪問網頁時,瀏覽器必須先下載與該頁面相關的資源,包括影象、文字和樣式。其實許多網頁實際上看起來非常相似,只是使用了相同主題其他只是略有變化。這裡會產生很多冗餘。

當瀏覽器足夠優化的時候,可以避免多次下載該元件。每當使用者訪問新網站時,瀏覽器只需下載其 DAG 中與不同部分相對應的節點,而之前已經下載了其他部分不需要再次下載!(想想 WordPress 主題、Bootstrap CSS 庫或常見的 JavaScript 庫)

分散式雜湊表 (DHT)

分散式雜湊表 (DHT) 是用於將鍵對映到值的分散式系統。在 IPFS 中,DHT 被用作內容路由系統的基本元件,並且充當目錄和導航系統之間的交叉點。它將使用者正在尋找的內容對映到儲存匹配內容的peer節點。可以把它想象成一個巨大的表格,儲存誰擁有什麼資料。

Libp2p

libp2p 是一個模組化的網路堆疊,它從 IPFS 演變為一個獨立的專案。 波卡 也在用,eth2.0也在部分使用。

為了解釋為什麼 libp2p 是去中心化網路中如此重要的一部分,我們需要退後一步,瞭解它的來源。libp2p 的初始實現始於 IPFS,一個點對點檔案共享系統。讓我們從探索 IPFS 旨在解決的網路問題開始。

網路

網路是非常複雜的系統,有自己的規則和限制,因此在設計這些系統時,我們需要考慮很多情況和用例:

  • 防火牆:您的膝上型電腦中可能安裝了防火牆,阻止或限制特定連線。

  • NAT:您的家庭 WiFi 路由器,帶有 NAT(網路地址轉換),可將您膝上型電腦的本地 IP 地址轉換為您家外的網路可以連線的單個 IP 地址。

  • 高延遲網路:這些網路的連線速度非常慢,讓使用者等待很長時間才能看到他們的內容。

  • 可靠性:世界各地分佈著許多網路,而且很多使用者經常遇到速度慢的網路,這些網路沒有強大的系統來為使用者提供良好的連線。連線頻繁斷開,使用者的網路系統質量不佳,無法為使用者提供應有的服務。

  • 漫遊:移動定址是另一種情況,我們需要保證使用者的裝置在通過世界各地的不同網路導航時保持唯一可發現性。目前,它們在需要大量協調點和連線的分散式系統中工作,但最好的解決方案是去中心化的。

  • 審查制度:在當前的網路狀態下,如果您是政府實體,在特定網站域中遮蔽網站相對容易。這對於阻止非法活動很有用,但當一個專制政權想要剝奪其人口對資源的訪問權時,就會成為一個問題。

  • 具有不同屬性的執行時:周圍有許多型別的執行時,例如物聯網(物聯網)裝置(Raspberry Pi、Arduino 等),它們正在獲得大量採用。因為它們是用有限的資源構建的,所以它們的執行時通常使用不同的協議,這些協議對它們的執行時做出了很多假設。

  • 創新非常緩慢:即使是擁有大量資源的最成功的公司也可能需要數十年的時間來開發和部署新協議。

  • 資料隱私:消費者最近越來越擔心越來越多不尊重使用者隱私的公司。

P2P協議當前問題

點對點 (P2P) 網路從網際網路的概念中被設想為一種建立彈性網路的方式,即使peer節點由於重大的自然或人為災難而與網路斷開連線,該網路仍能正常工作,從而允許人們繼續通訊。

P2P 網路可用於各種用例,從影片通話(例如 Skype)到檔案共享(例如 IPFS、Gnutella、KaZaA、eMule 和 BitTorrent)。

基礎概念

Peer- 去中心化網路的參與者。peer節點是應用程式中同等特權、同等能力的參與者。在 IPFS 中,當您在膝上型電腦上載入 IPFS 桌面應用程式時,您的裝置將成為去中心化網路 IPFS 中的Peer節點。

Peer-to-Peer (P2P)- 一個分散的網路,工作負載在peer節點之間共享。因此,在 IPFS 中,每個Peer節點都可能託管要與其他peer節點共享的全部或部分檔案。當一個節點請求檔案時,任何擁有這些檔案塊的節點都可以參與傳送請求的檔案。然後,請求資料的節點方可以稍後與其他節點方共享資料。

IPFS 在當前和過去的網路應用和研究中尋找靈感,嘗試改進其 P2P 系統。學術界有大量的科學論文提供瞭如何解決其中一些問題的想法,但是雖然研究產生了初步結果,但它缺乏可以使用和調整的程式碼實現。

現有 P2P 系統的程式碼實現真的很難找到,而且在它們確實存在的地方,由於以下原因,它們通常難以重用或重新調整用途:

  • 檔案不佳或不存在

  • 限制性許可或找不到許可

  • 十多年前最後一次更新的非常舊的程式碼

  • 沒有聯絡點(沒有維護人員可以聯絡)

  • 閉源(私有)程式碼

  • 已棄用的產品

  • 未提供規格

  • 沒有暴露友好的 API

  • 實現與特定用例的耦合過於緊密

  • 無法使用未來的協議升級

必須有更好的方法。看到主要問題是互操作性,IPFS 團隊設想了一種更好的方法來整合所有當前的解決方案並提供一個促進創新的平臺。一種新的模組化系統,可以使未來的解決方案無縫整合到網路堆疊中。

libp2p 是 IPFS 的網路棧,但從 IPFS 中抽離出來,成為獨立一流的專案和 IPFS 的依賴專案。

通過這種方式,libp2p 能夠在不依賴於 IPFS 的情況下進一步發展,獲得自己的生態系統和社群。IPFS 只是成為 libp2p 的眾多使用者之一。

這樣,每個專案都可以只專注於自己的目標:

IPFS 更專注於內容定址,即查詢、獲取和驗證網路中的任何內容。

libp2p 更側重於程序定址,即查詢、連線和驗證網路中的任何資料傳輸程序。那麼 libp2p 是如何做到的呢?

答案是: 模組化

libp2p 已經確定了可以構成網路堆疊的特定部分:

多語言實現,支援7種開發語言,libp2p 的 JavaScript 實現也適用於瀏覽器和移動瀏覽器!這非常重要,因為它使應用程式也可以在桌面和移動裝置上執行 libp2p。

應用程式包括檔案儲存、影片流、加密錢包、開發工具和區塊鏈。可以區塊鏈頂流的專案都已經有采用IPFS的libp2p模組。

IPLD

IPLD 用於理解和處理資料。

IPLD是一個轉換中介軟體,將現有的異構資料結構統一成一種格式,方便不同系統之間的資料交換和互操作,資料模型與解碼,使用CID做為連結。

首先,我們定義了一個“資料模型”,它說明了資料的域和範圍。這很重要,因為它是我們將要構建的一切的基礎。 (廣義地說,我們可以說資料模型“像 JSON”,像map、string、list等) 此後,我們定義了“編解碼器”,它說明了如何從訊息中解析它並作為我們想要的訊息形式發出。 IPLD 有很多編解碼器。您可以根據您希望與之互動的其他應用程式選擇使用不同的編解碼器,或者僅根據您自己的應用程式喜歡的效能與人類可讀性的適合性來選擇使用不同的編解碼器。

IPLD 實現了最上面的三層協議: 物件、檔案、命名

  • 物件層- IPFS 中的資料以 Merkle Directed Acyclic Graph(Merkle DAG)的結構組織,節點稱為物件,可以包含資料或指向其他物件的連結,連結是嵌入在源中的目標資料的加密雜湊。這些資料結構提供了許多有用的屬性,如內容定址、資料防篡改、重複資料刪除等;

  • 檔案層- 為了在 Merkle DAG 之上建模一個類似 Git 的版本控制系統,IPFS 定義瞭如下的物件:

    • blob 資料塊:blob 是一個可變大小的資料塊(無連結),代表一個數據塊;

    • list:用於有序地組織 blob 或其他 lists,通常代表一個檔案;

    • tree:代表目錄幷包含 blobs、lists 以及其他 trees;

    • commit:類似於 Git 的提交,表示物件的版本歷史記錄中的快照;

  • 命名層- 由於物件的每次更改都會改變其雜湊值,因此需要對雜湊值做一個對映。IPNS(Inter Planetary 名稱空間系統)為每個使用者分配一個可變的名稱空間,並且可以將物件釋出到由使用者私鑰簽名的路徑,以驗證物件的真實性。類似 URL。

對應IPLD的展示:

IPFS應用了以上個模組的功能,整合為一種容器化的應用程式,執行在獨立節點上,以Web服務的形式,供大家使用訪問。IPFS允許網路中的參與者互相儲存,索取和傳輸可驗證的資料。但是由於IPFS是開源的,可以被免費下載和使用,並且已經被大量的團隊使用。

Filecoin

運用 IPFS 及技術各個節點可儲存它們認為重要的資料; 但如果沒有簡單的方法,沒有可以激勵他人加入網路或儲存資料,IPFS的推廣難以展開,這時就需要並誕生了Filecoin,IPFS的激勵層,證券化。

Filecoin為 IPFS 添加了激勵性的儲存。IPFS 使用者可以直接可靠地儲存其資料在Filecoin上,從而為網路打開了眾多應用程式和落地場景的大門。