Fabric智能合約編寫,部署,調用


Fabric智能合約編寫,部署,調用

開啟網絡

  1. cd /root/go/src/github.com/hyperledger/fabric-samples/test-network
  2. ./network.sh down
  3. ./network.sh up createChannel

打包智能合約

  1. 進入fabric-samples文件夾下的chaincode/fabcar/go目錄下
  2. 執行GO111MODULE=on go mod vendor下載依賴(文件夾下已經有go.mod,不需要使用go mod init生成該module文件)
  3. 進入到/root/go/src/github.com/hyperledger/fabric-samples/test-network文件下
  4. 使用以下命令將二進制文件添加到cli路徑:export PATH=${PWD}/../bin:$PATH
  5. 還需要設置FABRIC_CFG_PATH路徑指向fabric-samples中的core.yaml文件,命令如下:export FABRIC_CFG_PATH=$PWD/../config/
  6. 檢查peer命令是否可以使用:peer version
  7. 打包智能合約:peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1.0 (../chaincode/fabcar/go/路徑保證准確,fabcar_1.0自定義命名)

安裝,批准,打包好的鏈碼

切換到組織1

  1. 設置允許org1操作peer cli的環境變量:
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
  1. 安裝智能合約(時間會比較久,耐心稍等)
    peer lifecycle chaincode install fabcar.tar.gz
    輸出結果:
2021-10-12 15:48:55.040 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nKfabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9\022\nfabcar_1.0" > 
2021-10-12 15:48:55.162 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9
  1. 批准同意合約定義
  • 查詢已經安裝的鏈碼
    peer lifecycle chaincode queryinstalled
    輸出:
installed
Installed chaincodes on peer:
Package ID: fabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9, Label: fabcar_1.0
  • 當前組織批准同意鏈碼定義:
export CC_PACKAGE_ID=fabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

輸出:

2021-10-12 15:57:41.577 CST [chaincodeCmd] ClientWait -> INFO 001 txid [dadbfad51d025a0710de313e34cb27d6c0651ebfc4d65fb4e36f8cc93b5f0a09] committed with status (VALID) at localhost:7051
  • 此時檢查合約定義是否滿足策略
    peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
    輸出:
{
        "approvals": {
                "Org1MSP": true,
                "Org2MSP": false
        }
}

Org2MSP這里顯示未同意合約定義
那么需要進入Org2中的環境配置中重復合約安裝並同意合約定義

切換到組織2

  1. 設置允許org1操作peer cli的環境變量:
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
  1. 安裝智能合約(時間會比較久,耐心稍等)
    peer lifecycle chaincode install fabcar.tar.gz
    輸出結果:
2021-10-12 16:03:40.266 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nKfabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9\022\nfabcar_1.0" > 
2021-10-12 16:03:40.266 CST [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: fabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9
  1. 批准同意合約定義
  • 查詢已經安裝的鏈碼
    peer lifecycle chaincode queryinstalled
    輸出:
installed
Installed chaincodes on peer:
Package ID: fabcar_1.0:dfb655dc2702090da647bcbafc8e0a06f6f9d15e62ec97bb8653d60671e84bc9, Label: fabcar_1.0
  • 當前組織批准同意鏈碼定義:
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

輸出:

2021-10-12 16:06:34.017 CST [chaincodeCmd] ClientWait -> INFO 001 txid [6e3a141a65e406bf3ea6b7bbdab8b0fceb7113c51b84a2b551eb59fa6395828e] committed with status (VALID) at localhost:9051
  • 此時檢查合約定義是否滿足策略
    peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
    輸出:
{
        "approvals": {
                "Org1MSP": true,
                "Org2MSP": true
        }
}

過半數組織同意了智能合約定義
那么可以提交智能合約

提交智能合約到通道

  1. 提交
    peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name fabcar --version 1.0 --sequence 1 --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    輸出:
2021-10-12 16:09:51.514 CST [chaincodeCmd] ClientWait -> INFO 001 txid [48d65fdb7e4afc6cbe9be27e3625f22aaec47883b96ef2c1f32ab8cd18ad4e4c] committed with status (VALID) at localhost:9051
2021-10-12 16:09:51.582 CST [chaincodeCmd] ClientWait -> INFO 002 txid [48d65fdb7e4afc6cbe9be27e3625f22aaec47883b96ef2c1f32ab8cd18ad4e4c] committed with status (VALID) at localhost:7051
  1. 檢查合約是否成功提交到通道
    peer lifecycle chaincode querycommitted --channelID mychannel --name fabcar --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    輸出:
Committed chaincode definition for chaincode 'fabcar' on channel 'mychannel':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]

初始化智能合約

  1. 設置ca環境變量
export org1_CertFiles=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export org2_CertFiles=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
  1. 初始化
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles $org1_CertFiles --peerAddresses localhost:9051 --tlsRootCertFiles $org2_CertFiles -c '{"function":"InitLedger","Args":[]}'
    輸出:
    2021-10-12 16:20:51.917 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

調用智能合約

  1. 查詢所有汽車
    peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryAllCars"]}'
    輸出:
[{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
  1. 查詢單部汽車
    peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR0"]}'
    輸出:
    {"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}

  2. 新增一輛汽車
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles $org1_CertFiles --peerAddresses localhost:9051 --tlsRootCertFiles $org2_CertFiles -c '{"function":"CreateCar","Args":["CAR10","GEELY","Borui","Blue","Yujialing"]}'
    輸出:
    2021-10-12 16:32:55.044 CST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

  3. 查詢剛剛新增的車輛
    peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR10"]}'
    輸出:
    {"make":"GEELY","model":"Borui","colour":"Blue","owner":"Yujialing"}

  4. 更改剛剛新增車輛CAR10的車主為"廣東靚仔"
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles $org1_CertFiles --peerAddresses localhost:9051 --tlsRootCertFiles $org2_CertFiles -c '{"function":"ChangeCarOwner","Args":["CAR10","廣東靚仔"]}'

  5. 再次查看CAR10信息看是否修改車主成功
    peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR10"]}'
    輸出:
    {"make":"GEELY","model":"Borui","colour":"Blue","owner":"廣東靚仔"}


免責聲明!

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



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