前言
最近要基於BSN(區塊鏈服務網絡)進行區塊鏈開發,如果你還不知道什麼是BSN的話,這是BSN官方的介紹:
區塊鏈服務網絡(Blockchain-based Service Network)(以下稱爲“服務網絡”或“BSN”)是一個跨雲服務、跨門戶、跨底層框架,用於部署和運行區塊鏈應用的全球性公共基礎設施網絡,由國家信息中心、中國移動通信集團公司、中國銀聯股份有限公司、北京紅棗科技有限公司共同發起。互聯網是通過TCP/IP協議將屬於各方的雲資源和數據中心連接而形成的,BSN則是通過一套區塊鏈環境協議將屬於各方的雲資源和數據中心連接而組成。兩者均不屬於任何單一組織,都是公共基礎設施。
由於BSN目前還沒有提供開發環境,因此只能自己搭建開發和測試環境。
我們直接使用Fabricr提供的測試環境作爲開發和測試的環境,至於怎麼下載和運行Fabric測試網絡,可以看我另一個教程:win10下Hyperledger Fabric入門教程
啓動測試網絡
打開git base工具,執行下面的命令啓動了一個帶mychannel名的通道的測試網絡,並設置好的環境變量。
# 啓動測試網絡
cd $GOPATH/src/github.com/hyperledger/fabric-samples/test-network
./network.sh down
./network.sh up
./network.sh createChannel
#設置經常要使用的環境變量
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
export CORE_PEER_TLS_ENABLED=true
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
# 使用默認的通道名稱
export CHANNEL_NAME=mychannel
# 切換到組織1的peer節點上
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
部署BSN的鏈碼
下載鏈碼
直接下載代碼包:http://www.bsnbase.com/static/base/BaseChainCode.zip
解壓後
把bsnBaseCC-node.js目錄複製到$GOPATH\src\chaincode
下,方便我們後續操作
我們這次要使用的是javascript版本的鏈碼
打包鏈碼
在git base裏執行
peer lifecycle chaincode package clockin.tar.gz --path $GOPATH/src/chaincode/bsnBaseCC-node.js/ --lang node --label clockin
注意,javascript版本的鏈碼的--lang
的參數是node
而不是javascript
clockin
是我自己起的鏈碼的名字,你們也可以自己隨意定義,但下面的需要這個名字的地方都要換成你定義。
該方法只做兩件事,一是把代碼打包成code.tar.gz
壓縮包(包名字是固定的),二是在code.tar.gz同目錄下創建一個metadata.json
文件(文件名也是固定的),把命令裏的三個參數保存起來,如
{"path":"E:\\go/src/chaincode/bsnBaseCC-node.js/","type":"node","label":"clockin"}
最後把code.tar.gz和metadata.json再次打包成clockin.tar.gz,放到目錄執行命令的目錄下($GOPATH/src/github.com/hyperledger/fabric-samples/test-network)
知道它的原理,我們其實也可以自己手工打包。
在peer節點上安裝鏈碼
先在組織1的peer安裝,執行安裝操作
peer lifecycle chaincode install clockin.tar.gz
執行成功將得到一個包ID,我們把它保存到環境變量
注:把下面的ID換成你自己的再執行命令
export CC_PACKAGE_ID=clockin:0d61c476742be4182cc817ea2b96380aab73f6725d2f4b129074c428a2aff24a
再切換到組織2的peer上執行相同的安裝操作
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051
peer lifecycle chaincode install clockin.tar.gz
由於得到的包ID與上面的一樣的,因此都使用CC_PACKAGE_ID
這個環境變量就行
可以使用下面的命令的查詢已經安裝到當前peer節點的鏈碼
peer lifecycle chaincode queryinstalled
設置背書策略
先在當前組織2的peer節點上執行
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA --channelID mychannel --name clockin --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1
查詢背書策略是否設置成功
peer lifecycle chaincode checkcommitreadiness -C mychannel -n clockin -v 1 --sequence 1 --output json --init-required
在官方手冊等很多教程在執行checkcommitreadiness
都沒有提到或加上--init-required
這個參數,導致查詢出來的結果都是失敗的,這個問題困擾了我兩天,各種百度都沒有答案,最後還是分析Fabric帶的test-network的測試網絡,跟蹤deployCC的執行過程才發現加上它就一切正常了。我想可能是approveformyorg
用了--init-required
這個參數,那下面查詢也一定要帶上它吧,
再切換到組織1的peer節點上重複執行
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/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA --channelID mychannel --name clockin --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1
peer lifecycle chaincode checkcommitreadiness -C mychannel -n clockin -v 1 --sequence 1 --output json --init-required
把鏈碼提交到通道上
通過上一步查詢到兩個組織都同意(值爲true)後,就可以提交鏈碼到通道上了
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -v 1 --sequence 1 --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA --init-required
由於需要兩個組織的peer節點的背書,因此除了order節點的連接信息了,也加上了兩個節點的連接參數。
查詢安裝狀態
最後我們查詢下鏈碼是否安裝成功
peer lifecycle chaincode querycommitted -C $CHANNEL_NAME -n clockin
本文由小韋雲原創,轉載請註明出處:https://www.bctos.cn/doc/10,否則追究其法律責任