关于(六)Fabric2.0 智能合约实践-升级智能合约的修正

1. 查看需要升级的智能合约信息

要注意此时的环境变量,如果根据前述步骤未曾修改的话,目前的环境变量设置应为peer0.org2.example.com。且其中通道名和合约名要时刻注意保持一致性。

查看mycc2在channel2通道的合约定义,cli控制台输入命令

peer lifecycle chaincode querycommitted -C channel2

执行一次query操作方便后面对比

 peer chaincode query -C channel2 -n mycc2 -c '{"Args":["query","a"]}'

查询过后,此时a的实际值如下图所示,因为在上述过程中,我们实施了invoke方法,a向b转账了10,所以此时a的实际状态值应为90
在这里插入图片描述

2. 修改合约代码

编辑abstore.go合约代码,添加一个方法默认加10。

  1. 备份first-network链码源文件
sudo nautilus #打开超级用户文件管理器

备份fabric-samples/chaincode/abstore/go文件,另命名为go_origin

  1. 修改abstore.go文件,添加add函数并保存,源码如下
func (t *ABstore) Add(ctx contractapi.TransactionContextInterface, A string, X int) error {
        var err error
        //Get the state from the leger
        Avalbytes, err := ctx.GetStub().GetState(A)
        if err != nil {
                return fmt.Errorf("Failed to get state for " + A)
        }

        if Avalbytes == nil {
                return fmt.Errorf("Nil amount for " + A)
        }

        var Aval int
        Aval, _ = strconv.Atoi(string(Avalbytes))
        Aval = Aval + X

        // Write the state back to the ledger
        err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval)))
        if err != nil {
                return err
        }

        return nil
}
  1. 从超级用户图形界面(abstore/go目录)进入到终端,执行如下指令
source ~/.profile
GO111MODULE=on go mod vendor
go build
  1. 重新打包链码
peer lifecycle chaincode package mycc_new.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1
  1. 重新安装链码

查询环境变量可知目前为org2,执行下面指令在peer0.org2上安装链码

peer lifecycle chaincode install mycc_new.tar.gz

查询已经安装的链码

peer lifecycle chaincode queryinstalled

切换环境变量为peer0.org1,重新执行上述指令

  1. 同意合约定义

与原来相比将package_id修改为新安装的合约package_id,sequence要改成2,因为install了2次

peer lifecycle chaincode approveformyorg --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID channel2 --name mycc1 --version 1  --package-id  mycc_1:a63c072d5009c84a0a08ec6ea1b61f78ce5d27b0ce7198eb66037f1eae3ba70c --sequence 2 –waitForEvent #这里没加--init-required,暂时不知道这条指令的作用

检查合约定义

peer lifecycle chaincode checkcommitreadiness --channelID channel2 --name mycc1 --version 1 --sequence 2 --output json  #这里没加--init-required,暂时不知道这条指令的作用

切换环境变量为peer0.org2,重新执行上述指令

  1. 重新提交合约定义
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID channel2 --name mycc1 --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 2    #这里没加--init-required,暂时不知道这条指令的作用
  1. 检验新合约代码

查询操作

peer chaincode query -C channel2 -n mycc1 -c '{"Args":["query","a"]}'

加10操作

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID channel2 --name mycc1 --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["add","a","10"]}'

再次查询

peer chaincode query -C channel2 -n mycc1 -c '{"Args":["query","a"]}'

PS:上面链码统一为mycc_1,且init功能只需执行一次,切勿多次执行,可能会导致数据丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值