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節點查詢

和之前一樣,我們在peer0.org1上調用鏈碼的changeCarOwner()方法,在peer0.org2上進行查詢:

# peer0.org1

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 -c '{"function":"changeCarOwner","Args":["CAR9","zmcheng"]}'

# 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 chaincode query -C mychannel -n fabcar2 -c '{"Args":["queryAllCars"]}'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM