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打开项目 项目结构如下:
我们第一步先看一下配置文件的生成,以及证书的生成。
这个目录就是上面那个文件所用的命令,这个文件夹包含 ca、csp、metadata、msp、idemixgen、protolator这几个文件夹
所有的模块的起步都是main 方法。找到main.go文件。找到main方法
kingpin是一个第三方的包,主要是用于生成cmd 命令。这个mian方法里面包含 generate、extend、 showtemplate、vesion等方法。
我们看一下kingpin的在这里是如何使用的。
在main方法上面定了一些变量。
其中生成了一个新的结构体 Application的对象,指定了名称,并把他添加到一个执行命令的分组中,然后添加一下其他的参数信息,提供帮助。
产生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)//打印参数值
}
看一下这个方法的具体实现,这个是所有的配置文件生成的方法,
如果没有传文件,那么我们读取默认配置文件,然后通过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)
}
循环所有的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支持的算法。如果上面有什么不妥的地方,请指正,谢谢