比肩IPFS和Filecoin,為什麼說libp2p將成為區塊鏈和物聯網的基礎設施?
10月20日,在由晨霧科技主辦的中國IPFS開發者沙龍上,晨霧科技的聯合創始人徐瀟,他帶來了名為《libp2p詳解》的主題演講。
libp2p為什麼重要呢?今年7月份,協議實驗室將libp2p提升為一級專案,與IPFS和Filecoin比肩,libp2p還是IPFS與Filecoin的基礎設施,也就是說它們的底層技術完全是基於libp2p實現的。而且,libp2p更是未來p2p應用、區塊鏈和物聯網的基礎設施。它高度抽象了主流的傳輸協議,使得上層應用搭建時完全不必關注底層的具體實現最終實現跨環境、跨協議的裝置互聯。
徐瀟的演講聚焦於libp2p的實現原理與核心流程。他對libp2p中的核心元件在系統中的功能與實現細節一一做了介紹,並詳細解讀了libp2p初始化結點、撥號、監聽、rpc和資料交換等核心流程。
以下內容為巴位元整理。
我主要為大家講的是go的實現,它其實還有rust和JS實現。之所以只講go,是因為go是它的第一個產品庫,也是實現最全面的一個庫。
一、libp2p概要
1、libp2p是什麼?
libp2p就是幫助你連結節點的一個庫。它的特性是什麼?就是任意兩個節點,不管在哪裡,不管處於什麼環境,不管執行什麼作業系統,不管是不是在NAT之後,只要他們有物理上鍊接的可能性,那麼libp2p就會幫你完成這個連結。
現在對於協議實驗室來說,libp2p處於非常重要的一個模組,它是IPFS和filecoin的網路層。大家如果對它有很深的認識,就會發現IPFS裡的很多功能就是對libp2p的一個簡單抽象與包裝。換句話說,如果你有一些新的想法,完全可以基於libp2p這個庫實現一個新的IPFS。
libp2p是一個rpc框架。rpc過程指的是節點1想告訴節點2一些資料,我先序列化成位元組流,能夠在網路中傳輸,然後進入真正的傳輸層,節點2再反序列化拿到這個資料。其實libp2p還不是最底層的模組,它下面還有一個Multiformats的庫,Multiformats提供各種功能的抽象層,並把這些功能抽象成一個統一的介面。
libp2p還是一個工具庫。為什麼這麼說呢?因為我們平常在做軟體開發的時候,不光要關注底層,比如tcp連結,還需要關注連結狀態等資訊。協議實驗室通過他過去的一些經驗,總結出了所有開發者基本都需要的一些功能,把它們放到了libp2p庫裡面,相當於完善了傳輸層。我簡單列了一些,這些工具的功能主要包括連結複用、ID交換、中繼、NAT穿越、dht發現、RTT統計等。
2、為什麼要做libp2p?
之所以要做libp2p,是因為在做IPFS的時候,遇到了大量的異構裝置,執行著不同的作業系統,網路環境非常複雜,比如在中國有各個NAT,還有某些場景下,可能用不了tcp連結,還有就是檔案系統多樣性,以及很可能需要協議變遷,比如比特幣已經經歷過很多次的協議變遷,每次都需要51%的節點支援。那麼其實可以通過一種比較巧妙的方式來完成。
未來等IPv6出來以後,很可能是物聯網、P2P應用、區塊鏈的大爆發時期,尤其是物聯網。所以協議實驗室決定把他們遇到的問題全部抽象出來,做個libp2p的庫,讓其他開發者能夠直接使用這個庫,遮蔽掉所有問題,只關注業務邏輯即可。
3、libp2p目標及現狀
libp2p的目標很遠大,但是協議實驗室現在只做到了一部分,不過已經可以基本滿足使用了。我列出了libp2p的目標和現狀,大家可以大致看一下。
二、libp2p原理
1、核心元件關係圖如下圖所示,這是libp2p核心元件的關係圖。
先簡單介紹一下,第一層是介面層,最上面就是它幫我們實現的一些介面功能。然後就是host,這兩個host是有互相繼承關係的,routed的是basic的一個擴充套件實現。在libp2p中,一個host是一個節點,所以在IPFS中,都是以host為單位進行資料分發與傳輸的。接下來我慢慢來講細節。
2、核心元件詳解
transport
首先我要講transport,它在應用層和傳輸層中間,看這個就知道其實很簡單,之所以要把它封裝起來,基於兩個理由,一是現在世界上流行的傳輸協議可能只有這些,但協議是不斷演進的。 二是我們平常去找ip地址,有個弊端就是沒法指定協議。所以這個東西的核心就是把各個傳輸層全部抽象為一個統一的介面,只要匹配好介面就可以了。這也是為什麼我們說開發p2p網路不用再關注底層傳輸協議的原因。
upgrader
接下來講一下upgrader,我們知道傳統的https協議中,底層是tcp,上面加了一個加密套接字層,其實這個加密套接字層就是upgrader,但是libp2p中,它的功能更多了一些,大概有四層,我會逐層講解。
首先以tcp連結舉例,我的一個原始連結,先經過filter,filter是一個地址過濾器,protector就是私網,IPFS也是通過它來實現的。Secure就是加密層,muxer是複用機制。
filter upgrader,這一層非常簡單,它就是判斷一個地址在不在我的黑白名單裡面。
protector upgrader,這一層叫保護網路,其實也叫私有網路,因為它的執行原理就是你如果建了一個分散式應用,如果在私網下建,首先你要生成一個金鑰,然後把這個金鑰分發到所有的節點中,在每一個節點在初始化的時候,會用這個金鑰對連結進行設定,設定了以後,在通訊的時候,就會先互換一個隨機數,再用這個隨機數以及這個金鑰來加密整個的傳輸通道。為什麼叫私有網路呢,因為你沒有這個金鑰,根本就無法跟別人通訊。
Secure upgrader,就是類似TLS的加密連結層。這一層目前使用的加密方式有兩種,一個是對稱加密,一個是非對稱加密,非對稱加密用來握手,對稱加密用來加密通道。比如兩個節點間的三次握手,第一次握手互換資訊,比如你的公鑰是多少,nonce是什麼,還有我支援的非對稱加密的列表和對稱加密列表,以及我們支援的雜湊方式列表。協商之後開始第二次握手,交換資訊,包括臨時金鑰和簽名信息,根據對方的公鑰進行加密,對方用自己的私鑰去解密就好。然後兩個人之間已經協商出了可用的通訊金鑰。第三次握手其實是驗證資訊,驗證對方有沒有按照正確的方式生成。
Mux upgrader,它也叫鏈路複用器。顧名思義就是複用了同一個鏈路,在一個鏈路上面可以開啟多個連結。
relay
再來講一下中繼transport,它對中國的部分場景還是非常有用的,主要是因為涉及到NAT的問題。中繼的實現方案是這樣一個框架圖,底層是tcp連結,再監聽,然後新的tcp連結進來並進行升級,得到了中繼的一個流,如果中繼是代理到這裡就結束了。如果是末端節點,那麼它把這個stream又抽象成了一個連結的概念,進而在監聽器上面起了一個新的連結,叫中繼連結,對中繼連結進行升級,得到一個stream,就到業務邏輯了。中繼很有意思的一點,不管中繼listener監聽到了多少物理連結,底層對應的都是一個物理連結,所以中繼場景下的連結都是輕量級的。
peerinfo
再來講一下peerinfo,它代表了一個節點的相關資訊,它包含的內容就兩點,一個是ID,ID是誰?就是我的名字,ID怎麼來的?通過公鑰,經過一次雜湊得到的,也是一個節點的唯一標誌。另外就是地址資訊,我這個ID的具體地址是什麼,包含3份資訊,監聽地址、觀測地址、NAT對映地址。
peerstore
peer store的結構如上圖,它類似於我們傳統生活中的電話本、通訊地址薄,會記錄所有你知道的人的相關資訊,比如說key book會記錄一些公私鑰的資訊,metrics會記錄連結的耗時時間,通過加權平均值的方式對這個節點進行評估。addr book就是地址的一個資訊,預設的實現裡面是一個帶超時的地址資訊,當然這個超時時間可以設為零。最後一個data store就是給地址打標籤的意思。
swarm
swarm可以說是libp2p的一個核心,因為它才是真正的網路層。所有跟網路相關的東西全部在swarm裡面,地址簿、連結、監聽器都在這管理,它得有一個回撥機制。讓上層註冊,當有一個新的stream進來以後,要呼叫一個相當於中轉函式的概念。transport管理是說一個節點可以支援多種transport,dialer就是撥號器,不過它實際上有點複雜,同時我覺得也很厲害!感興趣的朋友可以關注一下。它裡面有三種撥號器,一個是同步撥號器,一個是後臺限制撥號器,一個是有限制的撥號器,這三個撥號器會共同作用於整個撥號的過程。
然後講一下NAT,這塊可能大家都會比較關注,從目前實現方式來講,NAT叫穿越不如叫對映。當下它的一個實現方式,就是我啟動一個節點,先檢查一下我附近的NAT裝置執行的是什麼協議,再獲取到NAT的一個裝置地址,然後對這個監聽地址進行週期性的埠對映。但很可惜的是,目前只限於兩種協議(Upnp、NAT-pmp)且在僅有一層NAT的時候有可能成功。美國的情況和中國的差異非常大,在美國,普通人的手機都能拿到公網ip地址。
host
最後說一下host,是我們操作的核心,一個host底下有這麼幾個部分組成,首先network,ID service就是我們身身份互換的一個功能,然後nat-manager就是剛剛我說的對映,conn-manager是連結管理。
3、核心流程詳解
(此處流程比較複雜,如果沒有技術背景且沒有看過相關原始碼,可能難以理解;如有需要,可與徐瀟團隊聯絡。此處暫不闡述)
三、libp2p應用場景
應用場景這部分我簡單講一下,畢竟libp2p還處於不斷的迭代中,現在還處於開發的階段,目前基本上處於demo這樣一個階段的應用。
首先是物聯網,我認為對於物聯網場景來說, P2P連結是很重要的一環, ,比如, 安防場景下, 安防攝像頭與手機之間,建立連結的話最好是直連,否則中央伺服器的頻寬撐不住,此時對於該場景來說, libp2p可以幫助其完成鏈路上的連結工作, 並額外完成了諸如NAT打洞(目前尚未實現, 但正在完善中), 流量及RTT統計, 長連線, 流式加密傳輸, 服務端主動與終端通訊等工作.此外, libp2p也能適用於諸如車聯網, 無人車等終端不斷在各個網路間切換, 導致其ip資訊不斷變化的場景, 基於節點ID的連結方式及DHT路由發現機制, 可以有效遮蔽掉底層物理連結與上層邏輯的耦合度. 對於資訊化時代的逐步到來與演進, 由個體產生的UGC內容在全網的佔比將越來越多, 如何有效的將對的資訊快速分發到對的人手裡(如抖音與快手的關注視訊, 直播平臺的實時推流等), 同時降低中心化伺服器的頻寬壓力, 將是未來發展的一條重要路線.
第二個就是區塊鏈,已經有專案在利用libp2p作為它的底層,相當於分發層、呼叫層、傳輸層、網路層了。比如剛才多次提到filecoin,在“區塊資料同步”、“檔案傳輸”、“節點查詢”等不少核心環節都使用了libp2p。還有Polkadot波卡鏈, 作為可能成為區塊鏈3.0的開闢者, 併為了相容現有的諸如eth以太坊等主鏈而採用的異構多鏈架構, 更要考慮終端裝置的複雜場景, 因此其選擇使用libp2p作為其底層傳輸層, 利用libp2p在各個模組的高度抽象帶來的靈活性及可擴充套件性, 來避免現在及未來因區塊鏈技術變遷導致的不相容問題.
第三個是分散式聊天,就是我們通過ipfs網路互相之間傳送聊天資訊,也不用管對方鏈路到底是怎麼樣的,也不用管中央伺服器。
第四個就是傳輸檔案,IPFS就是用這個做的,所以這個應用性非常之廣。
對LibP2P技術的小夥伴可以多瞭解一下,多進行踴躍的嘗試,謝謝。