區塊鏈是一個分散式系統,但包括以太坊、EOS在內的諸多公鏈本身實現的都只是資料的分散式計算,而沒有提供資料的分散式儲存,這導致分散式的區塊鏈系統無法真正徹底地做到分散式。
IPFS(Inter Planetary File System,星際檔案系統)協議解決的正是這樣一個問題,它是分散式檔案系統,可以實現資料的分散式儲存。同時它也是一個去中心化網路的基礎設施,包括公鏈在內的不同型別的應用都可以構建在它的基礎之上。
如果說公鏈是高速公路,IPFS則是高速公路路面之下的層層地基中重要的一層,它為不同的公鏈和應用提供資料的分散式儲存這一支援。
IPFS並非全新發明,它是幾十年來分散式系統探索的產物,綜合了包括DHT(Distributed Hash Table),BitTorrent,Git和SFS(Self-Certified Filesystems)在內的優秀思想。IBFS對它們做出適合區塊鏈系統的改進,並透過分層設計將它們組合成一個新的系統。
本文將去繁從簡,以資料的存取過程為線索,透過對IPFS最關鍵的三個系統技術的分析,看它是如何滿足區塊鏈資料的分散式儲存需求的。
Merkle DAG
當把檔案儲存到IPFS系統中時,檔案並不是以一個完整的個體被儲存,檔案資料以平均分割法的方式被切分成若干個256KB大小的塊。這些塊在經過雜湊運算後,也並不是儲存在單箇中心化的伺服器上,而是分開儲存在網路中的各個分散式的節點之中,沒有節點擁有特權。
這一分散式儲存的難點不在於檔案的切割或加密,而在於如何把這些被分割的和被分開儲存的資料重新組合成一個檔案,這正是IPFS協議的第一個關鍵技術——Merkle DAG(Merkle Directed Acyclic Graph,默克爾有向無環圖)。
Merkle DAG從Git系統(林納斯·託瓦茲創作的分散式版本控制系統)改造而來,是在Merkle Tree(如下圖所示)的基礎上構建,儲存的是雜湊值。IPFS上大部分資料物件都是以Merkle DAG的結構存在。
當從網路中獲取檔案時,先從可信的節點獲得檔案的Merkle Tree樹根雜湊值。一旦獲得了樹根,就可以從其他不可信的節點獲取Merkle Tree的各個節點的雜湊值。透過可信的樹根來檢查接收到的Merkle Tree節點,如果Merkle Tree某節點是損壞的或者虛假的,就從其他儲存節點獲得另一個Merkle Tree節點,直到最終獲得一個與可信樹根匹配的Merkle Tree。
這樣一來,從上至下,直到獲得最底層的被切割成小塊的資料的雜湊,最終形成一個完整的正確的檔案。
由於Merkle DAG是基於雜湊值的,而雜湊值取決於資料塊的內容,因此IPFS協議擁有內容定址的功能(HTTP是基於域名定址),此外它還有防篡改和去重複的功能。防篡改是因為可以透過檢查雜湊值來確認資料是否被篡改;去重複是由於相同內容的資料塊雜湊是相同的,可以去掉重複的資料,節省儲存空間。
DHT
依靠Merkle DAG,可以構建一個資料結構用於實現分散式的資料儲存,但還缺最後一步,Merkle DAG儲存的雜湊值如何定位到具體儲存資料的節點,也就是說,應該把資料分配到哪一個網路節點去儲存,以及去從哪一個網路節點獲得儲存資料。DHT(Distributed Hash Table,分散式雜湊表)便是用來解決這一問題的方法。
雜湊表是一種儲存“鍵值對( Key/Value Pairs)”的容器,它能方便快速地透過key值來獲得 value值。在DHT中,key是被儲存資料的雜湊值,透過K/V可以實現資料塊與目標節點的對映關係。
雜湊表被分割成不連續的塊,每個節點被分配一個屬於自己的雜湊塊,也稱做區間表,併成為這個雜湊塊的管理者,當使用者儲存資料時,系統對資料進行雜湊運算,根據雜湊運算的結果決定此資料由哪個節點負責儲存,並生成雜湊表。
當使用者提取資料的時候,用同樣的演算法計算資料的雜湊,然後從雜湊表獲得對應的資料儲存位置(如下圖所示)。
DHT是分散式系統的關鍵技術,實現它的方法有很多種,IPFS採用的是基於S / Kademlia和Coral的演算法。
BitSwap
僅僅實現資料的分散式儲存還遠遠不夠,資料還需要在節點之前有效的交換,從而使得整個系統能夠高效運轉。IPFS協議 受BitTorrent 的啟發,透過對等節點間交換資料塊來分發資料。
BitTorrent 是一種點對點傳輸的網路協議,它可以在存有不信任對等節點的網路中分發資料,對於一個檔案,下載的使用者數越多,下載的速度就越快,部分的網路擁堵或伺服器宕機也不會對整個系統造成大的影響。不過BitTorrent有一個致命的缺點,就是節點往往更多的是索取而不是貢獻。
如何激勵節點分享資料?IPFS在BitTorrent的基礎上進行了創新,增加了包括信用、策略、帳單在內的體系,這一體系之上的新的資料交換協議被稱做BitSwap。
在BitSwap協議下,傳送資料給其他節點可以增加節點信用值,而從其他節點接受資料則會降低節點信用值。
也就是說,如果一個節點持續分享資料,其他節點給它傳送資料的概率就會越來越大;而如果一個節點只接收資料而不分享資料,其他節點給它傳送資料的概率就會越來越低,直到低到被其他節點忽略(如下圖所示)。
此外,BitSwap獲取資料塊的時候不限於從同一組對等節點中,在該協議裡存在一個對等節點形成的大叢集,它包括所有的資料塊,這使得BitSwap的效率相比於BitTorrent更高。
結語
Juan Benet在2014年5月成立了Protocol Labs協議實驗室,並在2015年1月釋出了IPFS。IPFS在本質上是一個內容定址的分散式儲存和傳輸協議。
IPFS被寄予厚望,它是目前階段最好的分散式儲存解決方案之一,人們甚至認為它可能取代超文字傳輸協議(HTTP,HyperText Transfer Protocol)。但另一方面,它在目前階段還不夠成熟,仍面臨著包括安全性、可用性在內的諸多問題。