从今天开始,正式启动Fabric 1.4 源码分析系列专题,本文是源码分析系列的第一篇,决定先从 Orderer 入手。由于Fabric源码涉及的模块、知识点的深度和广度非同一般,为了避免从一开始就落入细节,因此决定先采用模块分解 + 架构梳理 + 知识点细化的三步走战略进行。希望通过这样自顶向下,逐步细化的方式从整体上把握fabric的实现原理,涉及到具体开发工作时又能快速上手。
代码目录
源码分析的宗旨是一切始于源码,终于源码。所以我们首先来看看orderer这块的代码目录。orderer相关的代码主要在 fabric/orderer文件夹中:
➜ fabric git:(readCode) ✗ tree -L 2 orderer
orderer
├── README.md
├── common
│ ├── blockcutter 缓存待打包的交易,切块
│ ├── bootstrap 启动时替换通道创世块
│ ├── broadcast orderer的Broadcast接口
│ ├── cluster (Raft)集群服务
│ ├── localconfig 解析orderer配置文件orderer.yaml
│ ├── metadata 区块元数据填写
│ ├── msgprocessor 交易检查
│ ├── multichannel 多通道支持:Registrar、chainSupport、写区块
│ └── server Orderer节点的服务端程序
├── consensus 共识插件
│ ├── consensus.go 共识插件需要实现的接口等定义
│ ├── etcdraft raft共识插件
│ ├── inactive 未激活时的raft
│ ├── kafka kafka共识插件
│ ├── mocks 测试用的共识插件
│ └── solo solo共识插件
├── main.go orderer程序入口
├── mocks
│ ├── common
│ └── util
└── sample_clients orderer的客户端程序样例
├── broadcast_config
├── broadcast_msg
└── deliver_stdout
23 directories, 3 files
相信大家这样过了一遍心里有个大致印象,但还是一脸懵逼,不过没关系,我们接着往下看:
功能概述
Orderer排序节点管理着系统通道与所有应用通道,负责通道创建、通道配置更新等操作,并处理客户端提交的交易消息请求,对交易进行排序并按规则打包成新区块,提交账本并维护通道账本数据,为全网节点提供Broadcast交易广播服务、Orderer共识排序服务、Deliver区块分发服务等。
一笔交易在Orderer中经历的过程
还记得在上一篇中我们介绍了一笔交易在fabric中所经历的过程,那么这一节我们依旧以交易为切入点,聚焦于交易在orderer这部分到底经历了什么。
orderer节点首先通过Broadcast广播交易服务从客户端获取经过背书的交易消息,然后将交易进行排序并打包成区块,最后通过Deliver区块分发服务向peer节点分发打包好的区块。
其中将交易进行排序和打包成区块的步骤又可以进一步分解为:
- 对交易进行多项检查(MsgProcessor)
- 通过solo、kafka、raft等共识算法对交易进行排序(consensus共识插件)
- 根据切块策略进行切块(BlockCutter)
- 保存区块文件(BlockWriter)
通过以上对一笔交易在orderer中所经历的过程进行分析,我们会发现其实orderer这块的源码可以拆分成以下几个主要模块:
- 广播交易服务:Brodcast
- 交易检查:Msgprocessor
- 交易排序:Solo、Kafka、Etcdraft
- 切块:Blockcutter
- 写区块:BlockWriter
- 区块分发服务:Deliver 区块分发服务
除此之外,在分析源码之前我们还需要了解 Ordrer 的核心数据结构以及 Orderer节点的启动流程。
综上所述,orderer源码解析的知识图谱就呼之欲出了。