以太坊RLPX网络协议

無名 发表于: 2018-07-24   最后更新时间: 2018-07-24 20:25:56  
{{totalSubscript}} 订阅, 5,422 游览

RLPX 是以太坊的底层网络协议套件,包括P2P加密通信,节点发现等功能。RLPX还包含通信协议和节点发现协议,还有运行这两个协议的 Server 逻辑。

当以太坊节点启动时,会同时监听TCPUDP的端口(通常是用同一个端口),UDP 用来处理节点发现协议,TCP用来接收P2P通信。

想要连接到以太坊的节点开始通信,需要如下信息 node_id,ip, tcp端口号。要注意node_id同时也是节点的公钥地址,之后协议握手时会用到。

下面是个 enode 地址

enode://26ba1aadaf59d7607ad7f437146927d79e80312f026cfa635c6b2ccf2c5d3521f5812ca2beb3b295b14f97110e6448c1c7ff68f14c5328d43a3c62b44143e9b1@127.0.0.1:30335
  • node_id:26ba1aadaf59d7607ad7f437146927d79e80312f026cfa635c6b2ccf2c5d3521f5812ca2beb3b295b14f97110e6448c1c7ff68f14c5328d43a3c62b44143e9b1

  • ip :127.0.0.1

  • tcp端口:30335

每个节点拥有自己的公钥私钥对(node_id 就是公钥)。进行 P2P 通信时,接收方和发送方会各自再生成一个临时的公钥、私钥对。

迪菲-赫尔曼(ECDH)算法是个重要加密学技术,可以用私钥和对方公钥计算出一个共享的密钥,比如有 A、B 两个公私钥对,ECDH(A私钥, B公钥) == ECDH(B私钥, A公钥)。是交换密钥的重点原理。

  1. 首先,客户端发起tcp请求。用服务端的公钥(node_id)加密,发送自己的公钥和包含临时公钥的签名,还有一个随机生成的 nonce。

  2. 服务端收到信息,获得客户端的公钥,同时利用ECDH算法从签名中最终获取客户端的临时公钥(留到第4步使用。服务端把自己的临时公钥和随机nonce用客户端的公钥加密并发送。

  3. 客户端获取到服务端的临时公钥和nonce,利用ECDH 算法从自己的临时私钥和对方的临时公钥计算出共享密钥,共享密钥用来加密之后的通信过程,nonce用来验证之后对方发来的信息。

  4. 服务端进行同样的计算,用自己的临时密钥和客户端的临时公钥获取共享密钥。

第一阶段的密钥交换完成,现在客户端和服务端拥有同一个共享密钥,和对方的nonce。共享密钥会用来加密以后的通信内容(对称加密比非对称加密效率更高),nonce会用来生成mac(消息认证码),保证收到的信息完整。

  • 进行完密钥交换后,以后的通信都要使用 Frame 格式,Frame 包含 head 和 body, 很类似 TCP 包的格式。

第二阶段握手称为协议握手,发起节点发送自己支持的协议、节点名称、节点版本,服务端会进行判断,如果协议版本不符合则断开。

至此,RLPX 的协议握手完成,之后的操作是在 RLPX 之上实现的以太坊子协议

DevP2P RLPX 是个很灵活的协议,不仅是用于 Ethereum,而是为 P2P 通信而建设。

更新于 2018-07-24

查看ethereumj更多相关的文章或提一个关于ethereumj的问题,也可以与我们一起分享文章