點對點網絡組建:從Kademlia到Discv5
編者按:本文來自以太坊愛好者(ID:ethfans)編者按:本文來自
以太坊愛好者(ID:ethfans)
編者按:本文來自
以太坊愛好者(ID:ethfans)
二級標題
以太坊愛好者(ID:ethfans)
二級標題
如果你一直在研究以太坊或者相關的技術,你可能聽說過discv4 或discv5。但這些究竟是什麼呢?它們是如何工作的呢?它們出眾的地方在哪裡呢?想要回答這些問題,我們需要從頭開始梳理一下。這篇博文假定讀者對這個領域比較陌生,因此沒有技術背景的人也可以閱讀。
二級標題
二級標題
二級標題
Kademlia
早年間的P2P 文件共享技術,比如Napster,使用單個服務器共享信息,信息中記錄誰擁有什麼文件。某個節點向中心服務器發起連接並提交記錄自己所擁有文件的列表。另一個節點之後向同一個中心服務器發起連接,尋找自己所需文件的存儲節點,然後和找到的節點建立聯繫。然而這是一個有缺陷的系統—— 系統很容易遭受攻擊,而且中心化服務器節點可能會吃官司。 (譯者註:單個服務器上存儲文件內容和節點的對應關係,如果提供了一些受版權保護內容的鏈接關係,那麼這個中心化服務器的提供者將直接受到原版權方的法律追責)
二級標題
二級標題
XOR 10011001 00110010 -------- 10101011
分佈式哈希表
上文中一直都在說DHT。那麼DHT 到底是什麼呢?
二級標題
分佈式哈希表(DHT)是一個分佈式的鍵值列表。參與到DHT 的節點可以很輕鬆地檢索到某個鍵對應的值。
假定一個網絡中,有9 個鍵值對和3 個節點,理想情況下,每個節點只需要存儲3 個鍵值對(最好的方式是存儲6個鍵值對,以提供冗餘),意味著如果要更新某個鍵值對,只有部分網絡節點需要更新。大致想法是這樣的,網絡中的任何節點都可以基於信息在節點間分佈的方式,知道要去哪裡尋找它所需要的特定鍵值對。
二級標題
現在我們知道DHT 是什麼了,那我們來看看discv4 的前身Kademlia。 Kademlia 是Petar Maymounkov 和David Mazières 於2002 年發明的DHT 協議。我覺得這個協議可能是最流行,而且使用最廣泛的DHT 協議。它的工作原理很簡單,讓我們來看看吧。
在Kademlia 中,節點和值通過距離來排列(其排列有嚴格數學化的定義)。這裡的距離不是地理位置上的距離,而是基於標識符的表示方法。通過使用一些距離函數,可以計算出兩個標識符之間的距離。
Kademlia 使用XOR(異或操作符) 作為距離函數。 XOR 函數的特點在於,只有當輸入不同時,輸出才為true。下面是用二進制標識符表示的例子。
上面的這個例子是說,十進制數字153 和50 之間的距離是171。
使用XOR 作為距離函數有很多原因,包括:
某個ID 與它自己的距離是0。
距離是對稱的,A 到B 的距離和B 到A 的距離相同。
遵循三角不等式,如果A,B,C 是三角形上的三點,那麼A 到B 的距離,小於或等於A 到C 的距離加上B 到C 的距離。
Kademlia 節點存儲著一個路由表。路由表中包含多個列表。每後一個列表所記載的節點都比前一個列表中的節點離得遠一點。每個節點維護離自己最近節點的信息;另一個節點離得越遠,本地節點保存的相關信息就越少。
Discv4
假定我想要找到一個特定的節點。我要做的就是向我已知的節點發送請求,這些節點返回他們的記錄中離我的目標節點更近的鄰居節點。我重複此過程,直到某群鄰居幫我找到目標節點。
為了讓Kademlia 節點支持這些功能,協議通過下面這些消息來通信。
二級標題
PING - 用來檢測一個節點是否還在運行。
FINDNODE - 向給定ID 返回所請求的最近節點。
二級標題
FINDVALUE - 和FINDNODE 一樣,區別在於,如果一個節點存儲著特定的值,它將會直接將值返回。
這是對Kademlia 的一個非常簡化的講解,中間跳過了各種重要的細節。想要更全面的了解,力荐原論文或者更深層次的設計規範。
二級標題
對背景做好鋪墊之後,終於來到discv4(表示discovery v4) 了,這是以太坊當前的節點發現協議。 Discv4 協議本身是基於Kademlia 的,但在某些部分做了改動。例如,discv4 中不再使用DHT 中的值部分。
前文中,Kademlia 的查詢方法描述了節點如何得到對等節點。節點向另一些節點發起請求,得到離自己更近的節點。重複此請求過程,直到無法找到任何新的節點。
Discv5
此外,discv4 添加了相互的終端驗證功能。這是為了確保發起FINDNODE 請求的節點正在參與同一個節點發現協議。
如果你想知道關於ENRs 的更多細節,請移步至我的另一篇博文Network Addresses in Ethereum。
二級標題
然而,discv4 也引入了一些問題。讓我們來看看其中的幾個。
其次,為了防禦重放攻擊,discv4 使用了時間戳。當某個主機的時鐘發生錯誤時,這種方式會導致各種各樣的問題。欲了解更多詳情,請查閱discv4 規範的“Known Issues” 部分。
二級標題
最後,終端的互驗證工作中也存在問題。因為信息有丟包的可能,所以沒有辦法斷定兩個對等節點是否都已驗證過對方。也就是說,我們可能自認為已經被驗證過了,但跟我們通信的對等節點卻並不這麼認為;他們可能會因此丟棄我們的FINDNODE 包。
最後,終端的互驗證工作中也存在問題。因為信息有丟包的可能,所以沒有辦法斷定兩個對等節點是否都已驗證過對方。也就是說,我們可能自認為已經被驗證過了,但跟我們通信的對等節點卻並不這麼認為;他們可能會因此丟棄我們的FINDNODE 包。
二級標題
最後,讓我們來看一下discv5。 Discv5 是discv4 的迭代版本,將作為Eth 2.0 的節點發現協議。 Discv5 旨在修復discv4 中存在的諸多問題。


