描述
peer chaincode upgrade命令用于对chaincode升级。
定义
func upgradeCmd(cf *ChaincodeCmdFactory) *cobra.Command {
chaincodeUpgradeCmd = &cobra.Command{
Use: upgradeCmdName,
Short: "Upgrade chaincode.",
Long: "Upgrade an existing chaincode with the specified one. The new chaincode will immediately replace the existing chaincode upon the transaction committed.",
ValidArgs: []string{"1"},
RunE: func(cmd *cobra.Command, args []string) error {
//命令执行入口
return chaincodeUpgrade(cmd, args, cf)
},
}
//添加命令标记
flagList := []string{
"lang",
"ctor",
"path",
"name",
"channelID",
"version",
"policy",
"escc",
"vscc",
}
attachFlags(chaincodeUpgradeCmd, flagList)
return chaincodeUpgradeCmd
}
入口函数
func chaincodeUpgrade(cmd *cobra.Command, args []string, cf *ChaincodeCmdFactory) error {
var err error
if cf == nil {
//初始化ChaincodeCmdFactory
cf, err = InitCmdFactory(true, true)
if err != nil {
return err
}
}
defer cf.BroadcastClient.Close()
//升级过程
env, err := upgrade(cmd, cf)
if err != nil {
return err
}
if env != nil {
logger.Debug("Send signed envelope to orderer")
//发送签名信封到orderer进行广播
err = cf.BroadcastClient.Send(env)
return err
}
return nil
}
升级过程
func upgrade(cmd *cobra.Command, cf *ChaincodeCmdFactory) (*protcommon.Envelope, error) {
//获取到ChaincodeSpec
spec, err := getChaincodeSpec(cmd)
if err != nil {
return nil, err
}
//获取到ChaincodeDeploymentSpec
cds, err := getChaincodeDeploymentSpec(spec, false)
if err != nil {
return nil, fmt.Errorf("Error getting chaincode code %s: %s", chainFuncName, err)
}
//获取msp所有者身份
creator, err := cf.Signer.Serialize()
if err != nil {
return nil, fmt.Errorf("Error serializing identity for %s: %s", cf.Signer.GetIdentifier(), err)
}
//从ChaincodeDeploymentSpec创建chinacode升级的提案
prop, _, err := utils.CreateUpgradeProposalFromCDS(chainID, cds, creator, policyMarhsalled, []byte(escc), []byte(vscc))
if err != nil {
return nil, fmt.Errorf("Error creating proposal %s: %s", chainFuncName, err)
}
logger.Debugf("Get upgrade proposal for chaincode <%v>", spec.ChaincodeId)
var signedProp *pb.SignedProposal
//对提案进行签名
signedProp, err = utils.GetSignedProposal(prop, cf.Signer)
if err != nil {
return nil, fmt.Errorf("Error creating signed proposal %s: %s", chainFuncName, err)
}
//将提案发送至背书端,返回模拟签名后的响应数据
proposalResponse, err := cf.EndorserClient.ProcessProposal(context.Background(), signedProp)
if err != nil {
return nil, fmt.Errorf("Error endorsing %s: %s", chainFuncName, err)
}
logger.Debugf("endorse upgrade proposal, get response <%v>", proposalResponse.Response)
if proposalResponse != nil {
// assemble a signed transaction (it's an Envelope message)
//背书端模拟成功后,创建签名交易信息,最终返回签名信封env
env, err := utils.CreateSignedTx(prop, cf.Signer, proposalResponse)
if err != nil {
return nil, fmt.Errorf("Could not assemble transaction, err %s", err)
}
logger.Debug("Get Signed envelope")
return env, nil
}
return nil, nil
}
这里的方法之前都有详细注释,这里就不在写了