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