导言:
本文使用fabric1.1版本,此时有小朋友会问了,fabric都出1.4.2了你怎么还在看1.1呢!首先fabric自1.0以后大的架构基本没有变化,小版本升级只是功能性上更加丰满了,当然最重要的是有一本对源码解读超详细的书《Hyperledger Fabric技术内幕:架构设计与实现原理》使用的就是1.1版本,不懂的地方看看这本书就会茅塞顿开,强烈推荐嗷!,如果阅读源码有障碍,可阅读本人使用的版本,其中有大量注释,不过因为是随手笔记有些许潦草 https://github.com/mikesen1994/FabricSourceAnalyze
在直接阅读源代码前,如果您只运行过官方docker-compose的一键部署,那么强烈建议手动搭建一套Fabric网络,这样会更加了解Fabric的运行细节,对阅读源码很有帮助,推荐博客 https://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2018/04/26/hyperledger-fabric-deploy.html
本文不会细讲源码中每个函数每个方法,只是讲解orderer服务运行的大体流程以及官方使用了哪些开源工具
参考书籍:《Hyperledger Fabric技术内幕:架构设计与实现原理》
《深度探索区块链 Hyperledger技术与应用》
orderer模块入口:hyperledger\fabric\orderer\common\server\main.go
一.首先通过kingpin技术(命令行解析工具)接收命令行命令
比如在orderer文件存在的目录命令行直接敲:
orderer start //启动orderer模块
orderer version //打印当前版本信息
orderer benchmark //测试运行orderer
orderer help //显示帮助信息
fullCmd := kingpin.MustParse(app.Parse(os.Args[1:]))
if fullCmd == version.FullCommand() {
//如果接收到version命令直接打印当前orderer版本
fmt.Println(metadata.GetVersionInfo())
return
}
二.然后通过viper技术(管理配置信息的工具)加载配置信息,并将当前目录下的的orderer.yaml文件转化为具体配置信息的结构体
conf, err := config.Load() ——> config := viper.New()) ——> cf.InitViper(config, configName)
下图为本人实操时orderer的配置信息,orderer启动时实际转化的就是此文件
下图为转化后的结构体,可以看到结构体与orderer.yaml的配置信息很匹配
目录:hyperledger\fabric\orderer\common\localconfig\config.go
type TopLevel struct {
General General
FileLedger FileLedger
RAMLedger RAMLedger
Kafka Kafka
Debug Debug
}
三.通过配置信息初始化日志等级,fabric的日志管理主要使用了第三方包go-logging(主要特点是可以根据设置的日志等级来显示不同的颜色,以及可以直接定位到产生日志的代码位置),部分使用了go语言标准库中的log。在此基础上fabric自己封装出来了flogging,默认的日志等级是debug
initializeLoggingLevel(conf)
四.通过配置信息加载并初始化Msp文件
initializeLocalMsp(conf) ——> mspmgmt.LoadLocalMsp(conf.General.LocalMSPDir, conf.General.BCCSP, conf.General.LocalMSPID)
主要用到的就是orderer.yaml配置文件里的以下三个信息:
五.将命令与配置信息传递给Start函数
Start(fullCmd, conf)
六.创建本地MSP签名者实例,实际就是一个空的mspSigner结构体指针
signer := localmsp.NewSigner()
七.通过TLS相关的配置信息,初始化TLS认证需要的的安全服务器配置项
serverConfig := initializeServerConfig(conf)
获得的serverConfig由两种结构体组成SecureOptions与KeepaliveOptions
SecureOptions保存了用于tls验证的公钥私钥,服务器CA证书,客户端CA证书等。
KeepaliveOptions则是用于设置grpc双方通讯的配置的信息包括客户端等待响应时间,服务端等待响应时间,客户端通讯响应间隔等信息
八.初始化grpc服务,传入配置文件与TLS配置信息,通过TLS配置信息来决定是否启用tls验证
grpcServer := initializeGrpcServer(conf, serverConfig)
九.使用serverConfig的客户端CA证书列表构造CA证书支持组件对象,在注册多通道管理器对象时需要用到
caSupport := &comm.CASupport{