common.go
提供一些通用方法。
checkspec
根据不同的运行语言检查chaincode详细描述有效性。
getChaincodeDeploymentSpec
获得chaincode部署详细描述。
checkSpec检查chaincode描述
GetChaincodePackageBytes获得docker容器中不同运行语言下的chaincode代码,如golang会将代码压缩为.tar.gz文件,具体见core/platforms。
构造pb.ChaincodeDeploymentSpec结构返回
getChaincodeSpec
checkChaincodeCmdParams检查命令参数有效性
从cli cmd获得chaincode详细描述,具体的命令参数已经解析放入了chaincode.go里面定义的那些全局变量,把这些全局变量汇总成结构pb.ChaincodeSpec。
chaincodeInvokeOrQuery(cmd *cobra.Command, args []string, invoke bool, cf *ChaincodeCmdFactory)
获取链码详细信息(含有发出的指令里的信息,比如-C 通道、-n 名字、-c 参数)。
ChaincodeInvokeOrQuery()(创建proposal,对proposal进行签名,给endorser去执行proposal,拿到proposalResponse后组合成完整的签名交易,类型是一个Envelope,将envelope发给orderer去排序,返回proposalResponse)。
如果chaincode是要执行的,检查proposalResponse,调用GetChaincodeAction进一步执行。
返回nil。
getCollectionConfigFromFile
getCollectionConfigFromBytes
从文件中读取配置集合
InitCmdFactory
初始化chaincode命令工厂,
如果需要跟endorser通信,那么创建endorserClient,参见peerclient.go的NewPeerClientFromEnv函数。
获取默认的签名实体
如果需要跟orderer通信,那么创建跟orderer交互的BroadcastClient。这里还有一层判断,如果配置没有指定orderer的地址,那么使用GetOrdererEndpointOfChainFnc函数获取所有orderer的地址,取第一个作为通信orderer,调用GetBroadcastClientFnc函数获取BroadcastClient,如果指定了orderer地址,那么直接调用GetBroadcastClientFnc获取BroadcastClient。
根据上面获得信息组装ChaincodeCmdFactory返回
ChaincodeInvokeOrQuery(spec *pb.ChaincodeSpec...)
此函数跟上面解析命令的chaincodeInvokeOrQuery函数区分开,这里是真正的chaincode调用函数。
创建chaincode执行描述结构,创建proposal
对proposal签名
使用grpc调用endorserClient.ProcessProposal,触发endorer执行proposal
得到proposalResponse,如果是查询类命令直接返回结果;如果是执行交易类,需要对交易签名CreateSignedTx,然后调用BroadcastClient发送给orderer进行排序,返回response
Last updated