德陽(yáng)城鄉(xiāng)建設(shè)部網(wǎng)站首頁(yè)網(wǎng)站創(chuàng)建
文章目錄
- 第一部分:libp2p 快速入門
- 一、什么是libp2p
- libp2p 發(fā)展歷程
- libp2p的特性
- p2p 網(wǎng)絡(luò)和我們熟悉的 client/server 網(wǎng)絡(luò)的區(qū)別:
- 二、Libp2p的實(shí)現(xiàn)目標(biāo)
- 三、Libp2p的用途
- 四、運(yùn)行 Libp2p 協(xié)議流程
- libp2p 分為三層
- libp2p 還有一個(gè)局域網(wǎng)節(jié)點(diǎn)發(fā)現(xiàn)協(xié)議 mDNS
- 第二部分:使用實(shí)戰(zhàn)
- 一、基本接口
- multiaddr
- Host
- protocol.ID
- 如何封裝 libp2p?
- 二、基本使用
- 參考
第一部分:libp2p 快速入門
一、什么是libp2p
libp2p 官網(wǎng):非常重要,會(huì)解釋非常多的新概念,是學(xué)習(xí) libp2p 的第一課。
libp2p spec:這個(gè)是比官網(wǎng)更詳細(xì)的開(kāi)發(fā)指導(dǎo)手冊(cè),所有語(yǔ)言的實(shí)現(xiàn)都基于這個(gè) specs。
rust-libp2p: libp2p 的 Rust 實(shí)現(xiàn)。
Libp2p是一個(gè)模塊化的網(wǎng)絡(luò)棧,通過(guò)將各種傳輸和P2P協(xié)議結(jié)合在一起,使得開(kāi)發(fā)人員很容易構(gòu)建大型、健壯的P2P網(wǎng)絡(luò)。
libp2p 的產(chǎn)生是一個(gè)漫長(zhǎng)的過(guò)程。 它是對(duì)網(wǎng)絡(luò)協(xié)議棧的深層次的挖掘, 豐富了過(guò)去點(diǎn)對(duì)點(diǎn)的協(xié)議。在過(guò)去的15年里面, 構(gòu)建大規(guī)模的點(diǎn)對(duì)點(diǎn)分布式應(yīng)用及其復(fù)雜, libp2p的目標(biāo)就是希望讓事情變得簡(jiǎn)單。 Libp2p 設(shè)計(jì)的初衷就是為了支持未來(lái)的去中心化網(wǎng)絡(luò)協(xié)議,它的宗旨是讓開(kāi)發(fā)者進(jìn)行應(yīng)用程序開(kāi)發(fā)時(shí),能確保他們的服務(wù)是可達(dá)且可用的。
如果說(shuō)TCP/IP協(xié)議是互聯(lián)網(wǎng)時(shí)代網(wǎng)絡(luò)層的標(biāo)準(zhǔn),那么libp2p的愿景是希望成為區(qū)塊鏈時(shí)代,網(wǎng)絡(luò)層的標(biāo)準(zhǔn)。 雖然離這個(gè)目標(biāo)還想去甚遠(yuǎn), 但隨著ipv4地址的耗盡,以及區(qū)塊鏈浪潮的到來(lái),這苗星星之火仿佛已經(jīng)燃起。
bp2p 包含一系列協(xié)議的實(shí)現(xiàn),這些協(xié)議共同作用,完成了:
p2p 網(wǎng)絡(luò)的傳輸層(下圖綠色):支持幾乎所有的主流傳輸協(xié)議,甚至允許不同節(jié)點(diǎn)間使用不同的傳輸層,比如 native 節(jié)點(diǎn)間優(yōu)先使用 QUIC,而 native 和 web 節(jié)點(diǎn)間使用 websocket。
節(jié)點(diǎn)發(fā)現(xiàn)(黃色,注意這里 PKI 是指基于 PKI 的節(jié)點(diǎn)身份):一般本地網(wǎng)絡(luò)可以使用 mDNS,大規(guī)模 p2p 網(wǎng)絡(luò)一般使用 bootstrap 來(lái)連接初始節(jié)點(diǎn),然后通過(guò) gossip 獲取更多節(jié)點(diǎn)信息,并通過(guò) Kad DHT 來(lái)查找節(jié)點(diǎn)。
節(jié)點(diǎn)路由(藍(lán)色):主要使用 Kad DHT 通過(guò)多跳來(lái)路由到網(wǎng)絡(luò)中任意一個(gè)節(jié)點(diǎn)
內(nèi)容路由(紫色):如果點(diǎn)對(duì)點(diǎn)發(fā)送消息,可以通過(guò) Kad DHT,如果在網(wǎng)絡(luò)中 flood,可以通過(guò) floodsub 和 gossipsub 來(lái)對(duì)某個(gè) topic 的內(nèi)容進(jìn)行廣播。
NAT traversal(紅色):包括主流的 hole punching 解決方案
(圖片來(lái)源:A network framework for decentralized P2P application development [2])
libp2p 發(fā)展歷程
libp2p孵化于ipfs項(xiàng)目, 最初libp2p是ipfs的網(wǎng)絡(luò)層實(shí)現(xiàn)。 在過(guò)去的數(shù)十年間, 構(gòu)建分布式p2p項(xiàng)目,一直是困擾大家的難題。 為簡(jiǎn)化這種操作,libp2p項(xiàng)目應(yīng)運(yùn)而生,libp2p是一組網(wǎng)絡(luò)協(xié)議套件,任何人,任何應(yīng)用都可以使用libp2p進(jìn)行構(gòu)建分布式應(yīng)用。可以說(shuō)libp2p項(xiàng)目極大簡(jiǎn)化了底層技術(shù)的開(kāi)發(fā)難度,我們可以基于libp2p構(gòu)建自己的分布式系統(tǒng)。
libp2p is used by IPFS as its networking library.
libp2p被用作IPFS的網(wǎng)絡(luò)層。
libp2p 處于ipfs項(xiàng)目的最底層。最開(kāi)始,libp2p是在ipfs項(xiàng)目里面的,只是ipfs項(xiàng)目中的一個(gè)網(wǎng)絡(luò)層模塊,大概在2017年左右, protocol lab對(duì)整個(gè)產(chǎn)品序列與技術(shù)棧進(jìn)行了重新規(guī)劃,ipfs項(xiàng)目被拆分成了很多個(gè)子項(xiàng)目,而這每一個(gè)子項(xiàng)目相互獨(dú)立,又各有關(guān)聯(lián)。 在整個(gè)項(xiàng)目發(fā)展過(guò)程中,尤其是在18年,整個(gè)項(xiàng)目模塊化重構(gòu),被拆的很細(xì)。而以大的產(chǎn)品類別進(jìn)行劃分,可以劃分為以下產(chǎn)品棧:
- ipfs
- libp2p
- filecoin
- ipld
ibp2p 模塊在 IPFS 中主要負(fù)責(zé)數(shù)據(jù)的傳遞功能,即路由、網(wǎng)絡(luò)、交換等。
libp2p是一套點(diǎn)對(duì)點(diǎn)的協(xié)議來(lái)發(fā)現(xiàn)節(jié)點(diǎn),并連接他們,發(fā)現(xiàn)內(nèi)容,并轉(zhuǎn)移它們。
libp2p的主要功能是:
- 發(fā)現(xiàn)節(jié)點(diǎn)
- 連接節(jié)點(diǎn)
- 發(fā)現(xiàn)數(shù)據(jù)
- 傳輸數(shù)據(jù)
libp2p的特性
- Transport傳輸:
傳輸層是libp2p的基礎(chǔ),它負(fù)責(zé)數(shù)據(jù)從一個(gè)節(jié)點(diǎn)到另一個(gè)節(jié)點(diǎn)的可靠發(fā)送和接收。libp2p提供了一個(gè)可用于適配支持現(xiàn)有或未來(lái)傳輸協(xié)議的簡(jiǎn)單的接口,從而允許libp2p應(yīng)用可以運(yùn)行在不同的運(yùn)行時(shí)和網(wǎng)絡(luò)環(huán)境中。最新版本的go-libp2p已支持TCP/TLS、WebSocket、QUIC傳輸層實(shí)現(xiàn)。
- Identity身份驗(yàn)證:
libp2p使用公鑰作為節(jié)點(diǎn)身份的基礎(chǔ),這么做有兩個(gè)互補(bǔ)的用途,一是根據(jù)公鑰可以為節(jié)點(diǎn)提供一個(gè)全局唯一的身份ID(PeerId),二是所有節(jié)點(diǎn)可以用PeerId恢復(fù)出被認(rèn)證過(guò)的節(jié)點(diǎn)的公鑰,用于它們之間建立安全通訊。
- Security安全性:
libp2p支持將傳輸層提供的一個(gè)連接“upgrading”到一個(gè)安全加密通道中。這種方式很靈活,可以支持多種通訊加密方式。當(dāng)前l(fā)ibp2p支持TLS1.3和Noise兩種(老版本支持已棄用的Secio)。
- PeerRouting節(jié)點(diǎn)路由:
當(dāng)你想要向另一個(gè)節(jié)點(diǎn)發(fā)送一個(gè)消息時(shí),你需要知道兩個(gè)信息:它的PeerId和它的網(wǎng)絡(luò)地址。在很多情況下我們只有對(duì)方的PeerId,我們需要一種可以找到它們的網(wǎng)絡(luò)地址的方法。節(jié)點(diǎn)路由是通過(guò)利用其他節(jié)點(diǎn)的信息發(fā)現(xiàn)目標(biāo)節(jié)點(diǎn)的網(wǎng)絡(luò)地址的過(guò)程。
在一個(gè)節(jié)點(diǎn)路由系統(tǒng)中,若我們想知道節(jié)點(diǎn)A的信息,我們可以向節(jié)點(diǎn)B請(qǐng)求查詢,如果節(jié)點(diǎn)B有節(jié)點(diǎn)A的信息,則我們可以獲得節(jié)點(diǎn)A的信息;如果節(jié)點(diǎn)B沒(méi)有節(jié)點(diǎn)A的信息,則節(jié)點(diǎn)B會(huì)返回給我們一個(gè)它認(rèn)為可能知道節(jié)點(diǎn)A的信息的節(jié)點(diǎn)C的信息,我們可以再向節(jié)點(diǎn)C請(qǐng)求查詢。隨著我們查詢?cè)絹?lái)越多的節(jié)點(diǎn),我們不僅增加了找到節(jié)點(diǎn)A信息的概率,同時(shí)我們還在自己的路由表中建立了一個(gè)更完整的網(wǎng)絡(luò)視圖,這樣我們也可以為別的節(jié)點(diǎn)提供路由查詢服務(wù)。
當(dāng)前,libp2p的節(jié)點(diǎn)路由的穩(wěn)定實(shí)現(xiàn)是使用分布式哈希表(distributed hash table)基于Kademlia路由算法迭代查詢實(shí)現(xiàn)的。
- Content Discovery 內(nèi)容發(fā)現(xiàn)服務(wù):
在一些系統(tǒng)中,我們更關(guān)心的是它能為我們提供什么,而不是我們?cè)诤驼l(shuí)通訊。比如,我們想要一個(gè)文件,我們可以驗(yàn)證這個(gè)文件的完整性,所以我們不關(guān)心從誰(shuí)那拿到這個(gè)文件。
libp2p為這個(gè)場(chǎng)景提供了一個(gè)內(nèi)容路由接口(content routing interface),它的穩(wěn)定實(shí)現(xiàn)也是基于與節(jié)點(diǎn)路由中相同的KadDHT實(shí)現(xiàn)的。
- Messaging / PubSub 消息傳輸及發(fā)布訂閱:
向其他節(jié)點(diǎn)發(fā)送消息是大多數(shù)P2P系統(tǒng)的核心功能,而PubSub是一種非常有用的模式用于給一組訂閱者發(fā)送消息。
libp2p定義了一個(gè)可以向已訂閱指定Topic的所有節(jié)點(diǎn)發(fā)送消息的PubSub接口,該接口有兩種實(shí)現(xiàn):floodsub和gossipsub。默認(rèn)使用gossipsub。
p2p 網(wǎng)絡(luò)和我們熟悉的 client/server 網(wǎng)絡(luò)的區(qū)別:
p2p 網(wǎng)絡(luò)的每一個(gè)節(jié)點(diǎn)既是客戶端,又是服務(wù)器
p2p 網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn),都(潛在)是數(shù)據(jù)的發(fā)起者和存儲(chǔ)者(對(duì)比:c/s 網(wǎng)絡(luò)中,server 擁有數(shù)據(jù))
p2p 網(wǎng)絡(luò)很不穩(wěn)定,節(jié)點(diǎn)可能進(jìn)進(jìn)出出(對(duì)比:c/s 網(wǎng)絡(luò),服務(wù)器非常穩(wěn)定,一般 SLA 都有幾個(gè)9)
p2p 網(wǎng)絡(luò)需要某種機(jī)制來(lái)實(shí)現(xiàn)節(jié)點(diǎn)的發(fā)現(xiàn)和查找(對(duì)比:c/s 網(wǎng)絡(luò),客戶端知道服務(wù)器在哪,如何訪問(wèn))
p2p 網(wǎng)絡(luò)(往往)需要 NAT traversal / Hole punching 等技術(shù)來(lái)允許兩個(gè)節(jié)點(diǎn)之間通訊。這是因?yàn)楹芏喙?jié)點(diǎn)(比如說(shuō)家庭網(wǎng)絡(luò))往往藏在運(yùn)營(yíng)商的 NAT 服務(wù)器之后。
二、Libp2p的實(shí)現(xiàn)目標(biāo)
- 支持各種各樣的傳輸方式:
- 傳輸:TCP,UDP,SCTP,UDP,uTP,QUIC,SSH,etc.
- 安全傳輸:TLS,DTLS,CurveCP,SSH
- 有效使用sockets(連接重用)
- 允許端點(diǎn)之間的交流可以在一個(gè)socket上復(fù)用(避免過(guò)多的握手)
- 允許端點(diǎn)之間通過(guò)一個(gè)協(xié)商過(guò)程使用多協(xié)議以及各自的版本
- 向后兼容
- 在現(xiàn)在的系統(tǒng)中可以運(yùn)行
- 充分使用當(dāng)前網(wǎng)絡(luò)技術(shù)的能力
- 實(shí)現(xiàn)NAT轉(zhuǎn)換
- 實(shí)現(xiàn)連接中繼
- 實(shí)現(xiàn)加密通道
- 充分使用基礎(chǔ)傳輸(例如原生的流復(fù)用等)
三、Libp2p的用途
認(rèn)識(shí)Libp2p的用途
參考URL: https://baijiahao.baidu.com/s?id=1654695941739663075&wfr=spider&for=pc
-
物聯(lián)網(wǎng)
對(duì)于物聯(lián)網(wǎng)場(chǎng)景來(lái)說(shuō),P2P連接是很重要的一環(huán)。比如,在安防場(chǎng)景,安防攝像頭與手機(jī)之間最好建立直連連接。如此可以大幅度減輕中央服務(wù)器的帶寬壓力。libp2p可以幫助其完成鏈路上的連接工作,同時(shí)可以完成諸如NAT打洞(目前尚未實(shí)現(xiàn),但正在完善中)、流量及RTT統(tǒng)計(jì)、長(zhǎng)鏈接、流式加密傳輸、服務(wù)端主動(dòng)和終端通信等工作。此外,libp2p在車聯(lián)網(wǎng)領(lǐng)域也有適合的應(yīng)用場(chǎng)景。由于該場(chǎng)景中終端設(shè)備會(huì)不斷在各種網(wǎng)絡(luò)之間進(jìn)行切換,導(dǎo)致其IP地址信息不斷發(fā)生變化。**libp2p基于節(jié)點(diǎn)ID的鏈接方式及DHT路由發(fā)現(xiàn)機(jī)制,可以解除底層物理鏈接與上層邏輯的耦合。隨著互聯(lián)網(wǎng)的發(fā)展,應(yīng)用規(guī)模越來(lái)越大,如何有效且快速地分發(fā)信息,同時(shí)降低中心化服務(wù)器的壓力,是未來(lái)網(wǎng)絡(luò)技術(shù)發(fā)展的一個(gè)重要方向。
-
區(qū)塊鏈
在區(qū)塊鏈領(lǐng)域里面已經(jīng)有項(xiàng)目利用libp2p作為自己的底層服務(wù),比如之前多次提到的 Filecoin。在“區(qū)塊數(shù)據(jù)同步”“文件傳輸”節(jié)點(diǎn)查找”等核心環(huán)節(jié)都使用了libp2p。還有 Polkadot(波卡鏈)項(xiàng)目,作為可能成為區(qū)塊鏈3.0的開(kāi)辟者,為了兼容現(xiàn)有的諸如以太坊等主鏈而采用異構(gòu)多鏈架構(gòu),更要考慮終端設(shè)備的復(fù)雜場(chǎng)景,因此選擇使用libp2p作為其底層傳輸層,利用libp2p在各個(gè)模塊中的高度抽象帶來(lái)的靈活性及可擴(kuò)展性,來(lái)避免因區(qū)塊鏈技術(shù)發(fā)展而導(dǎo)致的不兼容問(wèn)題。 -
分布式消息
分布式消息系統(tǒng),可以不通過(guò)中心服務(wù)器的中轉(zhuǎn)功能,直接在節(jié)點(diǎn)之間建立連接,用于消息的發(fā)送和接收。去除了中心化服務(wù)器,可以有效防止單點(diǎn)失效、網(wǎng)絡(luò)攻擊。 -
傳輸文件
Filecoin和IPFS是基于libp2p來(lái)進(jìn)行數(shù)據(jù)傳輸?shù)?。?duì)于點(diǎn)對(duì)點(diǎn)文件傳輸,libp2p將有非常廣泛的應(yīng)用場(chǎng)景。
四、運(yùn)行 Libp2p 協(xié)議流程
-
運(yùn)行 Libp2p 協(xié)議的節(jié)點(diǎn)在初始化之后需要通過(guò)各種方式發(fā)現(xiàn)更多的節(jié)點(diǎn),比如 Bootstrap list、mDNS、DHT 等,這主要由發(fā)現(xiàn)模塊負(fù)責(zé)與實(shí)現(xiàn)。
-
當(dāng)發(fā)現(xiàn)更多接點(diǎn)后,Libp2p 會(huì)把這些獲取到的節(jié)點(diǎn)信息存儲(chǔ)在分布式記錄存儲(chǔ)模塊中,供以后方便使用。
-
當(dāng)上層應(yīng)用需要連接某個(gè)節(jié)點(diǎn)時(shí),節(jié)點(diǎn)路由模塊會(huì)找到多條不同的路徑,連接管理模塊會(huì)對(duì)這些路徑進(jìn)行嘗試連接。
-
連接成功之后,上層應(yīng)用將通過(guò)內(nèi)容路由模塊與連接節(jié)點(diǎn)進(jìn)行內(nèi)容交互,在底層通過(guò)傳輸模塊互相傳遞數(shù)據(jù)。
下面我們具體分析一下連接的建立過(guò)程,主要包括3個(gè)步驟,包括地址解析、傳輸協(xié)議適配、雙方協(xié)商。
- 地址解析
- 傳輸協(xié)議適配
- 雙方協(xié)商
連接建立之后,libp2p 會(huì)首先進(jìn)行雙方協(xié)商,確定對(duì)方支持哪些功能。負(fù)責(zé)協(xié)商功能的是 identify 協(xié)議,它是內(nèi)置在 libp2p 的基礎(chǔ)協(xié)議,能夠交換節(jié)點(diǎn)的公鑰、本地監(jiān)聽(tīng)地址等。
協(xié)商完成后,連接兩端的節(jié)點(diǎn)會(huì)找到共同支持的協(xié)議,并且初始化它們。初始化時(shí)會(huì)注冊(cè)每種協(xié)議的 handler(回調(diào)函數(shù)),當(dāng)有協(xié)議數(shù)據(jù)到達(dá)時(shí),相應(yīng)的 handler 就會(huì)被調(diào)用。 由于多種傳輸協(xié)議會(huì)復(fù)用同一個(gè)底層連接,所以連接會(huì)被拆分成多個(gè)“流(Stream)”。
libp2p 分為三層
-
Transport 傳輸層:負(fù)責(zé)數(shù)據(jù)的傳輸。
底層網(wǎng)絡(luò)協(xié)議:支持 TCP / UDP / QUIC 等;
安全協(xié)議:支持 TLS 1.3 / Noise;
多路復(fù)用(Stream Multiplexing):支持 Yamux,mplex 從 libp2p-0.52.0 開(kāi)始不再支持。 -
Protocols 協(xié)議層:負(fù)責(zé)數(shù)據(jù)的處理。
一個(gè) P2P 節(jié)點(diǎn)要使用很多 Protocols,包括節(jié)點(diǎn)發(fā)現(xiàn)(Kademlia、Identify、Ping)、內(nèi)容發(fā)現(xiàn)(Gossipsub)、和請(qǐng)求響應(yīng)(Request-Response)
libp2p 定義了很多官方協(xié)議 spec,我們也可以實(shí)現(xiàn)自己的協(xié)議,這是封裝 libp2p 的方式之一。
一個(gè) Protocol 包含兩個(gè)核心部分:Behaviour 和 BehaviourEvent。在構(gòu)造 Swarm 時(shí)需要 Behaviour;在處理 SwarmEvent 時(shí)需要處理 BehaviourEvent。 -
Swarm 控制層:負(fù)責(zé)將 Transport 和 Protocols 結(jié)合起來(lái),相當(dāng)于 HTTP Server 中的 Controller。
libp2p 還有一個(gè)局域網(wǎng)節(jié)點(diǎn)發(fā)現(xiàn)協(xié)議 mDNS
第二部分:使用實(shí)戰(zhàn)
官方demo程序:https://github.com/libp2p/go-libp2p/tree/master/examples
libp2p 分為三層:transport, swarm, protocol
運(yùn)行一個(gè) P2P 節(jié)點(diǎn)的步驟:構(gòu)造 transport -> 構(gòu)造 protocol -> 構(gòu)造 swarm -> 運(yùn)行 swarm -> 處理 swarm events
- Transport 傳輸層:負(fù)責(zé)數(shù)據(jù)的傳輸。// 相當(dāng)于 tinychain 的網(wǎng)絡(luò)層
- Protocols 協(xié)議層:負(fù)責(zé)數(shù)據(jù)的處理。// 相當(dāng)于 tinychain 的業(yè)務(wù)層,libp2p 沒(méi)有狀態(tài),所以不需要數(shù)據(jù)層
- Swarm 控制層:負(fù)責(zé)將 Transport 和 Protocols 結(jié)合起來(lái),相當(dāng)于 HTTP Server 中的 Controller。 /
一、基本接口
multiaddr
libp2p使用了multiaddr,一個(gè)自描述的地址形式,可以理解為不同協(xié)議不同地址類型的一個(gè)封裝。這使得libp2p可以不透明的處理系統(tǒng)中的所有地址,支持網(wǎng)絡(luò)層中的各種傳輸協(xié)議。
Host
// Host is an object participating in a p2p network, which
// implements protocols or provides services. It handles
// requests like a Server, and issues requests like a Client.
// It is called Host because it is both Server and Client (and Peer
// may be confusing).
type Host interface {// ID returns the (local) peer.ID associated with this HostID() peer.ID// Peerstore returns the Host's repository of Peer Addresses and Keys.Peerstore() peerstore.Peerstore// Returns the listen addresses of the HostAddrs() []ma.Multiaddr// Networks returns the Network interface of the HostNetwork() network.Network// Mux returns the Mux multiplexing incoming streams to protocol handlersMux() protocol.Switch// Connect ensures there is a connection between this host and the peer with// given peer.ID. Connect will absorb the addresses in pi into its internal// peerstore. If there is not an active connection, Connect will issue a// h.Network.Dial, and block until a connection is open, or an error is// returned. // TODO: Relay + NAT.Connect(ctx context.Context, pi peer.AddrInfo) error// SetStreamHandler sets the protocol handler on the Host's Mux.// This is equivalent to:// host.Mux().SetHandler(proto, handler)// (Threadsafe)SetStreamHandler(pid protocol.ID, handler network.StreamHandler)// SetStreamHandlerMatch sets the protocol handler on the Host's Mux// using a matching function for protocol selection.SetStreamHandlerMatch(protocol.ID, func(string) bool, network.StreamHandler)// RemoveStreamHandler removes a handler on the mux that was set by// SetStreamHandlerRemoveStreamHandler(pid protocol.ID)// NewStream opens a new stream to given peer p, and writes a p2p/protocol// header with given ProtocolID. If there is no connection to p, attempts// to create one. If ProtocolID is "", writes no header.// (Threadsafe)NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (network.Stream, error)// Close shuts down the host, its Network, and services.Close() error// ConnManager returns this hosts connection managerConnManager() connmgr.ConnManager// EventBus returns the hosts eventbusEventBus() event.Bus
}
protocol.ID
func DhtProtocolName(netName dtypes.NetworkName) protocol.ID {return protocol.ID("/fil/kad/" + string(netName))
}
...dht.ProtocolPrefix(build.DhtProtocolName(nn)),
//ProtocolPrefix設(shè)置附加到所有DHT協(xié)議的特定于應(yīng)用程序的前綴。例如,
///myapp/kad/1.0.0而不是/ipfs/kad/1.0.0。前綴的格式應(yīng)為/myapp。
//
//默認(rèn)為默認(rèn)dht.DefaultPrefix (dht包下 const DefaultPrefix protocol.ID = “/ipfs”)
如何封裝 libp2p?
自定義 protocol:工作量很大,可能要重新實(shí)現(xiàn)官方已提供的 protocols
自定義 swarm event handlers:較簡(jiǎn)單,找到要處理哪些 evnets,問(wèn)題就解決了一半
二、基本使用
官方demo:https://github.com/libp2p/go-libp2p/tree/master/examples/libp2p-host
創(chuàng)建 libp2p 主機(jī)
// To construct a simple host with all the default settings, just use `New`
h, err := libp2p.New()
if err != nil {panic(err)
}
defer h.Close()fmt.Printf("Hello World, my p2p hosts ID is %s\n", h.ID())
如果您想對(duì)配置進(jìn)行更多控制,則可以為構(gòu)造函數(shù)指定一些選項(xiàng)。有關(guān)構(gòu)造函數(shù)支持的所有配置的完整列表,請(qǐng)參閱文檔中的不同選項(xiàng) 。
在此片段中,我們?cè)O(shè)置了許多有用的選項(xiàng),例如自定義ID并啟用路由。這將提高同伴在NAT’ED環(huán)境上的可發(fā)現(xiàn)性和可達(dá)到性:
// Set your own keypair
priv, _, err := crypto.GenerateKeyPair(crypto.Ed25519, // Select your key type. Ed25519 are nice short-1, // Select key length when possible (i.e. RSA).
)
if err != nil {panic(err)
}var idht *dht.IpfsDHTh2, err := libp2p.New(// Use the keypair we generatedlibp2p.Identity(priv),// Multiple listen addresseslibp2p.ListenAddrStrings("/ip4/0.0.0.0/tcp/9000", // regular tcp connections"/ip4/0.0.0.0/udp/9000/quic", // a UDP endpoint for the QUIC transport),// support TLS connectionslibp2p.Security(libp2ptls.ID, libp2ptls.New),// support Noise connectionslibp2p.Security(noise.ID, noise.New),// support QUIClibp2p.Transport(libp2pquic.NewTransport),// support any other default transports (TCP)libp2p.DefaultTransports,// Let's prevent our peer from having too many// connections by attaching a connection manager.libp2p.ConnectionManager(connmgr.NewConnManager(100, // Lowwater400, // HighWater,time.Minute, // GracePeriod)),// Attempt to open ports using uPNP for NATed hosts.libp2p.NATPortMap(),// Let this host use the DHT to find other hostslibp2p.Routing(func(h host.Host) (routing.PeerRouting, error) {idht, err = dht.New(ctx, h)return idht, err}),// Let this host use relays and advertise itself on relays if// it finds it is behind NAT. Use libp2p.Relay(options...) to// enable active relays and more.libp2p.EnableAutoRelay(),
)
if err != nil {panic(err)
}
defer h2.Close()fmt.Printf("Hello World, my second hosts ID is %s\n", h2.ID())
參考
參考資料:libp2p-specifications : https://github.com/libp2p/specs
為什么 ETH2.0 要選擇 libp2p ?
參考URL: https://blog.csdn.net/shangsongwww/article/details/89428696
libp2p 替代方案調(diào)研
參考URL: https://www.jianshu.com/p/214ec5f54bbd
參考資料:libp2p-specifications : https://github.com/libp2p/specs
Libp2p學(xué)習(xí)(一)
參考URL: https://www.cnblogs.com/YuzhouQiang/p/10593160.html
IPFS世界的物流系統(tǒng):libp2p
參考URL: https://blog.csdn.net/IPFS_Newb/article/details/83186581
長(zhǎng)安鏈P2P網(wǎng)絡(luò)技術(shù)介紹(2):初識(shí)LibP2P
參考URL: https://cloud.tencent.com/developer/article/1988253
網(wǎng)絡(luò)協(xié)議十二之P2P協(xié)議
參考URL: https://www.cnblogs.com/SuoLiweng/articles/16574502.html
[推薦]06 | libp2p: 需求分析與封裝思路
參考URL: https://zhuanlan.zhihu.com/p/643357754
【go-libp2p學(xué)習(xí)筆記】使用go-libp2p搭建中轉(zhuǎn)服務(wù)器(circuit relay server)
參考URL: https://blog.csdn.net/Cake_C/article/details/127630718
[推薦]探索 libp2p:基本知識(shí)
參考URL: https://cloud.tencent.com/developer/article/1836307