HyperLedger Fabric 入門 ——構(gòu)建并拓展網(wǎng)絡(luò)
參考官方文檔:構(gòu)建第一個(gè)網(wǎng)絡(luò)
準(zhǔn)備事項(xiàng)
在下載完成 docker 鏡像和對(duì)應(yīng)的 fabric-samples 的代碼后锯梁, 接著根據(jù)文檔繼續(xù)深入學(xué)習(xí) Hyperledger 網(wǎng)絡(luò)的搭建以及對(duì)網(wǎng)絡(luò)進(jìn)行拓展的操作菱肖。
所需要準(zhǔn)備的條件參考官方文檔: 準(zhǔn)備事項(xiàng)
在此之前卢厂,把 fabric-samples 下的兩個(gè) bin 和 config 目錄都加入到環(huán)境變量中嗡呼,后面網(wǎng)絡(luò)都搭建,都需要使用到 bin 目錄下的命令工具反浓。
初始化網(wǎng)絡(luò)
下載 fabric-samples 項(xiàng)目后萌丈,進(jìn)入解壓的目錄,有許多文件夾勾习,所有的操作浓瞪,都會(huì)在這里進(jìn)行運(yùn)行懈玻。
首先巧婶,使用 cryptogen 命令,產(chǎn)生網(wǎng)絡(luò)配置將要使用的證書信息:
cryptogen generate --config=./crypto-config.yaml
執(zhí)行后涂乌,將打印以下結(jié)果:
命令執(zhí)行后艺栈,會(huì)在 crypto-config目錄中,生成 orderer 和 peer 機(jī)構(gòu)的 ca 湾盒,keys 以及 msp 的信息湿右, 生成的 orderer 和 peer 是在命令傳入的 yaml 文件中定義的。
初始化鏈
接著罚勾,設(shè)置 FABRIC_CFG_PATH 環(huán)境變量毅人,值為當(dāng)前的目錄,目的是為了讓 configtxgen 命令找到當(dāng)前目錄下的 configtx.yaml 文件尖殃。
export FABRIC_CFG_PATH=$PWD
然后執(zhí)行 configtxgen 命令丈莺,產(chǎn)生創(chuàng)世塊。
configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
可以看到 channel 中的 orderer 節(jié)點(diǎn)被創(chuàng)建送丰。 這里 TwoOrgsOrdererGenesis 配置缔俄,是在 configtx.yaml文件中定義的,可以查看文件,選擇其他類型的 orderer 節(jié)點(diǎn)俐载。
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
或者
configtxgen -profile SampleDevModeKafka -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
生成對(duì)應(yīng)的 raft 或者 kafka 類型的 orderer蟹略。對(duì)應(yīng)的 profile 配置都在 yaml 文件中有聲明。
生成渠道配置
使用 configtxgen 命令創(chuàng)建渠道配置事務(wù)遏佣,首先要設(shè)置 CHANNEL_NAME 環(huán)境變量挖炬。
export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
通過(guò)命令執(zhí)行的輸出結(jié)果,可以看產(chǎn)生一個(gè)渠道配置事務(wù)贼急。
然后通過(guò)相同的命令 configtxgen, 為機(jī)構(gòu)產(chǎn)生對(duì)應(yīng)的錨節(jié)點(diǎn)茅茂。
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
可以看到生成對(duì)應(yīng)機(jī)構(gòu)的錨節(jié)點(diǎn) (這里稍微涉及一下錨節(jié)點(diǎn)的概念,錨節(jié)點(diǎn)主要起到了能讓不同的 Org 之間的 peer 能通過(guò)錨節(jié)點(diǎn)相互認(rèn)知的作用太抓, 具體可以訪問(wèn)錨節(jié)點(diǎn)的定義:錨節(jié)點(diǎn))
啟動(dòng)網(wǎng)絡(luò)
稍微回顧在之前做的一些準(zhǔn)備工作空闲。 設(shè)置環(huán)境變量,產(chǎn)生機(jī)構(gòu)的 ca走敌, key 和 msp 信息碴倾,產(chǎn)生 orderer 節(jié)點(diǎn)(靠這個(gè)節(jié)點(diǎn)來(lái)啟動(dòng)整個(gè)網(wǎng)絡(luò)), 產(chǎn)生渠道配置掉丽,并為網(wǎng)絡(luò)中的機(jī)構(gòu)設(shè)置了對(duì)應(yīng)的錨節(jié)點(diǎn)跌榔。
接下來(lái),將根據(jù)之前做的準(zhǔn)備捶障,根據(jù)產(chǎn)生的 genesis.block 等文件信息啟動(dòng)整個(gè)網(wǎng)絡(luò)僧须。
通過(guò) docker 啟動(dòng)網(wǎng)絡(luò)。
docker-compose -f docker-compose-cli.yaml up -d
可以看到项炼,根據(jù) yaml 文件中的定義担平,啟動(dòng)了對(duì)應(yīng)的網(wǎng)絡(luò)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)了各自的 docker 鏡像锭部, 可以通過(guò) docker ps 查看當(dāng)前啟動(dòng)的 docker 鏡像暂论。
創(chuàng)建渠道
接下來(lái)根據(jù)在準(zhǔn)備中創(chuàng)建渠道配置信息,創(chuàng)建并加入渠道拌禾。
使用 docker 命令取胎,進(jìn)入啟動(dòng)的網(wǎng)絡(luò)鏡像中。
docker exec -it cli bash
這里可以看一下湃窍, 在啟動(dòng)網(wǎng)絡(luò)的 docker-compose 文件中闻蛀,定義了 cli 容器依賴于所有的節(jié)點(diǎn)鏡像,可以理解這就是搭建的整個(gè)網(wǎng)絡(luò)您市。
因此觉痛,當(dāng)需要在 cli 中操作對(duì)應(yīng)的網(wǎng)絡(luò)節(jié)點(diǎn)的時(shí)候,需要設(shè)置對(duì)應(yīng)的環(huán)境變量墨坚,切換到對(duì)應(yīng)的操作對(duì)象秧饮。
對(duì)于 peer0 節(jié)點(diǎn)映挂, 設(shè)置以下的環(huán)境變量。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
CORE_PEER_LOCALMSPID="Org1MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
設(shè)置環(huán)境變量后盗尸,可以通過(guò) env 命令進(jìn)行查看柑船。
接下來(lái)通過(guò) peer channel create 命令,創(chuàng)建渠道信息泼各, 需要設(shè)置 CHANNEL_NAME 環(huán)境變量鞍时。
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --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
接著將 peer0.org1.example.com 加入到創(chuàng)建的渠道中。
peer channel join -b mychannel.block
然后扣蜻,修改環(huán)境變量逆巍,操作機(jī)構(gòu)二,將機(jī)構(gòu)二同樣加入到渠道中
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" 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 peer channel join -b mychannel.block
更新錨節(jié)點(diǎn)
創(chuàng)建渠道后莽使,更新錨節(jié)點(diǎn)锐极,使節(jié)點(diǎn)知道剛加入到渠道中的機(jī)構(gòu)。
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --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
同樣的芳肌,改變環(huán)境變量為 Org2 的灵再, 更新 Org2 的錨節(jié)點(diǎn)信息。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp &&CORE_PEER_ADDRESS=peer0.org2.example.com:9051 &&CORE_PEER_LOCALMSPID="Org2MSP" &&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 &&peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --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
部署代碼
將機(jī)構(gòu)加入到渠道之后亿笤,接下來(lái)就可以安裝和初始化 chaincode翎迁, 為之后的應(yīng)用調(diào)用做基礎(chǔ)了。
使用 peer chaincode install 命令净薛,在節(jié)點(diǎn)上進(jìn)行 chaincode 的安裝汪榔, 在 cli 中執(zhí)行以下命令 :
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
可以看到 chaincode 已經(jīng)成功安裝。
對(duì)于 Org2 肃拜,采取同樣改變環(huán)境變量的方式痴腌,安裝 chaincode。
ORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" 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 peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
現(xiàn)在爆班,在 Org1 和 Org2 對(duì)chaincode 進(jìn)行初始化衷掷, 初始化后的 chaincode 才能被應(yīng)用所調(diào)用辱姨。 使用 peer chaincode instantiate 進(jìn)行初始化柿菩。安裝是物理上的代碼在對(duì)應(yīng)節(jié)點(diǎn)中的部署,初始化是邏輯上的概念目的是為了讓當(dāng)前channel中的節(jié)點(diǎn)知道有對(duì)應(yīng)的chaincode
peer chaincode instantiate -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 -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
在這個(gè)命令中的最后一個(gè)參數(shù)中雨涛, -P "AND ('Org1MSP.peer','Org2MSP.peer')" 指代的是應(yīng)用的一個(gè)交易請(qǐng)求枢舶,需要同時(shí)有 Org1 和 Org2 的認(rèn)可。 (-P 參數(shù)指代 policy)
初始化操作只需要執(zhí)行一遍替久,不需要再切換環(huán)境變量重新執(zhí)行凉泄,因?yàn)?Org1 和 Org2 在同一個(gè) channel 中。
與網(wǎng)絡(luò)交互
至此蚯根,網(wǎng)絡(luò)已經(jīng)搭建完成后众,并有了對(duì)應(yīng)的 chaincode, 可以通過(guò)提交查詢或修改請(qǐng)求,來(lái)驗(yàn)證網(wǎng)絡(luò)搭建是否成功了蒂誉。
在調(diào)用 peer chaincode instantiate 時(shí)教藻,用 -c 調(diào)用了 chaincode 的 init 方法,將 a 和 b 分別設(shè)置為 100 和 200右锨。
對(duì)設(shè)置的值進(jìn)行一個(gè)查詢操作括堤。
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
返回的結(jié)果是初始化時(shí)設(shè)置的值,說(shuō)明網(wǎng)絡(luò)搭建成功了绍移。
再嘗試一個(gè)修改的操作悄窃。
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:9051 --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 -c '{"Args":["invoke","a","b","10"]}'
可以看到修改完成,返回狀態(tài)碼 200蹂窖, 再次查詢轧抗。
這里由于網(wǎng)絡(luò)異常, 執(zhí)行了兩次瞬测, 變 80 了鸦致。
結(jié)束
手動(dòng)操作了文檔中的 byfn.sh 中的詳細(xì)步驟,最后能運(yùn)行命令涣楷,結(jié)果和期望的一樣分唾。