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