HyperLedger fabric 链码未更新

HyperLedger fabric chaincode not updated

我正在尝试遵循这个示例 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"

我尝试在对等链代码实例化后添加以下行:

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')

我猜你已经安装了 1.0 版,这就是为什么它抱怨说它已经存在了。通过使用 -v 2.0 而不是 -v 1.0.

来尝试使用 1.1 或 2.0

为了使链代码中的更改反映出来,采取了以下步骤: 1.停止所有容器

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

docker rm -f $(docker ps -aq)

  1. 当你 运行 docker images 时找到下图 其中一个输出将是其他超级账本二进制图像中的这个。

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。它应该工作

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

第 1 步。将源代码传输到对等节点(每个链代码都有一个链代码 ID,它大约是它们的名称、路径和版本的函数)。这将由您的密钥签名并传输到您选择作为目标的所有对等方。 (顺带一提,这一步叫做安装。)

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

在此过程中,第 1 步希望链代码是唯一的。如果你已经安装过一次,那么如果你想再次发送,那么请确保你已经将版本号从abc-1.0 更改为abc-2.0。这将节省您的安装步骤。

安装成功后,就是何时调用升级、何时不调用升级的问题了。如果你之前有 运行 这个容器,那么正确的步骤就是升级。

或者反过来就是做你做过的事。清理并重新开始 - 这适用于开发,但不适用于生产 - 随着数据的清理 "poof"。

在 hyperledger fabric 上开发链代码时。

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

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

2:您可以通过更改其名称来安装链代码,例如 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 的链代码。