3b4d86871a03ee0834b530764ac9cc1d
Eth 服务分析[1] 总体架构

Eth Service的架构

在之前我们的Node/Service 的架构分析中已经提到过Eth 是Service 的一种, 与之并列的还有Les, Whisper, Swarm 等等。 在Geth中 Eth service 是最核心的一项服务也是最复杂的一项服务。 基本上 Eth 负责协调所有的相关的子模块。包括了与P2P通信, 挖矿,API backend, 下载与同步区块, 广播区块,交易在虚拟机中的执行,Bloom Indexer/Filter 子模块等等。 是所有这些模块的粘合剂。 是整个geth设计中的核心。

  1. 首先是最基础的模块 Ethdb, 这个是整个表达区块链数据接口的leveldb数据库引擎的抽象。 后续其它很多模块都依赖于此。 本身的独立性较强。IO时延过大是目前的主要缺点,亟待优化。
  2. 其次是共识引擎。 consensus Engine 是一组抽象出来的接口结构, 可以有不同的实现。 目前有POW 的ethash以及测试网络使用的POA的Clique 两种, 未来有可能会融入新开发的POS 算法Casper。 这个模块也是非常基础的模块,后续不少模块依赖于此。 同时独立性比较强。 自成一体。
  3. BlockChain 是针对整个区块链组成的数据+逻辑的抽象。 依赖于前面两个模块 Ethdb,consensus engine. 这个模块既包含了区块,交易的数据结构,也有如何串行化这些数据到数据库引擎的逻辑,也包含如何执行交易,验证交易以及如何处理分叉等等逻辑, 非常复杂, 其基本的实现都在core目录下。 后面我们会有专门章节分析。 在Eth service环节,我们首先当作黑箱来处理,只负责调用其接口。这个模块在最新的版本中加入了一些缓存机制,来加速读写。
  4. bloom Indexer/filter 是用来对已有的区块链进行bloom filter 索引以及查询的一组go routine, 相对独立,仅仅依赖 BlockChain。 这也是Eth Service 的一个重要组成部分。 主要负责完成对于一些event的监听和索引优化的任务。 主要实现也是在core 目录下。
  5. txpool 是另外一个重要的数据结构, 主要是本地还没有正式进入区块的一些交易的缓冲区, 这些交易的排序,以及广播,验证,删除, 其主要实现也是在core目录下。 其也依赖于BlockChain 模块。
  6. 最后是Eth Service中的主角:ProtocolManager. 这里主要是两种eth高层协议的实现 eth62/63. 核心的功能是交易/区块的同步/广播的功能。 下面包含了Downloader/fetcher 两个子模块。 逻辑异常复杂, 同时主要也和我们之前分析的P2P模块之间保持通信。 是承上启下的核心枢纽。 所以,这里也是我们分析的重点。 我们接下来首先会从这里开始。

ProtocolManager 架构分析

ProtocolManager 设计所要面临的问题主要是来自本地和远程两个方面

  1. 通过本地的渠道生成添加的新交易, 需要广播出去。
  2. 本地挖矿成功所产生的区块,需要广播出去。
  3. 通过远程的其它节点广播传播而来的新区块,新交易
  4. 处理远程其它节点的数据同步要求
  5. 处理初始化时批量的数据下载任务

总的来说就是上传下达,沟通内外。 所以ProtocolManager设计比较复杂。
在我们进一步分析ProtocolManager 之前,需要了解一下大致的相关通信协议。

Ethereum Sub-protocol

基本的BlockChain 同步流程

  1. 两个连接的节点需要首先互相发送Status 消息。 Status消息包含这条链的目前的累计难度(Total Difficulty)以及对应的block的Hash值。
  2. 累计难度较低的节点要向累计难度较高的节点请求同步Block信息。

Status 的结构

MsgCode 是 0x0

  1. 协议版本, 目前主要使用eth63
  2. networkId, 目前的geth世代版本。 或者是测试网络id
  3. td. 累计难度(Total Difficulty)
  4. bestHash,累计难度最大的block的hash值
  5. genesisHash: 创世块的hash值

NewBlockHashesMsg

MsgCode 是 0x1
接收到最多256个新的区块的hash值。

TxMsg

MsgCode 是 0x2
接收到一系列交易的hash值,交易列表中至少包含一个新的交易。

top Created with Sketch.