[英]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}
有人知道为什么我的链代码在重新部署时没有更新吗?
要执行更改,您必须:
peer chaincode upgrade
命令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')"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.