首页 > 解决方案 > 如何更新 Hyperledger Fabric 中的链码?

问题描述

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

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

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

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

将目录更改为 fabric-samples 文件夹中的 first-network。

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

在这里,我关闭了现有的 Build Your First Network (byfn)。在我使用通道 mychannel 和 couchdb 作为状态数据库再次部署网络之后。最后进入 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}

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

标签: dockerhyperledger-fabricblockchainhyperledger

解决方案


要执行您的更改,您必须:

  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')"

官方 HL Fabric 文档


推荐阅读