Hyperledger Fabric開發(二):建立網路
執行fabric-samples專案中的一個例子:first-network,建立第一個網路(Building Your First Network)。
該網路共有4個peer節點,劃分為2個組織(organizations),以及1個單獨的orderer節點,另外還需要一個容器來執行建立和加入channel、部署和執行chaincode等命令。
執行該例子需要下載的檔案有:fabric-samples專案,特定的平臺二進位制檔案,所需的映象檔案。
準備
專案下載
在已設定的GOPATH
路徑下從github
克隆fabric-samples
專案
mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone -b master https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
平臺檔案和映象檔案
一、指令碼自動化下載
1.官方文件提供了極為簡便的命令,執行即可完成下載
curl https://goo.gl/6wtTN5 | bash -s 1.1.0-alpha
版本可自由選擇,這裡選的是1.1.0-alpha
2.由於上面的curl
命令使用的是google的短網址,在國內下載緩慢,文件提供了可替換的url
,命令如下:
curl -sSL https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh | bash -s 1.1.0-alpha
3.上面的下載本質上是利用fabric
專案中的bootstrap.sh
指令碼,所以也可以直接執行https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh。最後將下載後的bin
目錄至於fabric-samples
中並新增到系統環境變數。
二、手動分步下載
1.特定的二進位制平臺檔案(Platform-specific Binaries)
先下載平臺檔案,開啟bootstap.sh
指令碼檔案檢視原始碼,可以找到下載地址,選擇合適的版本,當前最新是darwin-amd64-1.1.0-alpha/
,然後選擇hyperledger-fabric-darwin-amd64-1.1.0-alpha.tar.gz
解壓後可獲得bin
目錄,其中包含檔案cryptogen
, configtxgen
, configtxlator
和peer
。將bin
目錄至於fabric-sample
目錄下並加入系統環境變數,開啟配置檔案vim ~/.bash_profile
後新增
export PATH=$HOME/hyperledger/fabric-samples/bin:$PATH
2.映象檔案下載(images)
所需的映象檔案有peer, orderer, ca, ccenv, javaenv, kafka, zookeeper, couchdb和tools。通過docker pull
命令從docker hub
中逐一拉取映象,例如:
docker pull hyperledger/fabric-peer:x86_64-1.1.0-alpha
注意後面要帶上標籤,否則會下載失敗,全部拉取完成後,為了保證網路的成功執行,需要給每個映象打上latest
標籤。格式和示例如下:
docker tag IMAGEID(映象id) REPOSITORY:TAG(倉庫:標籤)
docker tag f00c5d490d19 docker.io/hyperledger/fabric-peer:latest
執行
1.生成配置資訊
cd ~/hyperledger/fabric-samples
./byfn.sh -m generate
該命令利用平臺檔案中的crypotogen
和configtxgen
工具主要完成以下工作:生成網路成員所需的證照和金鑰,生成創世排序區塊(Orderer Genesis block),以及生成一系列配置channel
所需的配置交易(configuration transactions),並且生成Org1和Org2的Anchor
節點更新交易。成功執行後,生成crypto-config
目錄和channel-artifacts目錄。
2.啟動網路
./byfn.sh -m up
該行命令利用docker-compose up
命令執行所有映象,主要完成的工作有:構建4個peer節點和1個orderer
節點,建立channel
並把4個peer節點加入其中,在各peer節點上安裝chaincode
並執行相關操作。
3.結束執行
./byfn.sh -m down
該命令會終止所有正在執行的容器,刪除生成的配置檔案,並刪除chaincode映象。
分析
1.證照生成器
使用二進位制平臺檔案中的
cryptogen
工具來為網路中的實體生成證照(certificates),這些證照是身份的象徵,它們允許我們的實體在交流和交易的時候進行簽名(sign)和身份驗證(verify authentication)。cryptogen
工具讀取包含網路拓撲資訊的crypto-config.yaml
配置檔案來生成相關證照,併為組織和這些組織的成員生成一組證照和金鑰。每個組織都分配了一個唯一的根證照(ca-cert),它將特定成員(peers and orderer)繫結到該組織。在這個典型的網路中,成員將使用證照授權(Certificate Authority)生成屬於自己的證照,Hyperledger Fabric中的交易和通訊由實體的私鑰(keystore)簽名,然後通過公鑰(signcerts)進行驗證。
2.配置交易生成器
configtxgen tool
用來生成4個配置檔案:
orderer genesis block:排序服務(ordering service)的創世區塊。
channel configuration transaction:通道配置交易,會在channel建立時廣播給orderer。
two anchor peer transactions:指定通道上兩個組織的錨節點(Anchor Peer)。configtxgen tool
讀取配置檔案configtx.yaml
,該檔案包含該簡單網路的定義。
1.檔案頂部的Profiles
部分有兩個頭部,一個是TwoOrgsOrdererGenesis
用於生成orderer genesis block,一個是TwoOrgsChannel
,用於生成channel配置交易,這兩個頭部會在生成配置資訊作為引數傳遞進去。
2.檔案的Organizations
部分顯示該網路有3個成員,OrdererOrg,Org1,Org2。檔案指定了一個聯盟(SampleConsortium),由兩個Peer Orgs組成。每個Org中指定了MSP的目錄位置,其中兩個Peer Org裡還指定了AnchorPeers
,該值定義了能夠用於跨越組織通訊(cross org gossip communication)的節點的位置。該部分將會在後續的配置中被引用。
3.檔案的Orderer
部份定義了一些將會用作排序相關操作引數的值,它們被編碼(encode)入配置交易或者創世區塊中。配置檔案中儲存了網路每個成員(組織和節點)的MSP目錄,因此可以將每個組織的根證照(cacerts)儲存在orderer genesis block中,當網路實體與ordering service通訊時,就能對實體的數字簽名進行驗證。過程是:通過創世排序區塊中的CA證照得到CA公鑰,然後用CA公鑰對交易或通訊中的證照進行驗證,身份驗證成功後得到實體節點的公鑰,然後用該公鑰來驗證資訊的完整性。
3.手動執行工具
生成證照
當前路徑位於first-network
目錄下,bin
檔案在上一級目錄fabric-samples
中,執行以下命令後證照和祕鑰(也就是MSP material)會被輸出到crypto-config
目錄中。../bin/cryptogen generate --config=./crypto-config.yaml
生成創世區塊
首先需要告訴configtxgen
去哪找到需要的配置檔案configtx.yaml
,所以要在執行命令前先設定一個環境變數export FABRIC_CFG_PATH=$PWD ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
建立channel配置交易(channel.tx)
執行命令前需要設定$CHANNEL_NAME
環境變數。export CHANNEL_NAME=mychannel ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
接下來,在我們正在構建的channel上定義兩個
anchor peer
(for Org1 and Org2)。../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
生成的order genesis block 和 channel transaction artifacts都將輸出到
channel-artifacts
目錄下。最終目錄包含4個檔案:genesis.block,channel.tx,Org1MSPanchors.tx和Org2MSPanchors.tx。
4.啟動網路
注意: 在執行之前,需要修改
docker-compose-cli.yaml
檔案,註釋掉以下一行:command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'
該行程式碼會使cli容器執行的時候自動執行指令碼
script.sh
,會進行建立channel,加入節點等等一系列操作,此時如果再進行手動執行,並把CHANNEL_NAME
設定為mychannel,就會出現channel名稱重複問題,從而報錯Error: got unexpected status: BAD_REQUEST
。執行
docker-compose
命令啟動網路docker-compose -f docker-compose-cli.yaml up -d
如果cli容器處於睡眠狀態,可通過
docker run cli
重新執行。建立channel並加入節點
CLI容器針對peer0.org1.example.com
操作所需要的環境變數已經設定好了,但如果需要對其他peer或者orderer節點進行操作,則需要提供這些變數值。
首先進入CLI容器中:docker exec -it cli bash
接下來先定義
CHANNEL_NAME
變數,然後建立channel,將channel.tx
作為建立channel請求的一部分傳送給orderer,其中-c
引數是channel name,-f
引數是channel配置交易(channel.tx),--cafile
引數指定了orderer的根證照路徑,用於驗證TLS握手。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
上述命令將生成一個
<channel-ID.block>
,在這裡是mychannel.block
,現在將節點peer0.org1.example.com
加入channel。peer channel join -b mychannel.block
當需要加入其它節點的時候,需要將環境變數傳入,這裡繼續加入
peer0.org2.example.com
。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:7051 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
更新anchor peers
下面的命令將更新channel的定義從而定義anchor peers,本質上只是在channel的genesis block之上新增了一些配置資訊。
定義Org1的anchor peer:peer0.org1.example.com
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
定義Org2的anchor peer:
peer0.org2.example.com
,同樣的,需要加上環境變數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:7051 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
安裝並例項化(instantiate)鏈碼(chaincode)
這裡使用的是已經存在的chaincode,應用通過chaincode與區塊鏈進行互動,我們需要在每個peer節點上安裝chaincode,原始碼會被存放在節點的檔案系統中,然後在channel上例項化chaincode。
注意: 文件中chaincode在cli容器檔案系統內的地址是
github.com/chaincode/chaincode_example02/go/
,而我的實際路徑為github.com/hyperledger/fabric/examples/chainco
。(更新於4.12,release-1.1版本的路徑與文件中一致)
de/go/chaincode_example02
安裝Golang語言編寫的chaincode:peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
例項化chaincode,這會在channel上初始化chaincode,併為目標節點執行一個chaincode容器。注意
-P
引數設定了endorsement的策略,這裡是OR ('Org0MSP.peer','Org1MSP.peer')
,表示需要屬於Org1**或者**Org2的1個peer進行1次背書(endorsement)。例項化命令如下: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 "OR ('Org1MSP.peer','Org2MSP.peer')"
查詢(Query)
首先查詢a的值,以確保chaincode成功例項化並且狀態資料庫(state DB)被成功填充。peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
查詢結果為
Query Result: 100
呼叫(Invoke)
從a賬戶轉移10個數額到b賬戶,這個命令將會把交易傳送至orderer節點並建立新的block,同時更新stateDB。peer chaincode invoke -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 -c '{"Args":["invoke","a","b","10"]}'
再次呼叫Query命令可得到結果
Query Result: 90
。
5.執行過程分析
以下是通過./byfn.sh -m up
啟動網路時,執行script.sh
指令碼所進行步驟:
script.sh
指令碼在CLI容器內執行,該指令碼執行了createChannel
命令,提供了channel的名字,並且使用channel.tx
作為配置檔案,來建立一個channel。createChannel
的輸出是一個genesis block,儲存在peer的檔案系統中。block中儲存了channel的配置資訊(由channel.tx
指定)。joinChannel
命令將4個peer加入channel中,用上面建立的genesis block
作為輸入,建立了一條以該創世區塊為開始的chain。- 更新兩個org的
anchor peers
,將Org1MSPanchors.tx
和Org2MSPanchors.tx
傳送給ordering service
以實現更新。 - chaincode (chaincode_example02)被安裝在
peer0.org1
和peer0.org2
中。使chaincode在peer0.org2
中例項化,將chaincode新增到channel中,執行容器dev-peer0.org2.example.com-mycc-1.0
。 - 查詢(query)
peer0.org1
節點中a的值,結果為100, 由於chaincode在該節點已經完成install,所以該查詢操作會執行一個chaincode容器。接著在該節點中(invoke)從a的賬戶向b轉移10金額。 - 在
peer1.org2
中下載chaincode。向該節點傳送查詢a的操作,同樣又會執行第3個新的chaincode容器。得到查詢的值為90。注意這裡的每個fabric節點中,是沒有資料庫副本的(database replicas),即對資料庫的寫入是可以保證資料一致性。
相關文章
- Hyperledger Fabric(Hyperledger Fabric模型)模型
- 區塊鏈開發Hyperledger Fabric入門區塊鏈
- Hyperledger Fabric定製聯盟鏈網路工程實踐
- Hyperledger Fabric 智慧合約開發及 fabric-sdk-go/fabric-gateway 使用示例GoGateway
- Hyperledger Fabric 部署
- 2.01 hyperledger fabric概念
- Hyperledger Fabric 核心概念
- Hyperledger Fabric 2.2 學習筆記:測試網路test-network筆記
- ChainDesk :從 0 到 1-Hyperledger Fabric 開發精要 (一)AI
- Hyperledger Fabric Node.js 智慧合約鏈碼開發Node.js
- Hyperledger Fabric 使用 CouchDB 和複雜智慧合約開發
- Hyperledger fabric-SDK-GO客戶端開發篇(六)Go客戶端
- 【Hyperledger Fabric】Fabric 2.2 手動安裝
- 2.02 hyperledger fabric入門
- 2.08 hyperledger fabric完整案例
- Hyperledger Fabric(分類賬)
- Hyperledger Fabric on SAP Cloud PlatformCloudPlatform
- 在Ubantu16.04下Hyperledger fabric開發環境的搭建開發環境
- Hyperledger Fabric Node.js 智慧合約即鏈碼開發Node.js
- fabric sdk : org.hyperledger.fabric.sdk.exception.ProposalExceptionException
- 搭建Hyperledger Fabric 2.3.2開發環境及簡單案例執行開發環境
- 2.04 hyperledger fabric共識排序排序
- 2.06 hyperledger fabric智慧合約
- 2.07 hyperledger fabric鏈碼案例
- Hyperledger Fabric 2.0 Alpha釋出了!
- Hyperledger Fabric 超級賬本 java開發區塊鏈環境搭建Java區塊鏈
- 利用Hyperledger Fabric開發你的第一個區塊鏈應用區塊鏈
- Hyperledger Fabric部署的坑(更新中)
- Hyperledger Fabric的基本功能
- 2.03 hyperledger fabric系統架構架構
- 2.05 hyperledger fabric賬本儲存
- Hyperledger Fabric命令詳解之 up
- hyperledger fabric - chaincode fingerprint mismatch data mismatchAI
- Hyperledger Fabric部署與測試(Ubuntu)Ubuntu
- 1-Hyperledger Fabric概念詳解
- Hyperledger fabric 鏈碼篇GO(四)Go
- Hyperledger Fabric無系統通道啟動及通道的建立和刪除
- Hyperledger Fabric系統鏈碼介紹
- 在Ubuntu上部署Hyperledger Fabric環境Ubuntu