P2P网络数据处理流程
监听(ListenLoop)+拨号(Dial) –> 建立连接(SetupConn) –> Enc 握手(doEncHandshake) –> 协议握手(doProtoHandshake) –> 添加Peer Addpeer –> Run Peer
1. Enc握手 doEncHandshake
监听时接收到Enc握手:receiverEncHandshake
拨号时发起初始End握手:initiatorEncHandshake
链接的发起者被称为initiator(主动拨号),链接的被动接受者被成为receiver(被动监听)。 这两种模式下处理的流程是不同的,完成握手后, 生成了一个sec可以理解为拿到了对称加密的密钥。 然后创建了一个newRLPXFrameRW帧读写器,完成加密信道的创建过程。
initiatorEncHandshake 和receiverEncHandshake有些像,但逻辑处理是相反的过程。
makeAuthMsg
makeAuthMsg这个方法创建了handshake message。 首先对端的公钥可以通过对端的ID来获取。对端的公钥对于发起者来说是知道的;对于接收者来说是不知道的。
- 根据对端的ID计算出对端公钥remotePub
- 生成一个随机的初始值initNonce
- 生成一个随机的私钥
- 使用自己的私钥和对方的公钥生成的一个共享秘密
- 用共享秘密来加密这个initNonce
- 这里把发起者的公钥告知对方
这一步,主要是构建authMsgV4结构体。
sealEIP8
sealEIP8对msg进行rlp的编码,填充一下数据,然后使用对方的公钥把数据进行加密。
<