Skip to content

Latest commit

 

History

History
117 lines (77 loc) · 5.72 KB

第十七章.asciidoc

File metadata and controls

117 lines (77 loc) · 5.72 KB

節點間的通信 —— 一個簡單的視角

以太坊節點之間通過簡單的線路協議進行通信,形成一個虛擬或覆蓋良好的網絡 為實現這一目標,該協議稱為*ÐΞ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標識。

通過此消息,節點通過其自己的哈希向其對等方請求指定的塊。

請求節點的方式是通過包含它們所有哈希值的列表,將消息採用以下形式;

[+0x05: P, hash_0: B_32, hash_1: B_32, ...]

請求節點必須沒有包含所有請求的塊的響應消息,在這種情況下,它必須再次請求那些尚未由其對等方發送的消息。

節點標識和聲譽

*ÐΞVp2p*節點的標識是*secp256k1*公鑰。

客戶端可以自由標記新節點並使用節點ID作為_決定節點的信譽_的方法。

他們可以存儲給定ID的評級並相應地給予優先權。