Fabric的源码阅读方式

作者: 小简铺子 | 来源:发表于2017-10-04 11:10 被阅读364次

    前言

    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的源码阅读方式

        本文链接:https://www.haomeiwen.com/subject/hvgqyxtx.html