前言
Hyperledger fabric,什么是Hypeledger,什么是Fabric?Hypeledger从字面上的意思是超级账本,它是Linux基金会于2015年12月启动了名为“超级账本”的开源项目,旨在推动各方协作,共同打造基于区块链的企业级分布式账本底层技术,用于构建支撑业务的行业应用和平台,以便支持各种各样的商业应用场景。Fabric是超级账本中的一个项目,为商业区块链应用提供底层支持.Fabric是由IBM、数字资产和Blockstream等三家公司的代码整合而成.
准备工作
- 环境准备(Ubuntu)
a. 安装go的开发环境
b. 安装git工具及环境配置
c. 利用git下载Fabric源码.
git clone https://github.com/hyperledger/fabric.git (最好下载在go配置路径的src文件夹下)
- 技能准备
2.1 Fabric项目主要是使用go语言进行编写,所有需要具备go语言的基础知识.
a.基本的go语法知识.
b.go的并发知识.
c.一定的项目架构的设计模式思想2.2 通过Fabric项目部署的peer网络节点间的数据交互是属于不同的service(进程)间的通信,使用的是gRPC(谷歌的远程过程调用协议).所以需要掌握gRPC的基本用法和知识.而交互的数据格式使用的是 Protocol Buffers.
阅读方式-HOW
step 1 了解Fabric项目下的各个模块包的作用,Fabric源码项目是由不同的模块包组成的,了解各个模块包的作用有助于快速查找到你需要阅读的源码类.模块和包划分可参考http://qukuaiwang.com.cn/news/722.html. Fabric项目主要有三大模块peer和Order和fabric-ca,其中fabric-ca模块需要另外下源码.本文讨论的是Fabric的源码,只包括peer和Order两个模块.其他的Fabric源码中的不同的包都是为这两个模块服务.
step 2选定你要阅读和理解的模块部分.
图中peer和o-service的属于Fabric源码中的模块内容.
step 3 模块的源码阅读(举例说明)
注意
:Docker部署Fabric网络需要的镜像是通过编译Fabric的源码的模块部分而来的,比如说,Fabric网络中的Peer镜像是通过make Peer模块的源码而来的.
eg
如果选定的是阅读Order模块的源码,需要对照利用Order模块的源码编译生成的Order Docker镜像来启动的Order容器.
3.1下图是fabric部署的网络节点启动的docker容器展示图.-----图中可以看到最后一个容器启动的信息启动的是Order容器,启动时候运行的命令是"orderer",容器服务开放的端口是7050端口,用于gRPC服务通信.
3.2 进入到Fabric源码目录的文件夹,找到main.go入口文件.
3.3 main.go入口文件的代码理解
说明main.go文件中的第三方包
kingpin - 一个Go(golang)命令行和flag解析器支持子命令.
//命令变量的的初始化,app
var (
app = kingpin.New("orderer", "Hyperledger Fabric orderer node")
start = app.Command("start", "Start the orderer node").Default()
version = app.Command("version", "Show version information")
)
//入口函数main
func main() {
//开始解析命令kingpin
switch kingpin.MustParse(app.Parse(os.Args[1:])) {
// "start" command
case start.FullCommand():
logger.Infof("Starting %s", metadata.GetVersionInfo())
conf := config.Load()
initializeLoggingLevel(conf)
initializeProfilingService(conf)
grpcServer := initializeGrpcServer(conf)//初始化gPRC服务配置
initializeLocalMsp(conf)
signer := localmsp.NewSigner()
manager := initializeMultiChainManager(conf, signer)
server := NewServer(manager, signer)
ab.RegisterAtomicBroadcastServer(grpcServer.Server(), server)
logger.Info("Beginning to serve requests")
grpcServer.Start()//启动服务
// "version" command
case version.FullCommand():
fmt.Println(metadata.GetVersionInfo())
}
}
1.Order的Docker容器运行起来的时候初始化命令是"orderer",而初始化命令参数flag默认的是"start",
start = app.Command("start", "Start the orderer node").Default()
2.解析命令是switch的是"start" command,运行的是start.FullCommand()
分支下的代码,执行的是一些初始化的操作,接下来就可以具体查看Order模块的源码初始化的细节.
参考链接
Protocol Buffers的学习笔记
gRPC学习笔记
有疑问加站长微信联系(非本文作者)