libp2p原本是協議實驗室(protocollab)IPFS專案的網路層,後來因為其具有顛覆傳統網際網路架構的能力被獨立成一個單獨的專案,我們從圖1的IPFS棧結構可以有更直觀的認識。簡單來說,libp2p就是幫助連結節點的一個庫,任意兩個節點,不管在哪裡,不管處於什麼環境,不管執行什麼作業系統,不管是不是在NAT之後,只要他們有物理上鍊接的可能性,那麼libp2p就會幫你完成這個連結。
現在讓我們舉一個例子來闡述libp2p的重要性,假設老祖告訴我們達摩社羣20萬社羣成員需要訪問一個網站查閱資訊,網站伺服器就會同時接受20萬個http請求,這個過程導致了以下幾個問題:
1. 網站伺服器可能無法同時響應20萬個請求,因此大部分社羣成員訪問不了網站。
2. 運營商機房故障,導致使用該運營商的社羣成員訪問不了網站。
3. 網站的內容由於各種原因不能被訪問,導致某些國家的社羣成員訪問不了網站。
這些問題暴露出來的問題在於我們的網站資訊是中心化的,某些因素對社羣成員能否訪問網站有決定性因素。libp2p就是用於解決這個問題,假設我們20萬社羣成員都安裝了DMCH的服務,DMCH藉助libp2p把20萬個社羣成員互聯,此時當社羣成員去訪問網站的時候,情況從訪問一箇中心化網站變成了社羣成員之間的互相訪問,這將形成訪問效率和訪問成功率指數級上升的局面。
當前分散式去中心化網路的問題
今天的大多數網際網路公司都有集中的伺服器,其中大部分都託管在資料中心。我們今天看到的網際網路仍然以某種方式充滿了類似於電話接線員的服務,這些服務高度集中和脆弱。今天,我們比以往任何時候都更加依賴網際網路,我們在生死關頭都依賴於它。但目前的網際網路,是相當脆弱的,並且存在許多設計問題,這些問題大多源於位置定址。所謂的位置定址就是當我們要透過網際網路訪問一張照片的時候,需要在瀏覽器裡輸入http://darmacash.com/cat.png,這個網頁連結就是位置定址。
目前的解決方案是內容定址,它是彈性更強的分散式點對點網路模型。但是要實現內容定址,有很多來自於傳統網際網路的阻力,主要體現為NAT,防火牆,網路延遲,網路可靠性,漫遊,監管,不同裝置的不同標準,技術迭代的緩慢等各種因素。
libp2p並不是第一個使用點對點內容定址模型的專案。像Emule,Kazaa,LimeWire,Napster,BitTorrent這樣的專案數不勝數,其中一些甚至一直存在到今天。即使有些專案流行起來,但都存在著各種問題。WebRTC就是一個很好的例子,它是Web平臺的點對點傳輸應用,但它的大部分開源實現都是透過駭客借鑑Chrome瀏覽器構建的,因此存在缺陷且不可靠。
分散式點對點去中心化網路需要一個面向未來的框架,該框架可以有效地封裝所有標準,並具備以下優點:
· 更快的創新:因為當前的網際網路需要模組化和互相相容化屬性。
· 面向未來的系統:在未來新增新事物時,系統能夠保持一致性。
· 交叉相容:不僅允許新增新的東西,也需要保留對以前使用的標準的支援,確保老系統的可用性。
因此libp2p登上歷史舞臺了,他是一個工具包,允許建立和管理標準和協議,這些標準和協議致力於解決上述問題。
libp2p主要解決的問題
傳輸
libp2p的基礎是傳輸層,它負責從一個對等點到另一個對等點的實際資料傳輸和接收。目前使用的跨網路傳送資料的方式有很多種,更多的方式正在開發中,還有更多的方式有待設計。libp2p提供了一個簡單的介面,可以修改該介面以支援現有和未來的協議,從而允許libp2p應用程式在許多不同的執行時和網路環境中執行。
身份
在一個擁有數十億聯網裝置的世界裡,知道自己在和誰說話是安全可靠通訊的關鍵。libp2p使用公鑰加密作為對等身份的基礎,這有兩個互補的目的。首先,它以PeerId的形式為每個對等點提供一個全域性唯一的“名稱”。其次,PeerId允許任何人檢索所標識的對等體的公鑰,從而實現對等體之間的安全通訊。
安全
我們必須能夠在對等方之間安全地傳送和接收資料,這意味著我們需要信任通訊的對等方的身份,並且任何第三方都不能讀取我們的對話或進行實時更改。libp2p支援將傳輸提供的連線“升級”到安全加密的通道中。這個過程很靈活,可以支援多種加密通訊的方法。當前預設使用secio,secio正在開發支援TLS1.3。
對等路由
當您想要向另一個對等點傳送訊息時,您需要兩條關鍵資訊:他們的PeerId,以及在網路上定位他們的方法以建立連線。在許多情況下,我們只有我們想要聯絡的對等方的PeerId,因此我們需要一種方法來發現他們的網路地址。對等路由是透過利用其他對等裝置的知識來發現對等裝置地址的過程。在對等點路由系統中,對等點可以提供我們需要的地址(如果他們有地址),或者將我們的查詢傳送給另一個更有可能獲得答案的對等點。隨著我們聯絡越來越多的對等點,我們不僅增加了找到我們正在尋找的對等點的機會,而且在我們自己的路由表中構建了更完整的網路檢視,這使得我們能夠回答來自其他人的路由查詢。libp2p中當前穩定的對等路由實現使用分散式雜湊表,使用Kademlia路由演算法迭代地將請求路由到更接近所需PeerId的位置。
內容發現
在某些系統中,我們更關心的是他們能為我們提供什麼,而不是我們在和誰交談。例如,我們可能想要一些特定的資料,但是我們並不關心從誰那裡得到它,因為我們能夠驗證它的完整性。libp2p為此提供了一個內容路由介面,使用的是基於Kademlia的分散式雜湊表。
訊息傳遞/PubSub
向其他對等點傳送訊息是大多數對等系統的核心,而pubsub(Publish/Subscribe的縮寫)是向感興趣的接收者組傳送訊息的一種非常有用的模式。libp2p定義了一個pubsub介面,用於向訂閱了 “主題”的所有對等點傳送訊息。該介面目前有兩個穩定的實現方法:Flowdsub使用非常簡單但效率低下的“網路泛洪”策略,而gossipsub定義了一個可擴充套件的gossip協議。Episub也正在積極開發中,episub是一種擴充套件的gossipsub,它針對單源多播場景進行了最佳化。
現在讓我們透過幾張圖片更好的理解libp2p:
libp2p是P2P協議的集合
libp2p模組化的特點可以對接各種介面
正如我們在上面看到的,libp2p是一組構建模組的集合,這些公開的構建模組是可組合、可交換、可升級的。換句話說,libp2p採用當前的“垂直” OSI模型並將其設為水平結構。
上圖網路模型有幾個缺點:
· 在多個層中重複操作,因此存在大量重複工作和資源浪費的情況。
· 資訊隱藏在各層之間,錯失了重大的改進機會。
上述缺點主要是因為網際網路協議分佈在多個層上,並且非常緊密地耦合在一起,這使得它們很難改變,從而阻礙了創新。而libp2p改變了這一點,提供了一個框架,所有這些協議都可以在其中共存和協作,見下圖。
DMCH與libp2p
我們已經對libp2p的重要性進行了闡述,那麼DMCH使用libp2p框架意味著什麼呢?首先是技術實力,使用libp2p作為分散式點對點去中心化網路的網路框架對於開發人員的要求比較高,目前使用libp2p框架的區塊鏈專案有DMCH, Polkadot, Ethereum 2.0以及Libra。其次是生態應用,我們知道libp2p源於IPFS(見下圖),而IPFS分散式儲存的激勵生態是Filecoin。
考慮到DMCH開發人員對於DMCH生態的公告資訊(見下圖),我們有理由相信基於DMCH生態的“IPFS”和“FileCoin”是開發團隊已經在著手準備的事情。
更近一步,我們關注到開發人員提到的KCPVPN資訊中其實對應到兩個github的專案:
· https://github.com/libp2p/go-libp2p/issues/193
· https://github.com/paralin/go-libp2p-kcp
我想大家已經從連結中的go兩個字母猜測到了這是libp2p的GO相關專案,我們在公鏈技術系列文章一中提到開發人員選用GO語言進行專案開發的雄心在libp2p框架就有了對應,GO語言能夠很快與libp2p進行整合。此外,熟悉分散式點對點網路的讀者應該都清楚,針對跨國跨境的複雜情況,libp2p採用的QUIC不一定能解決問題,而KCP才是利器,KCP已經被幾十萬遊戲大軍無國界的廣泛使用,而基於KCPVPN+BGP routing形成的區塊鏈網際網路更是令人期待。
達摩社羣區塊鏈技術小組(Bodhi)將持續關注DMCH專案的發展,並在完成公鏈技術系列文章後給大家帶來DMCH生態應用分享。