【问题标题】:How to update the chaincode in Hyperledger Fabric?如何更新 Hyperledger Fabric 中的链码?
【发布时间】:2019-11-03 00:16:30
【问题描述】:

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

我的问题类似于this question,但即使按照这个问题的答案也无济于事。

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

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 作为状态数据库的 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}

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

【问题讨论】:

  • 安装后是否更改了代码?如果你这样做了,你需要使用新版本再次安装链代码并升级它。
  • 感谢您的评论@Yeou。我对我的链代码进行了更改,然后在安装和实例化之前停止容器、删除容器和删除图像。
  • 您不必停止和移除容器。你可以用新版本升级你的链码。

标签: docker hyperledger-fabric blockchain hyperledger


【解决方案1】:

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

  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

【讨论】:

  • 感谢您的回答!现在可以了!一个额外的问题。您可以重复使用旧版本号吗? v 1.0 如果您停止并移除容器?
  • 谢谢莱昂纳多!从这个乐于助人的社区获得帮助总是很棒!享受你的一天!
  • 这为我创建了一个带有新代码的新容器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多