一、以太坊p2p子產品組成
在以太坊p2p目錄下,主要包括以下幾個子產品:
p2p子產品 | 功能 |
---|---|
discover | 包含了Kademlia協定。是基于UDP的p2p節點發現協定。 |
discv5 | 新的節點發現協定。 還是試驗屬性 |
enr | 實作EIP-778中的以太坊節點記錄 |
nat | 提供網絡端口映射協定 |
netutil | 網絡包拓展 |
protocols | p2p子協定拓展 |
simulations | p2p網絡的模拟。 |
discover子產品源碼:
- 發現的節點的持久化存儲 database.go
- Kademlia協定的核心邏輯 tabel.go
- UDP協定的處理邏輯udp.go
- 網絡位址轉換 nat.go
p2p 其他部分源碼
- 節點之間的加密鍊路處理協定 rlpx.go
- 挑選節點然後進行連接配接的處理邏輯 dail.go
- 節點和節點連接配接的處理以及協定的處理 peer.go
- p2p伺服器的邏輯 server.go
二、以太坊的網絡分層
以太坊的網絡如下所示:

(1)、傳輸層
傳輸層主要包括TCP和UDP協定,以太坊P2P啟動主要包括兩個部分啟動TCP和啟動UDP,預設端口30303。
- UDP:udp主要用于p2p節點發現,包括nat位址轉換,discover發現子產品。
- TCP:tcp主要用于節點和節點連接配接的區塊鍊資料的處理, 包括接收其他節點的連接配接和主動連接配接其他節點的功能,主要邏輯在Peer,同時通過Nat向外暴露位址。
(2) 會話層
會話層主要包括 Peer 管理,NodeTable 管理和 RPC 協定。
p2p(peer to peer)負責以太坊底層節點間的通信,主要包括底層節點發現(discover)和上層協定運作兩大部分。
- NodeTable 管理主要包括底層節點發現
- Peer管理隻要負責上層協定運作
2.1 NodeTable管理源碼結構
節點發現功能主要涉及 Server Table udp 這幾個資料結構,它們有獨自的事件響應循環,節點發現功能便是它們互相協作完成的。其中,每個以太坊用戶端啟動後都會在本地運作一個Server,并将網絡拓撲中相鄰的節點視為Node,而Table是Node的容器,udp則是負責維持底層的連接配接。這些結構的關系如下圖:
2.2 Peer 管理源碼結構
(3) 表示層
RLPx協定就定義了TCP連結的加密過程。
RLPx使用了(Perfect Forward Secrecy), 簡單來說。 連結的兩方生成生成随機的私鑰,通過随機的私鑰得到公鑰。 然後雙方交換各自的公鑰, 這樣雙方都可以通過自己随機的私鑰和對方的公鑰來生成一個同樣的共享密鑰(shared-secret)。後續的通訊使用這個共享密鑰作為對稱加密算法的密鑰。 這樣來說。如果有一天一方的私鑰被洩露,也隻會影響洩露之後的消息的安全性, 對于之前的通訊是安全的(因為通訊的密鑰是随機生成的,用完後就消失了)。
(4)應用層
以太坊應用層實作了eth、whisper等子協定。後面會詳細分析。