gossip 区块链_区块链中的P2P
區(qū)塊鏈中P2P介紹
p2p是什么
為什么區(qū)塊鏈需要P2P
比特幣、以太坊、超級賬本和EOS的P2P對比
P2P是什么
P2P作為區(qū)塊鏈網(wǎng)絡(luò)中去中心化的標(biāo)識
P2P全稱對等式網(wǎng)絡(luò)(peer-to-peer),又稱點對點技術(shù),是無中心服務(wù)器、依靠用戶群(peers)交換信息的互聯(lián)網(wǎng)體系;與有中心服務(wù)器的中央網(wǎng)絡(luò)系統(tǒng)不同,對等網(wǎng)絡(luò)的每個用戶端既是一個節(jié)點,也有服務(wù)器的功能,任何一個節(jié)點無法直接找到其他節(jié)點,必須依靠其戶群進行信息交流。
優(yōu)勢
可在網(wǎng)絡(luò)的中央及邊緣區(qū)域共享內(nèi)容和資源。在客戶端/服務(wù)器網(wǎng)絡(luò)中,通常只能在網(wǎng)絡(luò)的中央?yún)^(qū)域共享內(nèi)
由對等方組成的網(wǎng)絡(luò)易于擴展,而且比單臺服務(wù)器更加可靠。單臺服務(wù)器會受制于單點故障,或者會在網(wǎng)絡(luò)使用率偏高時,形為瓶頸。
由對等方組成的網(wǎng)絡(luò)可共享處理器,整合計算資源以執(zhí)行分布式計算任務(wù),而不只是單純依賴一臺計算機,如一臺超級計算機。
用戶可直接訪問對等計算機上的共享資源。網(wǎng)絡(luò)中的對等方可直接在本地存儲器上共享文件,而不必在中央服務(wù)器上進行共享。
p2p網(wǎng)絡(luò)的三個特性
離散性:構(gòu)成系統(tǒng)的節(jié)點并沒有任何中央式的協(xié)調(diào)機制。
伸縮性:即使有成千上萬個節(jié)點,系統(tǒng)仍然應(yīng)該十分有效率。
容錯性:即使節(jié)點不斷地加入、離開或是停止工作,系統(tǒng)仍然必須達到一定的可靠度。
為什么區(qū)塊鏈會選擇P2P作為網(wǎng)絡(luò)基礎(chǔ)
上面介紹P2P的時候說過,他是無中心服務(wù)器的,中心服務(wù)器就意味著,當(dāng)受到攻擊的時候,中心服務(wù)器一旦宕機,整個網(wǎng)絡(luò)和服務(wù)就會出現(xiàn)問題。而P2P網(wǎng)絡(luò)的優(yōu)勢在于,每個節(jié)點既是客戶端又是服務(wù)端,所以當(dāng)受到攻擊時,任何一臺機器垮掉,也不會影響整體的服務(wù)。
區(qū)塊鏈的核心是去中心化,這和P2P網(wǎng)絡(luò)的觀念不約而同,所以選擇P2P的理由也就很充分。
通過區(qū)塊鏈技術(shù)學(xué)習(xí)P2P
首先看一下P2P的整體技術(shù)點:
首先是如何發(fā)現(xiàn)peers,在P2P網(wǎng)絡(luò)中,發(fā)現(xiàn)節(jié)點是最開始、最重要和最難的一部分;
節(jié)點之間建立鏈接;發(fā)現(xiàn)節(jié)點之后,就要進行握手鏈接,確定節(jié)點之間的通信協(xié)議等
節(jié)點之間的通信;鏈接建立之后,就可以正常的進行通信了;
以上三點解決之后,基本就可以實現(xiàn)一個簡單的P2P網(wǎng)絡(luò)。如果想要實現(xiàn)一個比較完整的P2P網(wǎng)絡(luò),當(dāng)然還有很多的細(xì)節(jié)需要考慮,比如說,節(jié)點發(fā)現(xiàn)協(xié)議,快速定位節(jié)點,安全性,節(jié)點的加入和退出機制,節(jié)點的心跳保活等。我們主要介紹的是DHT分布式哈希表的知識點;
比特幣、以太坊、超級賬本和EOS都使用了DHT的具體實現(xiàn);
鏈類型
使用的P2P協(xié)議
區(qū)塊鏈
Gossip協(xié)議
超級賬本
Gossip協(xié)議
以太坊
Kademlia協(xié)議
EOS
自己實現(xiàn)的P2P協(xié)議 (待研究)
比特幣
節(jié)點發(fā)現(xiàn)
新節(jié)點啟動后,想要參與協(xié)同運作,必須發(fā)現(xiàn)其他的比特幣節(jié)點,也就是至少需要發(fā)現(xiàn)一個比特幣網(wǎng)絡(luò)中的節(jié)點,并建立聯(lián)系。
新節(jié)點找到對等體的方法:
- 種子節(jié)點:使用多個DNS服務(wù)器(比特幣節(jié)點專用)來解析比特幣節(jié)點的IP。
- 節(jié)點引薦:如果不知道DNS,則必須知道至少一個比特幣節(jié)點的IP。
節(jié)點鏈接
節(jié)點向peer節(jié)點發(fā)送version消息開始握手,peer節(jié)點需要檢驗版本,秘鑰等數(shù)據(jù),驗證通過,會返回verack消息。
握手消息完成,節(jié)點發(fā)送包含自己IP地址和addr的消息給peer節(jié)點,對等節(jié)點收到,繼續(xù)向它的對等節(jié)點發(fā)出addr消息,這樣新節(jié)點的IP地址就會在P2P網(wǎng)絡(luò)中廣播出去(Gossip協(xié)議的Rumor-Mongering);
因為網(wǎng)絡(luò)中,節(jié)點可以隨時加入和離開,所以所有的節(jié)點必須在一個節(jié)點退出的時候,尋找新節(jié)點,并且在其他節(jié)點啟動的時候,對其進行幫組。
超級賬本
以太坊
以太坊使用的是kademlia協(xié)議,簡稱Kad協(xié)議,具體的Kad協(xié)議在其他的文章中介紹。本文我們只需要知道Kad使用UDP進行節(jié)點間消息通信,每個節(jié)點根據(jù)與鄰居節(jié)點距離之間的距離(NodeID的差距),分別放到不同的桶(bucket)中,且有4種消息
ping – 用于探測其他節(jié)點是否還存在
store – 接收者受到后,將信息中key/value對存儲在本節(jié)點
findnode – 接受者向發(fā)送者返回 k 個它知道的與目標(biāo)結(jié)點距離最近的節(jié)點
findvalue – 和findnode 差不多,區(qū)別是如果接收者本地存在與目標(biāo)結(jié)點對應(yīng)的value,那么就回復(fù)這個值給發(fā)送者。
以太坊中的P2P網(wǎng)絡(luò)是比較完整的,很值得學(xué)習(xí),有發(fā)現(xiàn)、子協(xié)議和Nat映射等模塊。我們主要講解的是發(fā)現(xiàn)模塊;
整體結(jié)構(gòu):
結(jié)構(gòu)名
作用
Server
本地客戶端服務(wù)
Node
節(jié)點的信息
table
存儲peer節(jié)點的結(jié)構(gòu)
udp
底層節(jié)點的通訊協(xié)議
Server
當(dāng)本地啟動一個客戶端,并配置好靜態(tài)peer節(jié)點的配置信息之后,啟動的Server會進行三個操作
主動發(fā)現(xiàn)鄰居
ECDH密鑰建立,確認(rèn)身份并進行身份驗證
鏈接已經(jīng)建立,確認(rèn)生層交換協(xié)議,并運行這些協(xié)議
Node
Node節(jié)點唯一的表示網(wǎng)絡(luò)中的一個以太坊節(jié)點,并且Node節(jié)點有如下的信息:
IP地址
連接使用的UDP/TCP端口號
ID:以太坊網(wǎng)絡(luò)中唯一標(biāo)識一個節(jié)點,本質(zhì)上是一個橢圓曲線公鑰(PublicKey),與Server的PrivateKey對應(yīng)。一個節(jié)點的IP地址不一定是固定的,但ID是唯一的。
用于節(jié)點間的距離計算的sha
table
Table主要用來管理與本節(jié)點與其他節(jié)點的連接的建立更新刪除:
bucket – 所有peer按與本節(jié)點的距離遠(yuǎn)近放在不同的桶(bucket)中
refreshReq – 更新Table請求通道
Table會循環(huán)的監(jiān)控并對peer節(jié)點進行刷新
定時(30s)啟動Peer刷新過程的定時器
接收其他線程投遞到Table的刷新Peer連接的通知,當(dāng)收到該通知時啟動更新
定時重新檢查以連接節(jié)點的有效性的定時器
udp
udp的底層接受數(shù)據(jù)包循環(huán),負(fù)責(zé)接收其他節(jié)點的packet,并將解析后的信息交給另一個循環(huán)處理,這個循環(huán)處理負(fù)責(zé)控制消息的向上遞交和收發(fā)控制
節(jié)點發(fā)現(xiàn)的流程:
鄰居初始化
當(dāng)一個節(jié)點啟動后,它會首先向配置的靜態(tài)節(jié)點發(fā)起連接,發(fā)起連接的過程稱為Dial,此時的Dial需要知道IP地址,如果不知道需要有一個解析IP的過程(根據(jù)ID來解析)
建立連接,下面兩個都成功則加入table中:
秘鑰鏈接和確認(rèn)
上層協(xié)議確認(rèn)
探活檢測(Revalidate)
有效性檢測就是利用ping消息進行探活操作。Table啟動了一個定時器(0~10s),定期隨機選擇一個bucket,向其末尾的節(jié)點發(fā)送ping消息,如果對方回應(yīng)了pong,則探活成功。
更新鄰居關(guān)系
定期(定時器超時)或不定期(收到refreshReq)地進行更新鄰居關(guān)系(發(fā)現(xiàn)新鄰居),兩者都調(diào)用doRefresh()方法,該方法對在網(wǎng)絡(luò)上查找離自身和三個隨機節(jié)點最近的若干個節(jié)點。
EOS
總結(jié)
以上是生活随笔為你收集整理的gossip 区块链_区块链中的P2P的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java filter教程_Java W
- 下一篇: vue lang_推荐一个基于Vue 的