Building Your First Network例子中,命令为
1 | peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ |
客户端调用peer chaincode install
命令安装chaincode,代码在‘peer/chaincode/install.go’这个文件下,命令关联的方法是chaincodeInstall
。[install的流程与前面介绍的instantiate大体相似,重复不再展开,只勾勒差别处]
1 | // chaincodeInstall installs the chaincode. If remoteinstall, does it via a lscc call |
- install与instantiate方法类似,首先
InitCmdFactory
初始化命令工厂辅助,参见instantiate(1). 获取chaincode的文件描述。这里分为两种方式,区别在于是否先使用
peer chaincode package
命令,得到的package作为chaincode istall
参数,通常还经过多个参与者签名。具体可以参看chaincode lifecycle。package命令以后再详述。Tutorial里的例子没有先经过package,参数ccpackfile
为空,则进入genChaincodeDeploymentSpec
第一种方式产生cds。genChaincodeDeploymentSpec
过程与instantiate大致一致,可以参考instantiate(2),这里不同的是peer/chaincode/common.go:getChaincodeDeploymentSpec
里会进入到if
条件里,执行到codePackageBytes, err = container.GetChaincodePackageBytes(spec)
。这个方法会区分不同的语言平台(这个语言选择是命令行里-l指定的)将代码gzip压缩,tar打包(以golang为例,为了精简包大小,去除golang标准库,fabric框架包等,加入第三方依赖包,META-INF信息等),返回[]byte。后面的流程与instantiate类似,可参考不再详述,可以认真对比下区别在于cis的Input和cds。
产生ccpackmsg
(pb.ChaincodeDeploymentSpec
结构)执行install
。正如源码里的注释和前面instantiate(1)介绍的InitCmdFactory,install方法只能作用于唯一一个endorser(”peer.address”)。注意,这里与instantiate不同,在instantiate里还有第三步cf.BroadcastClient.Send(env)
.这里说明,install命令不需要将message发往orderer去排序和产生区块。
1 | // peer.ChaincodeInvokeSpec(cis) |
至此,peer端的install完成,该节点仅仅是作为执行install命令,需要本地拥有install的代码包,install并不是安装到该peer节点而是endorser节点。