理解以太坊的 P2P 網路

買賣虛擬貨幣

此文旨在幫助你理解 P2P 網路,並闡述一些以太坊的實現細節。P2P 技術利用終端裝置的豐富資源,能夠緩解中心化系統的短板,而且從九十年代開始,這項技術就已經被 eMule,bitTorrent和Skype等知名軟體所採用。P2P 技術也是比特幣或者以太坊區塊鏈系統的核心元件。很多人都聽說過 P2P,但是不知道它到底是什麼。那就讓我們從瞭解什麼是 P2P 網路開始吧。

什麼是 P2P網路?

點對點(P2P)網路是一種網路覆蓋層(overlay network)——就是說,它是建立在公開網際網路之上的。從數學的角度來說,P2P 網路可以被視作一個有向圖 G = (V,E),其中 V 是網路中的對等節點集合,E是對等節點所連成的邊的集合(也即節點間連線的集合)。每個對等節點 p 都有一個獨一無二的標識號 pid。集合 E 中的邊(p,q)指 p 可透過直接相連的路徑向 q 傳送訊息;也就是說,p 使用 q 的 pid 作為目的地址,在網路之上向 q 傳送訊息。儘管在底層的 TCP/IP 網路中,相似的 IP 地址可以轉譯為在地理位置上相互接近,但很少有這麼明確的直接關聯。

理想情況下,所有的對等節點間都應該有一條路徑相連。但因為每個節點對網路拓撲和其他對等節點只有一個不完整的檢視,所以網路覆蓋層需要中間節點將訊息轉發至正確目的。圖的結構為每對節點提供了多條中間路徑,因此就算對等節點改變,也可透過圖的連通性提供網路的恢復能力。對每個對等節點來說,圖的連通性透過與其他對等節點的鄰接關係來反映。當對等節點加入或者離開網路,鄰接的對等節點可能會持有不正確的鄰接資訊。因此使用網路覆蓋層維護機制(Overlay maintenance mechanisms)儲存更新的鄰接資訊,使得所有節點間保持連通性。

P2P 網路中的參與者向其他網路參與者提供部分資源。不需要中心化的協調者,每個對等節點都可貢獻計算週期(CPU),磁碟儲存和網路頻寬。傳統的 客戶端-伺服器 模型中,伺服器提供資源,客戶端使用資源;與之相對的,在 P2P 網路中,對等節點既是網路資源的供應者,也是消費者。因此,P2P 網路可以很好地解決 客戶端-伺服器 模型下的一些短板,比如可擴充套件性和單點故障。

一般來說,P2P 網路會有一個門檻,節點的資源貢獻高於這個門檻才能加入網路。度量資源貢獻的標準應該是公平的,比如說,要求網路中每個對等節點的平均貢獻應該在 P2P 系統總體平均值的統計範圍內等。資源貢獻應該是雙方互惠的。付出貢獻後可得到的利益,吸引著使用者加入 P2P 應用。

以太坊的 P2P 網路是如何工作的?

以太坊的官方客戶端節點軟體 Geth,基於一種覆蓋層維護機制 (稱作 Kademlia 分散式雜湊表)實現了對等節點發現協議(RLPx 節點發現協議)。雖然 Kademlia 是為了在 P2P 網路中有效地定位和儲存內容而設計的,以太坊的 P2P 網路只用它來發現新的對等節點。

Kademlia

以太坊網路中,每個客戶端節點都配備有一個enodeID,之後將此 ID 用 SHA3 演算法雜湊為一個 256 位的值。Kademlia 使用 XOR 操作定義距離,因此兩個 256 位的數字之間的距離是他們的按位異或值(bitwise exclusive OR)。每個對等節點都擁有一個包含 256 個不同的桶(buckets)的資料結構,每個桶 i 中儲存與本節點距離在 2i-1到 2i之間的 16 個節點。為了發現一個新的對等節點,以太坊節點選擇自己作為目標 x,從桶中尋找到 16 個與目標 x 最近的節點,之後請求這 16 個節點,讓它們從自己的桶中各找出 16 個與目標 x “更近” 的節點並返回,這樣以來,會得到至多 16x16 個新發現的節點。之後請求這 16x16 個新發現的節點中離目標 x 最近的 16 個節點,讓它們返回與 x 更近的 16 個節點。這個過程持續迭代,直到沒有新節點被發現。

-異或操作示意圖-

-bucket 與距離對應的示意圖-

對等節點間通訊

Geth 使用 UDP 連線交換 P2P 網路的資訊。有 4 種型別的 UDP 訊息。一條*ping*訊息請求一條*pong*訊息作為返回。此對訊息用來判斷相鄰節點是否可響應。一條*findnode*訊息請求一條*neighbors*訊息(其中包含 16 個已經被響應節點知曉的節點列表)作為返回。當建立好對等節點的連線之後,Geth 節點透過加密和認證的 TCP 連線來交換區塊鏈資訊。

資料結構

Geth 客戶端用兩種資料結構儲存其他節點的資訊。第一種是稱作db的長期資料庫,它儲存在磁碟內,客戶端重啟之後資料也是持久存在的。db中包含客戶端互動過的每個節點資訊。db 的每條記錄包含節點 ID,IP 地址,TCP 埠,UDP 埠,(此客戶端)最後一次向(記錄中)節點傳送 ping 的時間,最後一次從節點收到 pong 的時間,節點響應findnode訊息的失敗次數。如果最後一次從一個節點收到pong訊息的時間超過了一天,此節點將會被移出 db。第二種資料結構是稱作 table的短期資料庫。當客戶端重啟時table是空的。table包含 256 個桶,每個桶儲存至多 16 條記錄。每條記錄儲存其他以太坊節點的資訊——節點的 ID,IP 地址, TCP 埠和 UDP 埠。如果記錄中的某個節點對於findnode訊息連續響應失敗,多於 4 次時將被移出 table。

當某個客戶端第一次啟動時,它的 db 是空的,只知道 6 個硬編碼的引導節點。隨後,當客戶端開始發現對等節點,客戶端依據上面描述的機制,將節點加入 db 和 table。

如果你想查閱更多關於以太坊 P2P 網路的內容,可以參見下面一些由以太坊社羣成員貢獻的文章:

“RLPx Node Discovery Protocol” by Felix Lange, Gustav-Simmonsson, and Roman Mandeleil“Peer to Peer” by Felix Lange“Kademlia Peer Selection” by James Ray參考:

Vasilios Darlagiannis, (2010). P2P Systems and Overlay Networks, [PDF file] Retrieved

from:https://www.iti.gr/iti/files/document/seminars/p2p_eketa_090610_v2.pdf

S. Umamaheswari and Dr. V. Leela, (2011, Mar.01). P2P Overlay Maintenance Algorithm, [PDF file] Retrieved from:http://journals.sagepub.com/doi/pdf/10.1260/1748-3018.6.3.555

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;