摘要:為什么區(qū)塊鏈會選擇作為網(wǎng)絡(luò)基礎(chǔ)上面介紹的時候說過,他是無中心服務(wù)器的,中心服務(wù)器就意味著,當(dāng)受到攻擊的時候,中心服務(wù)器一旦宕機(jī),整個網(wǎng)絡(luò)和服務(wù)就會出現(xiàn)問題。區(qū)塊鏈的核心是去中心化,這和網(wǎng)絡(luò)的觀念不約而同,所以選擇的理由也就很充分。
區(qū)塊鏈中P2P介紹
p2p是什么
為什么區(qū)塊鏈需要P2P
比特幣、以太坊、超級賬本和EOS的P2P對比
P2P作為區(qū)塊鏈網(wǎng)絡(luò)中去中心化的標(biāo)識
P2P全稱對等式網(wǎng)絡(luò)(peer-to-peer),又稱點(diǎn)對點(diǎn)技術(shù),是無中心服務(wù)器、依靠用戶群(peers)交換信息的互聯(lián)網(wǎng)體系;與有中心服務(wù)器的中央網(wǎng)絡(luò)系統(tǒng)不同,對等網(wǎng)絡(luò)的每個用戶端既是一個節(jié)點(diǎn),也有服務(wù)器的功能,任何一個節(jié)點(diǎn)無法直接找到其他節(jié)點(diǎn),必須依靠其戶群進(jìn)行信息交流。
優(yōu)勢
可在網(wǎng)絡(luò)的中央及邊緣區(qū)域共享內(nèi)容和資源。在客戶端/服務(wù)器網(wǎng)絡(luò)中,通常只能在網(wǎng)絡(luò)的中央?yún)^(qū)域共享內(nèi)
由對等方組成的網(wǎng)絡(luò)易于擴(kuò)展,而且比單臺服務(wù)器更加可靠。單臺服務(wù)器會受制于單點(diǎn)故障,或者會在網(wǎng)絡(luò)使用率偏高時,形為瓶頸。
由對等方組成的網(wǎng)絡(luò)可共享處理器,整合計算資源以執(zhí)行分布式計算任務(wù),而不只是單純依賴一臺計算機(jī),如一臺超級計算機(jī)。
用戶可直接訪問對等計算機(jī)上的共享資源。網(wǎng)絡(luò)中的對等方可直接在本地存儲器上共享文件,而不必在中央服務(wù)器上進(jìn)行共享。
p2p網(wǎng)絡(luò)的三個特性
離散性:構(gòu)成系統(tǒng)的節(jié)點(diǎn)并沒有任何中央式的協(xié)調(diào)機(jī)制。
伸縮性:即使有成千上萬個節(jié)點(diǎn),系統(tǒng)仍然應(yīng)該十分有效率。
容錯性:即使節(jié)點(diǎn)不斷地加入、離開或是停止工作,系統(tǒng)仍然必須達(dá)到一定的可靠度。
上面介紹P2P的時候說過,他是無中心服務(wù)器的,中心服務(wù)器就意味著,當(dāng)受到攻擊的時候,中心服務(wù)器一旦宕機(jī),整個網(wǎng)絡(luò)和服務(wù)就會出現(xiàn)問題。而P2P網(wǎng)絡(luò)的優(yōu)勢在于,每個節(jié)點(diǎn)既是客戶端又是服務(wù)端,所以當(dāng)受到攻擊時,任何一臺機(jī)器垮掉,也不會影響整體的服務(wù)。
區(qū)塊鏈的核心是去中心化,這和P2P網(wǎng)絡(luò)的觀念不約而同,所以選擇P2P的理由也就很充分。
首先看一下P2P的整體技術(shù)點(diǎn):
首先是如何發(fā)現(xiàn)peers,在P2P網(wǎng)絡(luò)中,發(fā)現(xiàn)節(jié)點(diǎn)是最開始、最重要和最難的一部分;
節(jié)點(diǎn)之間建立鏈接;發(fā)現(xiàn)節(jié)點(diǎn)之后,就要進(jìn)行握手鏈接,確定節(jié)點(diǎn)之間的通信協(xié)議等
節(jié)點(diǎn)之間的通信;鏈接建立之后,就可以正常的進(jìn)行通信了;
以上三點(diǎn)解決之后,基本就可以實(shí)現(xiàn)一個簡單的P2P網(wǎng)絡(luò)。如果想要實(shí)現(xiàn)一個比較完整的P2P網(wǎng)絡(luò),當(dāng)然還有很多的細(xì)節(jié)需要考慮,比如說,節(jié)點(diǎn)發(fā)現(xiàn)協(xié)議,快速定位節(jié)點(diǎn),安全性,節(jié)點(diǎn)的加入和退出機(jī)制,節(jié)點(diǎn)的心跳?;畹取N覀冎饕榻B的是DHT分布式哈希表的知識點(diǎn);
比特幣、以太坊、超級賬本和EOS都使用了DHT的具體實(shí)現(xiàn);
鏈類型 | 使用的P2P協(xié)議 |
---|---|
區(qū)塊鏈 | Gossip協(xié)議 |
超級賬本 | Gossip協(xié)議 |
以太坊 | Kademlia協(xié)議 |
EOS | 自己實(shí)現(xiàn)的P2P協(xié)議 (待研究) |
比特幣
節(jié)點(diǎn)發(fā)現(xiàn)
新節(jié)點(diǎn)啟動后,想要參與協(xié)同運(yùn)作,必須發(fā)現(xiàn)其他的比特幣節(jié)點(diǎn),也就是至少需要發(fā)現(xiàn)一個比特幣網(wǎng)絡(luò)中的節(jié)點(diǎn),并建立聯(lián)系。新節(jié)點(diǎn)找到對等體的方法:
- 種子節(jié)點(diǎn):使用多個DNS服務(wù)器(比特幣節(jié)點(diǎn)專用)來解析比特幣節(jié)點(diǎn)的IP。
- 節(jié)點(diǎn)引薦:如果不知道DNS,則必須知道至少一個比特幣節(jié)點(diǎn)的IP。節(jié)點(diǎn)鏈接
節(jié)點(diǎn)向peer節(jié)點(diǎn)發(fā)送version消息開始握手,peer節(jié)點(diǎn)需要檢驗(yàn)版本,秘鑰等數(shù)據(jù),驗(yàn)證通過,會返回verack消息。
握手消息完成,節(jié)點(diǎn)發(fā)送包含自己IP地址和addr的消息給peer節(jié)點(diǎn),對等節(jié)點(diǎn)收到,繼續(xù)向它的對等節(jié)點(diǎn)發(fā)出addr消息,這樣新節(jié)點(diǎn)的IP地址就會在P2P網(wǎng)絡(luò)中廣播出去(Gossip協(xié)議的Rumor-Mongering);因?yàn)榫W(wǎng)絡(luò)中,節(jié)點(diǎn)可以隨時加入和離開,所以所有的節(jié)點(diǎn)必須在一個節(jié)點(diǎn)退出的時候,尋找新節(jié)點(diǎn),并且在其他節(jié)點(diǎn)啟動的時候,對其進(jìn)行幫組。
超級賬本
以太坊
以太坊使用的是kademlia協(xié)議,簡稱Kad協(xié)議,具體的Kad協(xié)議在其他的文章中介紹。本文我們只需要知道Kad使用UDP進(jìn)行節(jié)點(diǎn)間消息通信,每個節(jié)點(diǎn)根據(jù)與鄰居節(jié)點(diǎn)距離之間的距離(NodeID的差距),分別放到不同的桶(bucket)中,且有4種消息ping - 用于探測其他節(jié)點(diǎn)是否還存在
store - 接收者受到后,將信息中key/value對存儲在本節(jié)點(diǎn)
findnode - 接受者向發(fā)送者返回 k 個它知道的與目標(biāo)結(jié)點(diǎn)距離最近的節(jié)點(diǎn)
findvalue - 和findnode 差不多,區(qū)別是如果接收者本地存在與目標(biāo)結(jié)點(diǎn)對應(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é)點(diǎn)的信息 |
table | 存儲peer節(jié)點(diǎn)的結(jié)構(gòu) |
udp | 底層節(jié)點(diǎn)的通訊協(xié)議 |
當(dāng)本地啟動一個客戶端,并配置好靜態(tài)peer節(jié)點(diǎn)的配置信息之后,啟動的Server會進(jìn)行三個操作
主動發(fā)現(xiàn)鄰居
ECDH密鑰建立,確認(rèn)身份并進(jìn)行身份驗(yàn)證
鏈接已經(jīng)建立,確認(rèn)生層交換協(xié)議,并運(yùn)行這些協(xié)議
Node節(jié)點(diǎn)唯一的表示網(wǎng)絡(luò)中的一個以太坊節(jié)點(diǎn),并且Node節(jié)點(diǎn)有如下的信息:
IP地址
連接使用的UDP/TCP端口號
ID:以太坊網(wǎng)絡(luò)中唯一標(biāo)識一個節(jié)點(diǎn),本質(zhì)上是一個橢圓曲線公鑰(PublicKey),與Server的PrivateKey對應(yīng)。一個節(jié)點(diǎn)的IP地址不一定是固定的,但I(xiàn)D是唯一的。
用于節(jié)點(diǎn)間的距離計算的sha
Table主要用來管理與本節(jié)點(diǎn)與其他節(jié)點(diǎn)的連接的建立更新刪除:
bucket - 所有peer按與本節(jié)點(diǎn)的距離遠(yuǎn)近放在不同的桶(bucket)中
refreshReq - 更新Table請求通道
Table會循環(huán)的監(jiān)控并對peer節(jié)點(diǎn)進(jìn)行刷新
定時(30s)啟動Peer刷新過程的定時器
接收其他線程投遞到Table的刷新Peer連接的通知,當(dāng)收到該通知時啟動更新
定時重新檢查以連接節(jié)點(diǎn)的有效性的定時器
udp的底層接受數(shù)據(jù)包循環(huán),負(fù)責(zé)接收其他節(jié)點(diǎn)的packet,并將解析后的信息交給另一個循環(huán)處理,這個循環(huán)處理負(fù)責(zé)控制消息的向上遞交和收發(fā)控制
節(jié)點(diǎn)發(fā)現(xiàn)的流程:
鄰居初始化
當(dāng)一個節(jié)點(diǎn)啟動后,它會首先向配置的靜態(tài)節(jié)點(diǎn)發(fā)起連接,發(fā)起連接的過程稱為Dial,此時的Dial需要知道IP地址,如果不知道需要有一個解析IP的過程(根據(jù)ID來解析)
建立連接,下面兩個都成功則加入table中:
秘鑰鏈接和確認(rèn)
上層協(xié)議確認(rèn)
探活檢測(Revalidate)
有效性檢測就是利用ping消息進(jìn)行探活操作。Table啟動了一個定時器(0~10s),定期隨機(jī)選擇一個bucket,向其末尾的節(jié)點(diǎn)發(fā)送ping消息,如果對方回應(yīng)了pong,則探活成功。
更新鄰居關(guān)系
定期(定時器超時)或不定期(收到refreshReq)地進(jìn)行更新鄰居關(guān)系(發(fā)現(xiàn)新鄰居),兩者都調(diào)用doRefresh()方法,該方法對在網(wǎng)絡(luò)上查找離自身和三個隨機(jī)節(jié)點(diǎn)最近的若干個節(jié)點(diǎn)。
EOS
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24626.html
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接分析比特幣網(wǎng)絡(luò)一種去中心化點(diǎn)對點(diǎn)的網(wǎng)絡(luò)架構(gòu)原文已更新,請讀者前往原文閱讀比特幣采用了基于互聯(lián)網(wǎng)的點(diǎn)對點(diǎn)分布式網(wǎng)絡(luò)架構(gòu)。比特幣網(wǎng)絡(luò)可以認(rèn)為是按照比特幣協(xié)議運(yùn)行的一系列節(jié)點(diǎn)的集合。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:分析比特幣網(wǎng)絡(luò):一種去中心化、點(diǎn)對點(diǎn)的網(wǎng)絡(luò)架構(gòu)原文已更新,請讀者前往原文閱讀 比特幣采用了基于互聯(lián)網(wǎng)的點(diǎn)對點(diǎn)(P2P:peer-to-p...
摘要:和比特幣網(wǎng)絡(luò)傳輸協(xié)議的一系列優(yōu)化使得比特幣的新區(qū)塊幾乎可以在瞬間被全世界的礦工接收,非常有效的降低了孤塊率,保證了網(wǎng)絡(luò)安全。 這篇文章試圖討論全節(jié)點(diǎn)對于區(qū)塊鏈的意義。 角色 我們都知道,區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點(diǎn)有不同的角色。例如: 出塊節(jié)點(diǎn) 出塊節(jié)點(diǎn)負(fù)責(zé)打包交易,生產(chǎn)區(qū)塊。出塊節(jié)點(diǎn)在不同的地方有不同的名字,例如比特幣和以太坊中的礦工/礦池,Bitshares的Delegator,EOS的Pr...
閱讀 892·2021-11-15 11:38
閱讀 1619·2021-09-24 09:48
閱讀 851·2021-09-24 09:47
閱讀 2281·2021-08-26 14:15
閱讀 3510·2019-08-30 11:09
閱讀 2616·2019-08-29 16:55
閱讀 1592·2019-08-26 14:01
閱讀 3046·2019-08-23 16:47