fabric源码阅读第一篇

fabric的现在是国内做的最多的,但是没有实际的应用落地,所以我作为一个初学者,原本是一个java的开发者,却为了一窥究竟,直接转go了。

我们从git上获得fabric的源码, 本机先要安装git。安装go sdk,编程工具用的是GoLand

gti clone https://github.com/hyperledger/fabric.git

然后我们打开fabric的官方文档,我是没有找到很好的方法,我就根据官网文档上的操作说明,一步一步的查看源代码,如果有更好的方法,请提供一下。

fabric的中文文档地址,根据这个文档差不多就可以

https://hyperledgercn.github.io/hyperledgerDocs/

用GoLand打开项目 项目结构如下:

fabric源码阅读第一篇_第1张图片

 

然后我们再看一下fabric的中文文档,fabric源码阅读第一篇_第2张图片

我们第一步先看一下配置文件的生成,以及证书的生成。

我们找到fabric源码阅读第一篇_第3张图片

这个目录就是上面那个文件所用的命令,这个文件夹包含 ca、csp、metadata、msp、idemixgen、protolator这几个文件夹

所有的模块的起步都是main 方法。找到main.go文件。找到main方法fabric源码阅读第一篇_第4张图片

kingpin是一个第三方的包,主要是用于生成cmd 命令。这个mian方法里面包含 generate、extend、 showtemplate、vesion等方法。

我们看一下kingpin的在这里是如何使用的。

fabric源码阅读第一篇_第5张图片

在main方法上面定了一些变量。

fabric源码阅读第一篇_第6张图片

 其中生成了一个新的结构体 Application的对象,指定了名称,并把他添加到一个执行命令的分组中,然后添加一下其他的参数信息,提供帮助。

fabric源码阅读第一篇_第7张图片

产生generate的命令,然后指定output参数,如果没有,那么默认值是crypto-config,参数类型是String,指定config的参数 默认的类型是FIle.

产生showtemplate命令,没有任何参数

产生version命令 没有任何参数

产生 ext命令 ,然后指定inputDir参数,默认值是crypto-config 类型是String,指定参数config,类型是File。

然后main方法中 解析获得参数。为了自己更好的理解,特意做了一个例子加深理解:

func main()  {
   app:=kingpin.New("crptogen","command name")
   gen:=app.Command("gen","generate key")//生成一个命令
   a:=gen.Flag("param1","param1").String()//添加一个参数,类型string,返回的是这个参数的内存地址
   //gen.Flag("param2","param2")
   fmt.Println(">>>>",*a)//先输出a的值
   fmt.Println(kingpin.MustParse(app.Parse(os.Args[1:])))//解析参数命令,获得命令名称,以及所有的参数值
   fmt.Println(">>>>",*a)//打印参数值

}

运行结果如下fabric源码阅读第一篇_第8张图片

我们回到正题,

看一下这个方法的具体实现,这个是所有的配置文件生成的方法,

fabric源码阅读第一篇_第9张图片

 

1.先获得配置文件getConfig方法fabric源码阅读第一篇_第10张图片

fabric源码阅读第一篇_第11张图片

如果没有传文件,那么我们读取默认配置文件,然后通过yaml文件解析。返回config 对象。

for _, orgSpec := range config.PeerOrgs {
   err = renderOrgSpec(&orgSpec, "peer")
   if err != nil {
      fmt.Printf("Error processing peer configuration: %s", err)
      os.Exit(-1)
   }
   generatePeerOrg(*outputDir, orgSpec)
}

找到配置文件的标签fabric源码阅读第一篇_第12张图片

 

循环所有的PeerOrgs标签,然后调用生成所peerOrgder的单独文件

func renderOrgSpec(orgSpec *OrgSpec, prefix string) error {
   // First process all of our templated nodes
   for i := 0; i < orgSpec.Template.Count; i++ {//循环组织节点的个数
      data := HostnameData{
         Prefix: prefix,//前缀
         Index:  i + orgSpec.Template.Start,//开始的坐标
         Domain: orgSpec.Domain,//组织域名
      }

      hostname, err := parseTemplateWithDefault(orgSpec.Template.Hostname, defaultHostnameTemplate, data)
      //生成默认的模板
      if err != nil {
         return err
      }

      spec := NodeSpec{
         Hostname: hostname,
         SANS:     orgSpec.Template.SANS,
      }
      orgSpec.Specs = append(orgSpec.Specs, spec)
   //添加nodeSpec,构成树
   }
for idx, spec := range orgSpec.Specs {//循环所有的组织的Specs
   err := renderNodeSpec(orgSpec.Domain, &spec)
   if err != nil {
      return err
   }

   orgSpec.Specs[idx] = spec
}

// Process the CA node-spec in the same manner
if len(orgSpec.CA.Hostname) == 0 {//如果组织描述中的CA的hostname为空,那么就默认ca
   orgSpec.CA.Hostname = "ca"
}
err := renderNodeSpec(orgSpec.Domain, &orgSpec.CA)//向模板中添加
if err != nil {
   return err
}

return nil

上面主要讲的是配置文件的解析,下次要讲证书,生成,以及fabric支持的算法。如果上面有什么不妥的地方,请指正,谢谢

 

你可能感兴趣的:(fabric源码阅读第一篇)