我在更新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}
有人知道我重新部署链码时为什么没有更新吗?
答案 0 :(得分:0)
要执行更改,您必须:
peer chaincode upgrade
升级链码
命令。下面两个命令示例:
peer chaincode install -n mycc -v 1.1 -p your_path
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')"