如何更新Hyperledger Fabric中的链码?

时间:2019-06-20 07:58:38

标签: docker hyperledger-fabric blockchain hyperledger

我在更新Hyperledger链码时遇到了一些麻烦,即使我注释掉一个函数,仍然可以运行此函数。我正在使用this tutorial中的“构建您的第一个网络”示例网络以及该教程中也提到的大理石链代码。使用原始链码没有任何麻烦,但是当我开始进行更改时,当我重新部署网络时,并不总是显示更改。

我的问题类似于this question,但即使遵循此问题的答案也无济于事。

启动网络时,我使用以下命令:

cd .../fabric-samples/first-network

将目录更改为fabric-samples文件夹中的第一个网络。

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -a -q)

完成此操作是为了先停止所有容器,删除所有容器并删除所有图像。这不会删除Hyperledger Fabric映像,而只会删除所有链码。这样可以确保没有旧的链码仍处于活动状态。即使我使用docker images进行检查,也只是Hyperledger图片。

./byfn.sh down
./byfn.sh up -c mychannel -s couchdb
docker exec -it cli bash

在这里,我关闭了现有的“构建您的第一个网络”(byfn)。在我再次使用通道mychannel以及将ouchdb作为状态数据库作为状态数据库来部署网络之后。最后进入docker CLI容器。

peer chaincode install -n marblestest -v 3.1 -p github.com/chaincode/marblestest/go
export CHANNEL_NAME=mychannel
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marblestest -v 3.1 -c '{"Args":["init"]}' -P "OR ('Org0MSP.peer','Org1MSP.peer')"

如您所见,我尝试使用其他版本,但无法在3.1版上运行。链代码已安装,通道名称设置为mychannel,链代码实例化没有任何麻烦。

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marblestest -c '{"Args":["initMarble","marble1","blue","35","tom"]}'

通过initMarble创建了大理石。

peer chaincode query -C $CHANNEL_NAME -n marblestest -c '{"Args":["queryMarbles", "{\"selector\":{\"docType\":\"marble\",\"owner\":\"tom\"}, \"use_index\":[\"_design/indexOwnerDoc\", \"indexOwner\"]}"]}'

这里使用修改后的查询功能,该功能与原始功能一样,并打印创建的大理石记录。

exit

最后退出程序,然后可以再次运行。

我对查询功能所做的修改是我注释掉了两条打印行,并添加了一个计数器以计算来自for循环的记录数:

func getQueryResultForQueryString(stub shim.ChaincodeStubInterface, queryString string) ([]byte, error) {

    //fmt.Printf("- getQueryResultForQueryString queryString:\n%s\n", queryString)

    resultsIterator, err := stub.GetQueryResult(queryString)
    if err != nil {
        return nil, err
    }
    defer resultsIterator.Close()

    buffer, counter, err := constructQueryResponseFromIterator(resultsIterator)
    if err != nil {
        return nil, err
    }

    //fmt.Printf("- getQueryResultForQueryString queryResult:\n%s\n", buffer.String())
    fmt.Printf("counter =", counter)
    return buffer.Bytes(), nil
}

我原本希望使用counter = 1打印,但是我得到了原始打印{"color":"blue","docType":"marble","name":"marble1","owner":"tom","size":35}

有人知道我重新部署链码时为什么没有更新吗?

1 个答案:

答案 0 :(得分:0)

要执行更改,您必须:

  1. 在所需的背书人上安装新的链码版本。
  2. 通过调用peer chaincode upgrade升级链码 命令。

下面两个命令示例:

  1. peer chaincode install -n mycc -v 1.1 -p your_path
  2. peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n mycc -v 1.1 -c '{"Args":["init","a","100","b","200","c","300"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

Official HL Fabric documentation