diff --git a/CN/07_p2p_net_node_sync.md b/CN/07_p2p_net_node_sync.md index 0f022dc..00fa0d7 100644 --- a/CN/07_p2p_net_node_sync.md +++ b/CN/07_p2p_net_node_sync.md @@ -1 +1,30 @@ # How the Geth Nodes communicate with other Ethereum Nodes + +## RLPX +### RLPx(Recursive Length Prefix)是以太坊网络协议的一种实现,它用于在点对点网络中传输数据。RLPx 建立在 TCP/IP 协议之上,并提供了一个安全、加密和压缩的传输层,用于在以太坊节点之间传输消息和交换数据。 +#### 以下是握手的基本流程 +1. 发起方生成随机数和ECDH随机密钥对:发起方生成一个随机数(initNonce)和一个ECDH随机密钥对(h.randomPrivKey)。 + +2. 发起方构造认证请求消息:发起方根据ECDH随机密钥对和自己的静态密钥对计算出一个签名,然后构造一个认证请求消息(authMsgV4),其中包含签名、发起方的公钥和随机数。 + +3. 发起方加密认证请求消息并发送:发起方使用接收方的公钥将认证请求消息加密,并发送给接收方。 + +4. 接收方解密收到的认证请求消息:接收方收到加密的认证请求消息后,使用自己的私钥对其进行解密。 + +5. 接收方验证发起方签名并提取信息:接收方验证收到的发起方签名,如果签名有效,接收方提取发起方的公钥(h.remote)和随机数(h.initNonce)。 + +6. 接收方生成随机数和ECDH随机密钥对:接收方生成一个随机数(respNonce)和一个ECDH随机密钥对(h.randomPrivKey)。 + +7. 接收方构造认证响应消息:接收方构造一个认证响应消息(authRespV4),其中包含接收方的随机数和ECDH随机公钥。 + +8. 接收方加密认证响应消息并发送:接收方使用发起方的公钥将认证响应消息加密,并发送给发起方。 + +9. 发起方解密收到的认证响应消息:发起方收到加密的认证响应消息后,使用自己的私钥对其进行解密。 + +10. 计算共享密钥:发起方和接收方分别使用自己的ECDH随机私钥和对方的ECDH随机公钥计算出相同的共享密钥。 + +11. 计算AES密钥、MAC密钥和进出口MAC哈希:发起方和接收方使用共享密钥计算出各自的AES密钥、MAC密钥以及进出口的MAC哈希。 + +12. 建立安全通信通道:握手完成,发起方和接收方之间建立了安全的加密通信通道。之后的通信将使用共享密钥进行加密和解密。 + +13. 在整个握手过程中,Diffie-Hellman(DH)密钥交换算法用于确保发起方和接收方能够安全地协商出共享密钥。通信过程中,所有的数据包都使用共享密钥进行加密和解