搭建第一個(gè)網(wǎng)絡(luò)(二)
本文主要是根據(jù)網(wǎng)上文檔動(dòng)手操作,熟悉一下區(qū)塊鏈網(wǎng)絡(luò)的工作流程戈泼,包括生成創(chuàng)世區(qū)塊赏僧,創(chuàng)建通道,安裝鏈碼胎署,實(shí)例化鏈碼窑滞,實(shí)現(xiàn)查詢、調(diào)用的功能巨坊。
生成初始區(qū)塊
$ ../bin/cryptogen generate --config=./crypto-config.yaml
$ export FABRIC_CFG_PATH=$PWD? #賦值
$ ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
生成應(yīng)用通道的配置信息
$ export CHANNEL_NAME=mychannel? ? #mychannel是鏈的標(biāo)識(shí)此改,可以自己命名
$ ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME??
生成錨節(jié)點(diǎn)配置更新文件,錨節(jié)點(diǎn)與對(duì)點(diǎn)節(jié)點(diǎn)通信
#將在正在構(gòu)建的通道上定義Org1的anchor peer占调。請(qǐng)?jiān)俅未_認(rèn)$CHANNEL_NAME已被替換或者為以下命令設(shè)置了環(huán)境變量
$ ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP?
#在同一個(gè)通道定義Org2的anchor peer:
$ ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
操作網(wǎng)絡(luò)
現(xiàn)在我們想手動(dòng)執(zhí)行命令,以便公開每個(gè)調(diào)用的語法和功能薪者,所以打開docker-compose-cli.yaml文件剿涮,注釋掉下面的command命令:
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT' volumes
#如果沒有注釋,該腳本將在網(wǎng)絡(luò)啟動(dòng)時(shí)執(zhí)行所有命令悬槽。
$ CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d
#適當(dāng)?shù)貫門IMEOUT傳遞較高的值(以秒為單位);默認(rèn)情況下CLI容器將在60秒之后退出瞬浓。
創(chuàng)建和加入通道
使用docker exec命令進(jìn)入CLI容器:
$ docker exec -it cli bash
如果成功猿棉,你將看到下列信息:
root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#
創(chuàng)建通道
$ export CHANNEL_NAME=mychannel
$?peer channel create -oorderer.example.com:7050-c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#此命令返回一個(gè)創(chuàng)世區(qū)塊-<channel-ID.block>-我們將使用它加入信道。它包含了channel.tx中的配置信息宪躯。
加入通道
$ peer channel join -b mychannel.block
安裝和實(shí)例化鏈碼
$ peer chaincode install -n mycc -v 1.0 -pgithub.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$?peer chaincode instantiate -oorderer.example.com:7050--tls $CORE_PEER_TLS_ENABLED --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 "OR ('Org1MSP.member','Org2MSP.member')"
查詢
#查詢一下a的值位迂,以確保鏈碼被正確實(shí)例化,state DB被填充
$?peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
#查詢結(jié)果
Query Result : 100
調(diào)用
#我們從a賬戶轉(zhuǎn)10到b賬戶臣缀。這個(gè)交易將創(chuàng)建一個(gè)新的區(qū)塊并更新state DB泻帮。
$?peer chaincode invoke -oorderer.example.com:7050--tls $CORE_PEER_TLS_ENABLED --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 -c '{"Args":["invoke","a","b","10"]}'
查詢
#確認(rèn)下我們之前的調(diào)用被正確地執(zhí)行了锣杂。我們初始化了a的值為100,在上一次調(diào)用的時(shí)侯轉(zhuǎn)移了10給b元莫。因此,查詢a應(yīng)該展示90火欧。
$ peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
# 應(yīng)該看到以下內(nèi)容
$?Query Result: 90
這些步驟描述了在script.sh腳本中沒有注釋掉的docker-compose-cli.yaml文件中的場景。使用./byfn.sh -m down并確保命令執(zhí)行成功赶盔。然后使用相同的docker-compose提示去啟動(dòng)你的網(wǎng)絡(luò)榆浓。
script.sh腳本被拷貝到CLI容器中。這個(gè)腳本驅(qū)動(dòng)了使用提供的channel name以及信道配置的channel.tx文件的createChannel命令。
createChannel命令的產(chǎn)出是一個(gè)創(chuàng)世區(qū)塊-<your_channel_name>.block-這個(gè)創(chuàng)世區(qū)塊被存儲(chǔ)在peer節(jié)點(diǎn)的文件系統(tǒng)中同時(shí)包含了在channel.tx的信道配置打却。
joinChannel命令被4個(gè)peer節(jié)點(diǎn)執(zhí)行,作為之前產(chǎn)生的genesis block的輸入猿推。這個(gè)命令介紹了peer節(jié)點(diǎn)加入<your_channel_name>以及利用<your_channel_name>.block去創(chuàng)建一條鏈捌肴。
現(xiàn)在我們有了由4個(gè)peer節(jié)點(diǎn)以及2個(gè)組織構(gòu)成的信道。這是我們的TwoOrgsChannel配置文件秽五。
peer0.org1.example.com和peer1.org1.example.com屬于Org1;peer0.org2.example.com和peer1.org2.example.com屬于Org2
這些關(guān)系是通過crypto-config.yaml定義的饥悴,MSP路徑在docker-compose文件中被指定。
Org1MSP(peer0.org1.example.com)和Org2MSP(peer0.org2.example.com)的anchor peers將在后續(xù)被更新瓣铣。我們通過攜帶channel的名字傳遞Org1MSPanchors.tx和Org2MSPanchors.tx配置到排序服務(wù)來實(shí)現(xiàn)anchor peer的更新贷揽。
一個(gè)鏈碼-chaincode_example02被安裝在peer0.org1.example.com和peer0.org2.example.com
這個(gè)鏈碼在peer0.org2.example.com被實(shí)例化禽绪。實(shí)例化過程將鏈碼添加到信道上,并啟動(dòng)peer節(jié)點(diǎn)對(duì)應(yīng)的容器印屁,并且初始化和鏈碼服務(wù)有關(guān)的鍵值對(duì)。示例的初始化的值是[”a“,”100“巨柒,”b“,”200“]晶乔。實(shí)例化的結(jié)果是一個(gè)名為dev-peer0.org2.example.com-mycc-1.0的容器啟動(dòng)了牺勾。
實(shí)例化過程同樣為背書策略傳遞相關(guān)參數(shù)。策略被定義為-P "OR????('Org1MSP.member','Org2MSP.member')"翻具,意思是任何交易必須被Org1或者Org2背書回还。
一個(gè)針對(duì)a的查詢發(fā)往peer0.org1.example.com。鏈碼服務(wù)已經(jīng)被安裝在了peer0.org1.example.com柠硕,因此這次查詢將啟動(dòng)一個(gè)名為dev-peer0.org1.example.com-mycc-1.0的容器蝗柔。查詢的結(jié)果也將被返回。沒有寫操作出現(xiàn)癣丧,因此查詢的結(jié)果的值將為100。
一次invoke被發(fā)往peer0.org1.example.com竟痰,從a轉(zhuǎn)移10到b掏呼。
然后鏈碼服務(wù)被安裝到peer1.org2.example.com
一個(gè)query請(qǐng)求被發(fā)往peer1.org2.example.com用于查詢a的值。這將啟動(dòng)第三個(gè)鏈碼服務(wù)名為dev-peer1.org2.example.com-mycc-1.0莽鸿。返回a的值為90,正確地反映了之前的交易拾给,a的值被轉(zhuǎn)移了10。
排錯(cuò)
始終保持你的網(wǎng)絡(luò)是全新的级及。使用以下命令來移除之前生成的artifacts,crypto,containers以及chaincode images:
$ ./byfn.sh -m down
查詢正在運(yùn)行的容器
$ docker ps -a
刪除鏡像:
$ docker rm -f $(docker ps -aq)
$ docker rmi -f $(docker images -q)
參考:
構(gòu)建第一個(gè)fabric網(wǎng)絡(luò):https://hyperledgercn.github.io/hyperledgerDocs/build_network_zh/