06b0dae2680adba30aa4617e65094157
Go Ethereum P2P : 实现[2] RLPX EIP-8 详解

Ethereum 网络协议栈、

上一节, 我们分析了基本的Ethereum 网络通信的控制流程。 这一节, 我们将更为细致深入的分析一些细节

如上图所示, 在底层的golang的网络通信类库Tcp socket接口与 上层的核心协议之间, 存在一个中间层
被称之为transport, 这一层的主要工作就是对于上层消息的编解码/加解密从而使得通信高效而安全。
在thereum 中 这一层的实现是通过rlpx 协议来完成。

第一阶段 密码学 握手协议

这一阶段主要用于协商后续所用共享secret

Rlpx 协议详解

rlpx 协议之中又可以分为3个层次:

  1. 首先是对上层协议的原始消息的编解码.编解码的协议是RLP。
    • 主要目的是使得数据类型在传输中编解码的结果与平台无关.
  2. 其次是针对RLP编解码的结果进行压缩或者解压缩。这里采用的是snappy压缩算法
  3. ECIES(Elliptic Curve Integrated Encryption Scheme) 加/解密算法
    • 对于压缩后的数据进行加密
    • 或者对于网络栈上传的数据进行解密而后解压缩。

ECIES 加密算法

ECIES 算法是一种基于椭圆曲线的集成了密钥交换+对称加密+消息验证码的一套算法体系。
假设Alice 想和Bob建立安全的链路,同时Alice 知道 Bob的公钥。
基本流程:

  1. Alice 首先选择一个随机数 r, 然后通过与secpk256k1的生成元G 相乘得到一个值R = r * G (一个临时密钥对)
    R可以被视为临时公钥, r 可以被视为临时私钥
  2. Alice 用自己的随机数r 与Bob的公钥在曲线上相乘得到点对 $ (S_{x}, S_{y})= r* K_{pub,Bob} $
    • 这里要注意 $ K_{pub,Bob} = K_{private, Bob} * G $
  3. Alice 之后选择 共享秘密种子 $ S_{secret} = S_{x} $, 并且通过$S_{secret}$ 使用密钥生成函数(KDF)生成后面对称加密算法的密钥, IV, 以及消息验证码的密钥以及IV,最后发送R 给 Bob。
  4. Bob 接收到R之后, 通过使用自己的私钥$ K_{private} * R= K_{private} * r * G=r*K_{pub} =(S_{x}, S_{y})$这样一来 就推导出了共享的秘密种子$ S_{secret} $
  5. Bob 也使用同样的KDF 即可生成Alice已经生成的那些对应的密钥和IV,从而使得安全链路得以建立。

RLPX 消息(EIP-8)的格式(不考虑压缩 EIP-706)

AuthMsg最外层的报文格式主要应用于 ECIES 层面

top Created with Sketch.