作者:Dean Eigenmann
編譯:Unitimes_David
本文將概述多地址,ENR 和 enode 這三類網絡地址。
在與 Felix Lange 討論之后,我認為攥寫這篇關于在以太坊生態中遇到的各類網絡地址及其差異的文章是很有意義的。我自身對它們理解也存在著些誤區,因而覺得對其進行闡述會很有價值。
多地址 (Multiaddr)
讓我們從最早或按 commit 時間來看最早被歸檔的多地址 (Multiaddr[1]) 開始。多地址是 Protocol Labs 的多格式項目(multiformats project)的一部分。多格式本質上是自描述值的各種規范。由于被廣泛用于libp2p,IPFS 以及其它 Protocol Labs 的項目,你可能早就聽說過它們。
多地址有兩種表示形式:一種是存儲或傳輸時使用的二進制表示;另一種是提供給用戶的可讀格式。
/ip4/127.0.0.1/udp/1234
上面展示了一個以可讀格式表示的多地址。該多地址是一種以鍵值對來表示地址的可遞歸格式。(筆者注,地址可表達為{
enode
接下來就是enode[3]。enode并不是真正的網絡地址格式而是 url 格式。由于 enode 是 ENR 的前身,我們仍會介紹它。一個 enode URL 如下所示:
enode://6f8a80d6ad92a0@10.3.58.6:30303?discport=30301
enode體系被用于表示URL。enode://后面跟著一個十六進制編碼的節點ID。接下來,@符號后面表示的是主機,其必須為一個IP地址。主機后面列出了TCP端口,在我們的例子中為30303。若UDP和TCP的端口不同,UDP端口可通過在末尾添加discport參數來指定。
ENR
最后我們來介紹 ENR[4](以太坊節點記錄)。ENR很有趣,原因在于其皆使用了前兩種類型(多地址和enode URL)的特性,使得它變得十分通用。ENR的主要動機是允許轉發過程中攜帶更多的信息,因而引入了節點記錄。節點記錄是自證的,而且節點可通過簽名來鑒別身份。這些記錄被表示為一個RLP列表[5]――此處我不會進行詳細介紹,但稍微提及一下,RLP是以太坊使用的一種序列化格式。
節點記錄包含了一個簽名,序列號與一個表明用于創建和驗證簽名的身份認證機制所需的字段。最后,記錄的其余部分包含了任意鍵值對,這些鍵值對可包含諸如連接信息之類的東西。EIP定義了一些具有預定義含義的鍵,如ip,其為4字節表示的節點IPv4地址。
簽名被用于通過確保傳遞的公鑰為創建簽名所使用的公鑰來驗證記錄。
如果同一個身份簽發了2個不同的記錄,那么序列號可用于解決沖突:規定使用序列號較大的記錄。
需要注意的是,節點記錄的RLP編碼版本號不能超過300字節。
該格式是面向未來的,新鍵即使在部分客戶端不能解析的情況下仍能被添加,以及新的身份認證機制可被添加以檢驗簽名。
Eth 2.0
現在,讓我們來看看 Eth2.0。在 Eth2.0 之前,以太坊中從未使用過多地址,而其現在變得非常重要。為什么?因為 Eth2.0 使用 libp2p,而 libp2p 又使用多地址來識別節點。
那么,我們該怎么處理這種情況呢?Eth2.0 的 P2P規范[6] 展示了2種方案:
多地址可從ENR導出
由于ENR能夠添加任意鍵,多地址能被包含在ENR中。
希望本文能夠給出一個關于不同的網絡地址是什么,這些地址間的區別,工作方式以及用途的精簡概要。
原文鏈接:
https://dean.eigenmann.me/blog/2020/01/21/network-addresses-in-ethereum/[10]
參考鏈接:
[1]https://multiformats.io/multiaddr/
[2]https://github.com/multiformats/multiaddr/blob/master/protocols.csv
此文由 中國比特幣官網 編輯,未經允許不得轉載?。?a href="http://m.huohuxiazai.com/">首頁 > 比特幣新聞 » 科普 | 以太坊中的網絡地址