fabric2.0链码操作

Posted zhangmingcheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fabric2.0链码操作相关的知识,希望对你有一定的参考价值。

1、打包链码
链码在安装前需要打包为tar文件。我们可以使用peer命令,node sdk,或者第三方工具。
第三方的打包工具需要满足以下要求:
   链码以tar.gz结尾;
   tar文件需要包含2个文件(不是目录),元文件Chaincode-Package-Metadata.json和chaincode文件。
   Chaincode-Package-Metadata.json文件长成下面这样。
   {"Path":"fabric-samples/chaincode/fabcar/go","Type":"golang","Label":"fabcarv1"}
peer命令打包示例:
    首先我们处理依赖问题:
    cd fabric-sample/chaincode/fabcar/go
    GO111MODULE=on go mod vendor

技术图片
然后进入cli客户端进行打包
  docker exec -it cli /bin/bash
  peer lifecycle chaincode package fabcar2.tar.gz --path github.com/hyperledger/fabric/chaincode/fabcar/go/ --label fabcar_2 >&log.txt
生成:fabcar2.tar.gz
解压fabcar2.tar.gz查看链码打包后内容:metadata.json、code.tar.gz
其中metadata.json:{"path":"github.com/hyperledger/fabric/chaincode/fabcar/go/","type":"golang","label":"fabcar_2"}
其中code.tar.gz:打包后的合约代码
2、安装链码
现在我们在peer0.org1和peer0.org2上安装fabcar链码包,因为在这个演示中我们只需要使用这两个节点进行链码调用和查询。
  # peer0.org1
   docker exec cli peer lifecycle chaincode install fabcar2.tar.gz

技术图片

  # peer0.org2
  docker exec
     -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
     -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051
     -e CORE_PEER_LOCALMSPID="Org2MSP"
     -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
    cli peer lifecycle chaincode install fabcar2.tar.gz

技术图片
我们会收到链码包的标识符,在下面的链码审批阶段会用到。我们收到的链码标识符为:fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d。
我们可以使用peer lifecycle chaincode queryinstalled命令随时检查节点上的链码安装情况,如果我们需要找出链码包的标识ID,这个命令会很有用。
   # peer0.org1
   docker exec cli peer lifecycle chaincode queryinstalled

技术图片

  # peer0.org2
  docker exec
      -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
      -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      -e CORE_PEER_LOCALMSPID="Org2MSP"
      -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
      cli peer lifecycle chaincode queryinstalled

技术图片
3、审批链码
根据默认策略,需要超过半数的机构审批链码后才能向通道提交链码,具体可参考configtx.yaml中的Application/Policies/LifecycleEndorsement部分。目前的设置中包含两个机构,因此需要两个机构同时批准链码。
首先是Org1批准链码:
  docker exec cli peer lifecycle chaincode approveformyorg
    --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 
    --channelID mychannel --name fabcar2 --version 1
     --init-required --sequence 1 --waitForEvent --package-id fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d

技术图片

如果我们现在看下peer节点的日志,可以看到出了新块#3

技术图片
类似的,我们让Org2批准链码:
  docker exec
    -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051
    -e CORE_PEER_LOCALMSPID="Org2MSP"
    -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
    cli peer lifecycle chaincode approveformyorg
    --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 
    --channelID mychannel --name fabcar2 --version 1 --init-required
     --sequence 1 --waitForEvent --package-id  fabcar_2:3b9c21db5f42197d8b00a68661924da344a4f7d94f67050168269391ec8c732d

技术图片
不出意外,可以看到出了新块block#4:

技术图片
可以随时使用如下命令查看链码的提交状态:
  docker exec cli peer lifecycle chaincode checkcommitreadiness
  --channelID mychannel --name fabcar2 --version 1 --sequence 1 --output json

技术图片

两个机构都已经批准了链码,现在可以提交了。(这里暂时没想明白为什么为false)

4、向通道提交链码
链码提交可以在一个peer节点上完成:
docker exec cli peer lifecycle chaincode commit -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 
--peerAddresses peer0.org1.example.com:7051
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
--peerAddresses peer0.org2.example.com:7051
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
--channelID mychannel --name fabcar2 --version 1 --sequence 1 --init-required
可以看到出了新块#5:

技术图片

注意我们在commit命令中已经包含了init所需的参数。
同样,我们可以使用querycommited命令来查看链码的提交状态:
docker exec cli peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar2

技术图片
在链码提交到通道之后,链码的生命周期就完成了,链码已经可以访问。现在我们回到链码的调用和查询,这和之前的版本是一致的。

5、调用链码的Init方法
fabcar链码的Init方法需要首先调用。

docker exec cli 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 
--peerAddresses peer0.org1.example.com:7051
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
--peerAddresses peer0.org2.example.com:7051
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
-C mychannel -n fabcar2
--isInit
-c ‘{"function":"initLedger","Args":[]}‘

技术图片

现在可以查询链码:
docker exec cli peer chaincode query -C mychannel -n fabcar -c ‘{"Args":["queryAllCars"]}‘

技术图片

6、调用链码方法并从另一个peer节点查询

以上是关于fabric2.0链码操作的主要内容,如果未能解决你的问题,请参考以下文章

008-运维管理链码

4fabric node sdk1.4.8链码操作相关

Fabric1.4:链码管理与测试

Fabric1.4 编写链码

5fabric node sdk1.4.8链码操作相关

快速了解链码是什么?