代码之家  ›  专栏  ›  技术社区  ›  mahima

HyperLedger结构链码未更新

  •  2
  • mahima  · 技术社区  · 6 年前

    我正在尝试遵循Hyperledger结构代码示例: https://github.com/hyperledger/education/tree/master/LFS171x/fabric-material

    最初,我替换了chaincode/tuna-app/tuna-chaincode。使用我的go文件链码/金枪鱼应用程序/测试。去测验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
    

    当我将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 回复  |  直到 6 年前
        1
  •  5
  •   mahima    6 年前

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

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

    docker rm -f $(docker ps -aq)

    1. 运行时查找以下图像 docker images 其中一个输出是其他hyperledger二进制图像。

    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安装、节点注册表管理。js,节点注册器。js和节点服务器。js。应该有用

        2
  •  2
  •   adnan.c    6 年前

    我猜你已经安装了1.0版,这就是为什么它抱怨它已经存在的原因。使用1.1或2.0进行尝试 -v 2.0 而不是 -v 1.0

        3
  •  1
  •   Ashishkel    5 年前

    一旦你错过了这个序列,这就相当棘手了。 据我所知,在HLF中部署链码需要两个步骤。

    第1步。将源代码传输到对等端(每个链码都会获得一个链码id,该id大致是其名称、路径和版本的函数)。这将由您的密钥签名,并传输到您选择作为目标的所有对等方。(顺便提一下,这一步叫做安装。)

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

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

    一旦安装成功,那么就要考虑何时需要升级,何时不需要升级。如果您之前运行过这个容器,那么正确的步骤是升级。

    或者另一种方法是做你做过的事。清理并重新开始—这对于开发来说是可行的,但对于生产来说则不然—因为您的数据会随着清理而“失效”。

        4
  •  0
  •   Block Crasher    5 年前

    在hyperledger结构上开发链码时。

    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的链码。