本文轉載於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個節點。
圖1.1
1.4 Kad通信協議
以太坊Kad網絡中節點間通信基於UDP,主要由以下幾個命令構成,若兩個節點間PING-PONG握手通過,則認爲相應節點在線。
2 鄰居節點
2.1 NodeTable類主要成員
C++版本以太坊源碼中,NodeTable是以太坊 P2P網絡的關鍵類,所有與鄰居節點相關的數據和方法均由NodeTable類實現。
2.2 鄰居節點發現方法
鄰居節點是指加入到K桶,並通過PING-PONG握手的節點。
圖2.1
鄰居節點發現流程說明:
- 系統第一次啓動隨機生成本機節點NodeId,記爲LocalId,生成後將固定不變,本地節點記爲local-eth。
- 系統讀取公共節點信息,ping-pong握手完成後,將其寫入K桶。
- 系統每隔7200ms刷新一次K桶。
- 刷新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 鄰居節點網絡拓撲及刷新機制。
圖2.2
1 TargetId爲隨機生成的虛擬節點ID。
2 以太坊Kad網絡與傳統Kad網絡的區別:
- 以太坊節點在發現鄰居節點的8次循環中,所查找的節點均在距離上向隨機生成的TargetId收斂。
- 傳統Kad網絡發現節點時,在距離上向節點本身收斂。
本文由HPB(芯鏈)團隊整理。