2019-06-22

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 目錄下的命令工具反浓。

命令行中可運(yùn)行bin目錄下的腳本文件

初始化網(wǎng)絡(luò)

下載 fabric-samples 項(xiàng)目后萌丈,進(jìn)入解壓的目錄,有許多文件夾勾习,所有的操作浓瞪,都會(huì)在這里進(jìn)行運(yùn)行懈玻。

項(xiàng)目結(jié)構(gòu)目錄

首先巧婶,使用 cryptogen 命令,產(chǎn)生網(wǎng)絡(luò)配置將要使用的證書信息:

cryptogen generate --config=./crypto-config.yaml

執(zhí)行后涂乌,將打印以下結(jié)果:


生成的兩個(gè)機(jī)構(gòu)

命令執(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

渠道配置事務(wù)的創(chuàng)建

通過(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

更新機(jī)構(gòu)一錨節(jié)點(diǎn)

configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

更新機(jī)構(gòu)二錨節(jié)點(diǎn)

可以看到生成對(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

啟動(dòng)網(wǎng)絡(luò)

可以看到项炼,根據(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 鏡像暂论。


網(wǎng)絡(luò)中運(yùn)行的節(jié)點(diǎn)

創(chuàng)建渠道

接下來(lái)根據(jù)在準(zhǔn)備中創(chuàng)建渠道配置信息,創(chuàng)建并加入渠道拌禾。
使用 docker 命令取胎,進(jìn)入啟動(dòng)的網(wǎng)絡(luò)鏡像中。

docker exec -it cli bash

進(jìn)入docker指定鏡像中

這里可以看一下湃窍, 在啟動(dòng)網(wǎng)絡(luò)的 docker-compose 文件中闻蛀,定義了 cli 容器依賴于所有的節(jié)點(diǎn)鏡像,可以理解這就是搭建的整個(gè)網(wǎng)絡(luò)您市。


cli 鏡像的依賴

因此觉痛,當(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)行查看柑船。


操作機(jī)構(gòu)一所需的環(huá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

創(chuàng)建渠道

接著將 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

可以看到 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/

安裝chaincode

現(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"]}'

查詢數(shù)據(jù)

返回的結(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"]}'

修改數(shù)據(jù)

可以看到修改完成,返回狀態(tài)碼 200蹂窖, 再次查詢轧抗。


查詢修改后的數(shù)據(jù)

這里由于網(wǎng)絡(luò)異常, 執(zhí)行了兩次瞬测, 變 80 了鸦致。

結(jié)束

手動(dòng)操作了文檔中的 byfn.sh 中的詳細(xì)步驟,最后能運(yùn)行命令涣楷,結(jié)果和期望的一樣分唾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狮斗,隨后出現(xiàn)的幾起案子绽乔,更是在濱河造成了極大的恐慌,老刑警劉巖碳褒,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折砸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沙峻,警方通過(guò)查閱死者的電腦和手機(jī)睦授,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摔寨,“玉大人去枷,你說(shuō)我怎么就攤上這事∈歉矗” “怎么了删顶?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)淑廊。 經(jīng)常有香客問(wèn)我逗余,道長(zhǎng),這世上最難降的妖魔是什么季惩? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任录粱,我火速辦了婚禮腻格,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啥繁。我一直安慰自己荒叶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布输虱。 她就那樣靜靜地躺著些楣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宪睹。 梳的紋絲不亂的頭發(fā)上愁茁,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音亭病,去河邊找鬼鹅很。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罪帖,可吹牛的內(nèi)容都是我干的促煮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼整袁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菠齿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坐昙,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绳匀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后炸客,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾棵,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年痹仙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡开仰,死狀恐怖拟枚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抖所,我是刑警寧澤梨州,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布痕囱,位于F島的核電站田轧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鞍恢。R本人自食惡果不足惜傻粘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一每窖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弦悉,春花似錦窒典、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至污秆,卻和暖如春劈猪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背良拼。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工战得, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庸推。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓常侦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贬媒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聋亡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容