以太坊P2P網絡及節點發現機制

本文轉載於https://www.8btc.com/article/148687

 

目錄1 分佈式網絡介紹1.1 Kad網介紹1.2 Kad網絡節點距離1.3 K桶

 

1.4 Kad通信協議

2 鄰居節點

2.1 NodeTable類主要成員

2.2 鄰居節點發現方法

2.3 鄰居節點網絡拓撲及刷新機制。

 

1 分佈式網絡介紹

 

 

以太坊底層分佈式網絡即P2P網絡,使用了經典的Kademlia網絡,簡稱kad。

1.1 Kad網介紹

Kademlia在2002年由美國紐約大學的PetarP.Manmounkov和DavidMazieres提出,是一種分佈式散列表(DHT)技術,以異或運算爲距離度量基礎,已經在BitTorrent、BitComet、Emule等軟件中得到應用。

1.2 Kad網絡節點距離  

以太坊網絡節點距離計算方法:

  • Node1:節點1 NodeId
  • Node2:節點2 NodeId

1.3 K桶

 

Kad的路由表是通過稱爲K桶的數據構造而成,K桶記錄了節點NodeId,distance,endpoint,ip等信息。以太坊K桶按照與target節點距離進行排序,共256個K桶,每個K桶包含16個節點。

p1

圖1.1

1.4 Kad通信協議

 

以太坊Kad網絡中節點間通信基於UDP,主要由以下幾個命令構成,若兩個節點間PING-PONG握手通過,則認爲相應節點在線。

p2

 

2 鄰居節點

 

 

2.1 NodeTable類主要成員

C++版本以太坊源碼中,NodeTable是以太坊 P2P網絡的關鍵類,所有與鄰居節點相關的數據和方法均由NodeTable類實現。

p3

p4

2.2 鄰居節點發現方法

鄰居節點是指加入到K桶,並通過PING-PONG握手的節點。

p5

圖2.1

 

 

鄰居節點發現流程說明:

  1. 系統第一次啓動隨機生成本機節點NodeId,記爲LocalId,生成後將固定不變,本地節點記爲local-eth。
  2. 系統讀取公共節點信息,ping-pong握手完成後,將其寫入K桶。
  3. 系統每隔7200ms刷新一次K桶。
  4. 刷新K桶流程如下:

a.      隨機生成目標節點Id,記爲TargetId,從1開始記錄發現次數和刷新時間。

 

b.      計算TargetId與LocalId的距離,記爲Dlt

c.      K桶中節點的NodeId記爲KadId,計算KadId與TargetId的距離,記爲Dkt

d.      找出K桶中Dlt大於Dkt的節點,記爲k桶節點,向k桶節點發送FindNODE命令,FindNODE命令包含TargetId

e.      K桶節點收到FindNODE命令後,同樣執行b-d的過程,將從K桶中找到的節點使用Neighbours命令發回給本機節點。

f.       本機節點收到Neighbours後,將收到的節點寫入到K桶中。

g.      若搜索次數不超過8次,刷新時間不超過600ms,則返回到b步驟循環執行。

2.3 鄰居節點網絡拓撲及刷新機制。

p6

圖2.2

1 TargetId爲隨機生成的虛擬節點ID。

 

2 以太坊Kad網絡與傳統Kad網絡的區別:

  1. 以太坊節點在發現鄰居節點的8次循環中,所查找的節點均在距離上向隨機生成的TargetId收斂。
  2. 傳統Kad網絡發現節點時,在距離上向節點本身收斂。

 

本文由HPB(芯鏈)團隊整理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章