HyperLedger结构链代码未更新

时间:2018-04-16 11:03:08

标签: go hyperledger-fabric hyperledger

我正在尝试使用此示例Hyperledger Fabric代码:https://github.com/hyperledger/education/tree/master/LFS171x/fabric-material

最初我用go文件chaincode / tuna-app / test.go替换了chaincode / tuna-app / tuna-chaincode.go。 test.go只是通过initLedger函数调用在分类帐中初始化的内容发生了变化。它工作正常,tuna-app / .startFabric.sh无需更改。

现在,当我再次尝试通过其initLedger函数调用更改分类帐时,它不会发生。即使我评论函数本身,它仍然显示分类帐的旧内容。

如何使用可见的更改更新我的链码?

startFabric.sh包含以下代码:

set -e

# don't rewrite paths for Windows Git Bash users
export MSYS_NO_PATHCONV=1

starttime=$(date +%s)

if [ ! -d ~/.hfc-key-store/ ]; then
    mkdir ~/.hfc-key-store/
fi

# launch network; create channel and join peer to channel
cd ../basic-network
./start.sh

# Now launch the CLI container in order to install, instantiate chaincode
# and prime the ledger with our 10 tuna catches
docker-compose -f ./docker-compose.yml up -d cli

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode install -n tuna-app -v 1.0 -p github.com/test-app
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n tuna-app -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
sleep 10
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n tuna-app -c '{"function":"initLedger","Args":[""]}'

printf "\nTotal execution time : $(($(date +%s) - starttime)) secs ...\n\n"
printf "\nStart with the registerAdmin.js, then registerUser.js, then server.js\n\n"

我尝试在peer chaincode instantiate之后添加以下行:

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n tuna-app -c '{"function":"initLedger","Args":[""]}'

但它会出现以下错误:

Error: Chaincode version is not provided for upgrade

当我将升级语句更改为:

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n tuna-app -v 1.0 -c '{"function":"initLedger","Args":[""]}'

错误更改为:

Error: Error endorsing chaincode: rpc error: code = Unknown desc = chaincode error (status: 500, message: version already exists for chaincode with name 'tuna-app')

4 个答案:

答案 0 :(得分:3)

为了使链码的变化得到反映,采取了以下步骤: 1.停止所有容器

docker stop $(docker ps -aq)
  1. 删除所有容器
  2. docker rm -f $(docker ps -aq)

    1. 运行docker images时找到以下图片 其中一个输出将是其他超级二进制图像。
    2. REPOSITORY TAG, IMAGE ID, CREATED, SIZE: dev-peer0.org1.example.com-tuna-app-1.0-b58eb592ed6ced10f52cc063bda0c303a4272089a3f9a99000d921f94b9bae9b, latest, 0919d7c15f0a, 3 minutes ago, 172MB

      使用以下命令删除它:

      docker rmi 0919d7c15f0a
      

      使用./startFabric.sh,npm install,node registerAdmin.js,node registerUser.js和node server.js再次运行结构。它应该工作

答案 1 :(得分:0)

我猜你会安装1.0版本,这就是为什么它抱怨它已经存在。使用-v 2.0代替-v 1.0,尝试使用1.1或2.0。

答案 2 :(得分:0)

一旦错过序列,这将非常棘手。 据我所知,在HLF中部署链码是一个两步过程。

步骤1.将源代码转移到同位体(每个链码都会获得一个链码ID,该ID大致取决于其名称,路径和版本)。这将由您的密钥签名并转移到您已选择作为目标的所有对等方。 (顺便说一下,这称为安装。)

第2步。使用所有供应商的lib编译源代码(我在这里谈论的是GoLang链码版本,希望其他版本也一样。)构建了一个docker映像,并使用该二进制文件形成了一个容器。 (这是称为实例化的部分-如果之前已经完成,它也将成为升级。)

在此过程中,步骤1将希望链码是唯一的。如果已安装一次,则要再次发送,请确保已将版本号更改为abc-1.0到abc-2.0。这样可以节省您安装步骤。

一旦安装成功,则取决于何时需要升级,何时不要求升级。如果您以前运行过此容器,则正确的步骤是升级。

或者另一种方法是做您所做的事情。清理并重新开始-这对于开发是可行的,但不适用于生产-因为数据随清理而变得“糟糕”。

答案 3 :(得分:0)

在超级账本结构上开发链码时。

1:我们必须删除链码docker映像以测试每个更改。 例如:安装链码的名称是mycc

#remove container
docker rm -f $(docker ps -aq)
#remove images
docker rmi mycc-0-container id or name

2:您可以仅通过更改其名称来安装chaincode,例如mycc当前正在运行,则必须更改mycc1,现在您需要使用mycc1并执行事务。 例如:

#Already install chaincode has named mycc
#following command will install same chaincode(updated) with chaincodeName
#mycc1
docker exec cli peer chaincode install -n mycc1 -v 0 -p github.com/sacc

注意:,现在您需要实例化,调用和查询名称为mycc1的链码。