(Fabric 学习五)更新fabcar链码并升级合约

一、修改官方示例中的fabcar链码

添加删除car和查看car是否存在两个函数

// DeleteCar deletes an given asset from the world state.
func (s *SmartContract) DeleteCar(ctx contractapi.TransactionContextInterface, carNumber string) error {
    exists, err := s.CarExists(ctx, carNumber)
    if err != nil {
        return err
    }
    if !exists {
        return fmt.Errorf("the asset %s does not exist", carNumber)
    }
 
    return ctx.GetStub().DelState(carNumber)
}


// CarExists returns true when asset with given ID exists in world state
func (s *SmartContract) CarExists(ctx contractapi.TransactionContextInterface, carNumber string) (bool, error) {
    assetJSON, err := ctx.GetStub().GetState(carNumber)
    if err != nil {
        return false, fmt.Errorf("failed to read from world state: %v", err)
    }

    return assetJSON != nil, nil
}

保存后退出

二、更新链码

2.1 创建链码包

因为官方示例中的fabcar运行的是test-network网络,所以到test-network网络下进行操作。

首先配置环境变量

export PATH=${PWD}/../bin:$PATH

export FABRIC_CFG_PATH=$PWD/../config/

创建链码包

peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_2

注意这里创建创建链码包 label可以根据你上传的版本进行修改

2.2  在org1的节点上安装链码包

首先初始化成员org1

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051

在org1上安装链码包

peer lifecycle chaincode install fabcar.tar.gz

结果:

如果用的是java写的链码很有可能无法配置环境

这样就要我们查看一下docker的容器 ,并且log其中javaenv的容器ID

docker ps 
docker logs -f javaenv的那个容器id

2.3 在org2节点安装链码包

重复2.2 的操作

成员org2:

export PATH=${PWD}/../bin:$PATH
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051

在org2的节点安装

peer lifecycle chaincode install fabcar.tar.gz

结果:

当然也可以通过 查询包id查看是否在节点上安装成功

peer lifecycle chaincode queryinstalled

结果:

2.4 批准链码

这里需要修改它的版本和序列号
Org1和Org2的虚拟机中都要进行以下操作,其中链码的ID要根据上面查询的结果替换到下面的命令中。

export CC_PACKAGE_ID=fabcar_2:ed7196cb77fa3fc8c927a825bf03a83cde6addf785a03b030e7ae7c71c36f346

export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile "$ORDERER_CA" --channelID mychannel --name fabcar --version 2.0 --package-id $CC_PACKAGE_ID --sequence 2

结果:

2.5 查看链码是否就绪

这里对应上面批准链码的版本号和序列号

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 2.0  --sequence 2 --tls true --cafile "$ORDERER_CA" --output json

结果:

2.6 提交链码(org1或者org2 提交一次即可)

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 2.0 --sequence 2 --tls true --cafile "$ORDERER_CA" --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

升级链码合约操作完成! 

猜你喜欢

转载自blog.csdn.net/Wannabe_hacker/article/details/124298759
今日推荐