Fabric的源码阅读方式

凝波碧浪 · · 2359 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

Hyperledger fabric,什么是Hypeledger,什么是Fabric?Hypeledger从字面上的意思是超级账本,它是Linux基金会于2015年12月启动了名为“超级账本”的开源项目,旨在推动各方协作,共同打造基于区块链的企业级分布式账本底层技术,用于构建支撑业务的行业应用和平台,以便支持各种各样的商业应用场景。Fabric是超级账本中的一个项目,为商业区块链应用提供底层支持.Fabric是由IBM、数字资产和Blockstream等三家公司的代码整合而成.

准备工作

  1. 环境准备(Ubuntu)

a. 安装go的开发环境
b. 安装git工具及环境配置
c. 利用git下载Fabric源码.
    git clone https://github.com/hyperledger/fabric.git (最好下载在go配置路径的src文件夹下)

  1. 技能准备

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学习笔记


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:凝波碧浪

查看原文:Fabric的源码阅读方式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2359 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传