測試網絡用於測試本地Fabric環境是否正常,過程如下:
① cd fabric-samples/test-network #進入test-network目錄下,關鍵腳本network.sh包含了啟動網絡,創建通道,銷毀網絡等功能,./network.sh -h可查看詳細信息
② ./network.sh up #以默認選項啟動網絡,創建一個由兩個peer節點(屬於兩個組織)和一個order節點組成的網絡,可通過 docker ps -a 查看啟動的容器
./network.sh up -ca #使用Fabric CAs啟動網絡,證書將由CA生成,而不是cryptogen,該命令將生成三個CA(每個組織一個),ca_org1,ca_org2,ca_orderer。然后腳本使用Fabric CA客戶端注冊屬於每個組織的用戶,並為每個身份生成證書和密鑰,可查看registerEnroll.sh腳本的內容(在organizations/fabric-ca目錄下)
③ ./network.sh createChannel #創建Org1和Org2之間的通道,默認名稱mychannel,也可指定通道名稱
注:./network.sh createChannel -c channel1 #-c指定通道名稱,可通過不同名稱創建多個不同的通道
./network.sh up createChannel #以上兩條指令也可合並為一條執行,啟動網絡並創建通道
④ ./network.sh deployCC #在peer0.org1.example.com和peer0.org2.example.com上安裝鏈碼並在通道上部署fabcar chaincode,並執行初始化,查詢等操作
⑤ ./network.sh down #銷毀網絡(從而可再次運行./network.sh up),該命令將停止並刪除節點與chaincode的容器,刪除各個組織的證書文件(organizations子目錄下),刪除chaincode鏡像,刪除通道文件(channel-artifacts目錄下),刪除系統創世區塊(system-genesis-block目錄下)
過程簡析:
./network.sh up做了什么:
①腳本首先會為peer組織和order組織創建證書和密鑰,默認使用cryptogen tool,配置文件在organizations/cryptogen目錄下,若使用./network.sh up -ca啟動,registerEnroll.sh腳本將使用Fabric CA server基於organizations/fabric-ca目錄下的配置文件生成證書及密鑰
②腳本使用configtxgen tool基於configtx/configtx.yaml配置文件創建系統通道創世區塊,並將其存儲在system-genesis-block目錄下
③腳本使用docker目錄下的docker-compose-test-net.yaml啟動peer與order節點
./network.sh createChannel做了什么:
該腳本將調用scripts目錄下的createChannel.sh,createChannel.sh基於configtx/configtx.yaml使用指定的通道名稱創建通道,向通道中加入peer0.org1.example.com和peer0.org2.example.com,並將它們更新為錨節點
./network.sh deployCC做了什么:
該腳本將調用scripts目錄下的deployCC.sh,deployCC.sh在peer0.org1.example.com和peer0.org2.example.com上安裝fabric的鏈碼,並在通道中定義chaincode,最后調用chaincode顯示結果
使用命令行與區塊鏈網絡進行交互,此處模擬peer0.org1.example.com節點:
首先,確保當前在test-network目錄中
① export FABRIC_CFG_PATH=$PWD/../config/ #指定core.yaml文件
② 設置以下環境變量,從而作為peer0.org1.example.com節點與區塊鏈網絡進行交互
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 chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}' #調用chaincode查詢,-C指定通道名稱,-n指定合約名稱,-c指定參數序列(第一個參數為合約函數名)
④ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --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 ${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 -c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}' #調用chaincode更改CAR9的歸屬者