[+0x05: P, hash_0: B_32, hash_1: B_32, ...]
節點間的通信 —— 一個簡單的視角
以太坊節點之間通過簡單的線路協議進行通信,形成一個虛擬或覆蓋良好的網路 為實現這一目標,該協議稱為ÐΞVp2p,使用RLP等技術和標準。
傳輸協議
為了提供機密性並防止網路中斷,ÐΞVp2p節點使用RLPx消息,一種加密且經過身份驗證的transport協議。 RLPx使用類似於Kademlia的路由演算法,Kademlia是用於分散的對等計算機網路的分佈式雜湊表(* DHT )。 *RLPx,作為底層傳輸協議,允許“節點發現和網路形成”。 RLPx的另一個顯著特徵是通過單個連接支持多個協議_。
當ÐΞVp2p節點通過Internet進行通信時(通常情況下),它們使用TCP,它提供面向連接的介質,但實際上ÐΞVp2p節點通過使用底層傳輸協議RLPx所提供的所謂設施(或消息),以數據包通信,允許它們通信發送和接收數據包。
數據包是 動態構建 dynamicically framed,前綴為RLP編碼標頭,經過加密和驗證。通過幀頭實現多路複用,幀頭指定分組的目的協議。
加密握手
通過握手建立連接,並且一旦建立,就將數據包加密並封裝為幀。
此握手將分兩個階段進行,第一階段涉及密鑰交換,第二階段將執行身份驗證,作為DEVp2p的一部分,還將交換每個節點的功能。
安全 - 基本考慮因素
所有加密操作都基於secp256k1,並且每個節點都應該維護一個靜態私鑰,該私鑰在會話之間保存和恢復。
在實施加密之前,數據包具有時間戳屬性,以減少執行重放攻擊的時間視窗。 建議接收方只接受最近3秒內創建的數據包。
數據包被簽名。通過從簽名中恢復公鑰並檢查它是否與預期值匹配來執行驗證。
ÐΞVp2p 消息和子協議
使用RLP,我們可以編碼不同類型的數據,其類型由RLP的第一個條目中使用的整數值確定。 這樣,ÐΞVp2p,基礎線路協議 basic wire protocol,支持任意的子協議。
0x00-0x10
之間的Message IDs保留用於ÐΞVp2p消息。因此,假定sub-protocols的消息ID從“0x10”開始。
未在對等節點之間共享的子協議是忽略的。 如果共享相同(同名)子協議的多個版本,則數字最高的勝出。
基本建立通信 - 基本ÐΞVp2p消息
作為一個非常基本的例子,當兩個對等節點發起他們的通信時,每個對等節點用另一個稱為“Hello”的特殊ÐΞVp2p消息來迎接另一個,該消息由“0x00”消息ID標識。 通過這個特定的ÐΞVp2p “Hello”消息,每個節點將向其對等的相關數據公開,從而允許通信以非常基本的級別開始。
在此步驟中,每個對等方將知道有關其對等方的以下資訊。
-
P2P協議的實現版本。現在必須是'1`。
-
客戶端軟體標識,作為人類可讀的字串(例如
Ethereum(++)/ 1.0.0
)。 -
對等節點的capability name為長度為3的ASCII字串。當前支持的能力名稱為“eth”和“shh”。
-
對等節點的capability version為正整數。目前支持的版本是
eth
為34
,shh
為1
。 -
客戶端正在偵聽的連接埠。如果為“0”則表示客戶端沒有收聽。
-
節點的唯一標識指定為512位雜湊。
斷開連接 - 基本ÐΞVp2p消息
要執行有序的斷開連接,要斷開連接的節點將發送名為“Disconnect”的ÐΞVp2p消息,該消息由“0x01”消息ID標識。此外,節點使用參數“reason”指定斷開的原因。
-
“reason”參數可以取值從“0x00”到“0x10”,例如“0x00”表示原因“請求斷開連接”和“0x04”表示“太多對等節點”*。
狀態 - 以太坊子協議範例
該子協議由+0x00
消息-id標識。
此消息應在初始握手之後和任何與以太坊相關的消息之前發送,並通知其當前狀態。
為此,節點向其對等方公開以下數據;
-
Protocol version
-
Network Id
-
Total Difficulty of the best chain
-
Hash of the best known block
-
Hash of the Genesis block
已知的當前網路ID
這裡是目前已知的網路ID列表:
-
0: Olympic; 以太坊公共預發佈測試網
-
1: Frontier; Homestead,Metropolis,以太坊公共主網
-
1: Classic; (un)forked 公共以太坊Classic主網路,鏈ID 61
-
1: Expanse; 另一個以太坊實現,鏈ID 2
-
2: Morden; 公共以太坊測試網,現在是以太坊經典測試網
-
3: Ropsten; 公共跨客戶端以太坊測試網
-
4: Rinkeby: 公共Geth以太坊測試網
-
42: Kovan; 公共Parity以太坊測試網
-
77: Sokol; 公共POA測試網
-
99: POA; 公共權威證明(PoA)以太網網路
-
7762959: Musicoin; 音樂區塊鏈
GetBlocks - 另一個子協議範例
該子協議由+ 0x05
message-id標識。
通過此消息,節點通過其自己的雜湊向其對等方請求指定的塊。
請求節點的方式是通過包含它們所有雜湊值的列表,將消息採用以下形式;
請求節點必須沒有包含所有請求的塊的響應消息,在這種情況下,它必須再次請求那些尚未由其對等方發送的消息。
節點標識和聲譽
ÐΞVp2p節點的標識是secp256k1公鑰。
客戶端可以自由標記新節點並使用節點ID作為決定節點的信譽的方法。
他們可以儲存給定ID的評級並相應地給予優先權。