93253057753b47c090b5ec6b41f79fb8
Eth 服务分析[2] Protocol Manager 主体框架详解

Protocol Manager 的设计框架比较复杂, 所以我在这里把整个PM的功能分解为5个部分来分析, 这5个部分其实也是相互有联系的。 不过分解之后,整体的逻辑关系会更加的清晰一些。

初始化

在之前关于Node Service 的章节, 我们已经讨论过了 Eth service 的启动过程,我们可以回顾一下。

  1. node 的代码初始化了p2p server 对象, 命名为running
  2. 接下来, node 模块的代码继续创建各类service,会把各个模块支持的协议加入到p2p server 对象的协议列表中。
  3. 在这里要注意 service.Protocol() 函数在Eth服务中的实现,看下图

    大家可以看到service.Protocol() 对于eth服务而言是返回了protocolManager.SubProtocol 列表.
  4. 我们再回过头来,看看eth服务创建的初期,生成protocolManager 时是如何初始化这些协议的.

    这段代码在我们文章中出现过好些次. 实际上具体的协议实例是在这里创建并插入到protocolManager.SubProtocol 列表中.
    从而实现了把这里注册的协议实例传递给p2p.server 对象. 更进一步细节可以参考我们在p2p 模块分析中的文章. 复习一下重点就是Run这个callback传递到了 p2p.server 对象, 用来处理inbound packet.

Inbound Msg handler

从Run这个Callback函数就会把我们导向PM环节的一个重要的组成部分, 那就是对于inbound的消息进行解析并执行的部分. 这里主要是解析eth62/63的协议. 大家可以先回忆一下上一节我们分析过的eth62/63的协议. Packet经过transport的解密/解压操作, 在经过握手协议(Status)之后, 最终会来到protocolManager.handleMsg()这里. 这里是一个大的 switch /case 结构. 这里实现了协议每一个msgcode的对应的处理逻辑. 同时这里也是连接 blockchain数据库/peer对象的outbound/downloader/fetcher 的关键地方. 后续我们会做详尽的分析.

top Created with Sketch.