一文讀懂以太坊的 P2P 網路

買賣虛擬貨幣

此文旨在幫助你理解 P2P 網路,並闡述一些以太坊的實現細節。P2P 技術利用終端裝置的豐富資源,能夠緩解中心化系統的短板,而且從九十年代開始,這項技術就已經被 eMule,bitTorrent 和 Skype 等知名軟體所採用。P2P 技術也是比特幣或者以太坊區塊鏈系統的核心元件(我們的專案 Shyft Network 就是從這些區塊鏈中衍生出來的)。很多人都聽說過 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

來源連結:medium.com

免責聲明:

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

推荐阅读

;