簡介
以Hyperldger2.0為例,鏈碼的安裝主要分為以下幾部分:
- package :打包源代碼
- install: 安裝鏈碼
- approveformyorg: 節點所在組織審批鏈碼
- commit: 提交鏈碼
在完成之后可以執行鏈碼的查詢和呼叫
package
- 首先需要對合約進行編譯,首先把我們寫的go語言合約放到chaincode下新建的test檔案夾下,
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# pwd
/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test#
- 執行命令
go mod init生成go.mod
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# go mod init
go: creating new go.mod: module github.com/hyperledger/fabric-samples/chaincode/test
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go go.mod
- 執行命令
go run CaAndFakeName.go生成go.sum
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# go run CaAndFakeName.go
Error starting UserCA chaincode: 'CORE_CHAINCODE_ID_NAME' must be setroot@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go go.mod go.sum
上述的CORE_CHAINCODE_ID_NAME不設定不影響鏈碼部署和執行,
- 執行命令
GO111MODULE=on go mod vendor生成vendor包
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# GO111MODULE=on go mod vendor
root@lamaxiya:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/test# ls
CaAndFakeName.go go.mod go.sum vendor
- 將我們編譯好的智能合約打包到容器內,執行命令如下:
docker exec cli peer lifecycle chaincode package $1.tar.gz \
--path github.com/hyperledger/fabric-samples/chaincode/$3 \
--label $1_$2
上述引數定義為(下面的引數與此相同):
- $1表示我們自定義的合約打包的名字如(mycc.tar.gz 則引數1為mycc),
- $2代表我們鏈碼的版本開始時一般為1,后續如果需要升級合約可依次為2、3、4……,
- $3代表我們鏈碼放的位置(對應上文編譯時為test檔案夾,則引數2為test),
install
在完成打包后執行安裝命令(安裝到示例網路的兩個組織的節點上)如下:
- 節點1,msp組態檔、address、tls組態檔默認為peer0.org1不用添加
docker exec cli peer lifecycle chaincode install $1.tar.gz
- 節點2,因為時在cli容器執行需要添加指定的檔案路徑
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:9051 \
-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 $1.tar.gz
上述安裝成功的話會輸出鏈碼的package_id如下:
3cd7767df34500f3d72faf7efd9774fbd72da4be0696b37\022\007mycc_1" >
2022-01-04 14:13:44.443 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: mycc_1:cb23fa9b0bace2c353cd7767df34500f3d72faf7efd9774fbd72da4be0696b37
此package identifier: mycc_1:cb23fa9b0bace2c353cd7767df34500f3d72faf7efd9774fbd72da4be0696b37我們下文需要使用.
approveformyorg
在完成安裝命令之后需要組織進行同意命令如下:
- peer0.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 $1 --version $2 \
--init-required --sequence $2 --waitForEvent --package-id $4
- 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:9051 \
-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 $4 --name $3 --version $2 --init-required \
--sequence $2 --waitForEvent --package-id $1
上述引數$4就是上文中生成的package identifier,
commit
在完成組織審批之后,需要執行鏈碼向orderer節點進行提交執行如下命令:
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:9051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
--channelID $4 --name $3 --version $2 --sequence $2 --init-required
上述命令成功執行完輸出如下表明鏈碼安裝成功,
2022-01-04 14:20:56.239 UTC [cli.lifecycle.chaincode] setOrdererClient -> INFO 001 Retrieved channel (mychannel) orderer endpoint: orderer.example.com:7050
2022-01-04 14:20:58.526 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [4e000545094b9b09c359a6f54d00e7a8efddf78e125e75ad25a3b14eb5d98885] committed with status (VALID) at
approced on org2 successful
2022-01-04 14:21:01.520 UTC [chaincodeCmd] ClientWait -> INFO 001 txid [5243ea90c3bc104e3998707e5859857f01fb360e38d3d325d8761c84ae455f6c] committed with status (VALID) at peer0.org1.example.com:7051
2022-01-04 14:21:01.522 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [5243ea90c3bc104e3998707e5859857f01fb360e38d3d325d8761c84ae455f6c] committed with status (VALID) at peer0.org2.example.com:9051
commit successful
2022-01-04 14:21:05.637 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200
以上就是fabric2.0中安裝一個鏈碼的正常步驟,
下面是我封裝的安裝鏈碼的兩個sh檔案,可以簡化終端輸入
- 檔案1是對步驟package和install的命令封裝,
function help(){
echo "para1-----package_name"
echo "para2-----chaincode_id"
echo "para3-----chaincode_dir"
}
if [ $1 == "help" -o $1 == "h" -o $1 == "-h" -o $1 == "-help" ]; then
help
exit 1
fi
if [ $# -ne 3 ]; then
echo "You need to enter three para3"
exit 1
fi
#打包
docker exec cli peer lifecycle chaincode package $1.tar.gz \
--path github.com/hyperledger/fabric-samples/chaincode/$3 \
--label $1_$2
if [ $? -ne 0 ]; then
echo "package error"
exit 1
fi
docker exec cli ls
docker exec cli peer lifecycle chaincode install $1.tar.gz
if [ $? -ne 0 ]; then
echo "install on org1 error"
exit 1
fi
echo "install on org1 successful"
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:9051 \
-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 $1.tar.gz
if [ $? -ne 0 ]; then
echo "install on org2 error"
exit 1
fi
linux執行命令為如下:sh 檔案名.sh $1 $2 $3需要注意將輸出的package identifier使用變數記錄下來,檔案2需要使用此引數
- 檔案2是對步驟approveformyorg和commit的命令封裝,
function help(){
echo "para1-----package_id"
echo "para2-----chaincode_id"
echo "para3-----chaincode_name"
echo "para4-----channel_name"
}
if [ $1 == "help" -o $1 == "h" -o $1 == "-h" -o $1 == "-help" ]; then
help
exit 1
fi
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 $4 --name $3 --version $2 \
--init-required --sequence $2 --waitForEvent --package-id $1
if [ $? -ne 0 ]; then
echo "approve failed for org1"
exit 1
fi
echo "approved on org1 successful "
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:9051 \
-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 $4 --name $3 --version $2 --init-required \
--sequence $2 --waitForEvent --package-id $1
if [ $? -ne 0 ]; then
echo "approve failed for org2"
exit 1
fi
echo "approced on org2 successful"
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:9051 \
--tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
--channelID $4 --name $3 --version $2 --sequence $2 --init-required
if [ $? -ne 0 ]; then
echo "commit failed"
exit 1
fi
echo "commit successful"
linux執行命令為如下sh 檔案名.sh 引數1 引數2 引數3 引數4 引數1為上文輸出的package identifier,
hyperldger中文檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404030.html
標籤:區塊鏈
上一篇:位元幣非法地址交易識別
下一篇:波場DAPP開發
