繁体   English   中英

如何更新Hyperledger Fabric中的链码?

[英]How to update the chaincode in Hyperledger Fabric?

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

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

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

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

在这里,我关闭了现有的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}

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

要执行更改,您必须:

  1. 在所需的代言人上安装新的链代码版本。
  2. 通过调用peer chaincode upgrade命令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文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM