Fabric智能合約編寫,部署,調用
開啟網絡
cd /root/go/src/github.com/hyperledger/fabric-samples/test-network
./network.sh down
./network.sh up createChannel
打包智能合約
- 進入fabric-samples文件夾下的chaincode/fabcar/go目錄下
- 執行
GO111MODULE=on go mod vendor
下載依賴(文件夾下已經有go.mod,不需要使用go mod init生成該module文件) - 進入到
/root/go/src/github.com/hyperledger/fabric-samples/test-network
文件下 - 使用以下命令將二進制文件添加到cli路徑:
export PATH=${PWD}/../bin:$PATH
- 還需要設置FABRIC_CFG_PATH路徑指向fabric-samples中的core.yaml文件,命令如下:
export FABRIC_CFG_PATH=$PWD/../config/
- 檢查peer命令是否可以使用:
peer version
- 打包智能合約:
peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1.0
(../chaincode/fabcar/go/路徑保證准確,fabcar_1.0自定義命名)
安裝,批准,打包好的鏈碼
切換到組織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
- 安裝智能合約(時間會比較久,耐心稍等)
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
- 批准同意合約定義
- 查詢已經安裝的鏈碼
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
- 設置允許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
- 安裝智能合約(時間會比較久,耐心稍等)
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
- 批准同意合約定義
- 查詢已經安裝的鏈碼
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
}
}
過半數組織同意了智能合約定義
那么可以提交智能合約
提交智能合約到通道
- 提交
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
- 檢查合約是否成功提交到通道
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]
初始化智能合約
- 設置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
- 初始化
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
調用智能合約
- 查詢所有汽車
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"}}]
-
查詢單部汽車
peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR0"]}'
輸出:
{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}
-
新增一輛汽車
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
-
查詢剛剛新增的車輛
peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR10"]}'
輸出:
{"make":"GEELY","model":"Borui","colour":"Blue","owner":"Yujialing"}
-
更改剛剛新增車輛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","廣東靚仔"]}'
-
再次查看CAR10信息看是否修改車主成功
peer chaincode query -C mychannel -n fabcar -c '{"Args":["QueryCar","CAR10"]}'
輸出:
{"make":"GEELY","model":"Borui","colour":"Blue","owner":"廣東靚仔"}