本文作為 Fabric 官方文檔的補充颅筋,帶你一步步搭建 Fabric 網(wǎng)絡(luò)宙暇,中間會有一些解釋說明。搭建 Fabric 網(wǎng)絡(luò)是個繁瑣易出錯的過程议泵,如果碰到啥問題占贫,要恭喜你,離成為大牛又近了一步肢簿。
世上本沒有大牛靶剑,填的坑多了蜻拨,也就成了大牛池充。
第一步 確定聯(lián)盟成員
本文接下來會假定 SAP 與 IBM 要組成一個培訓聯(lián)盟桩引,共享培訓資源。那么我們可以基本確定這個培訓聯(lián)盟的創(chuàng)世成員為 SAP 與 IBM收夸。
聯(lián)盟有個新域名 training.com.
SAP 和 IBM 分別有一個組織域名 sap.training.com, ibm.training.com
第二步 確定網(wǎng)絡(luò)節(jié)點
在 Fabric 網(wǎng)絡(luò)里最重要的兩類節(jié)點坑匠,一個是 Orderer 節(jié)點,一個是 Peer 節(jié)點卧惜。
Orderer 節(jié)點為聯(lián)盟成員共享的中心化節(jié)點厘灼。用來對交易進行排序,是 Fabric 共識機制的重要組成部分咽瓷。
Peer 節(jié)點為各聯(lián)盟成員分別維護的對等節(jié)點设凹,為 Fabric 網(wǎng)絡(luò)的記賬節(jié)點。
通過一番討論茅姜,我們假定 SAP 與 IBM 決定先從最小化網(wǎng)絡(luò)開始闪朱,分別維護兩個對等節(jié)點。
第三步 生成 MSP
Fabric 是個有權(quán)限的網(wǎng)絡(luò)钻洒,各個網(wǎng)絡(luò)節(jié)點之間通訊都需要進行身份認證奋姿。MSP 保存了各個網(wǎng)絡(luò)節(jié)點的證書和私鑰,當某個節(jié)點要和其它節(jié)點通訊時用私鑰對數(shù)據(jù)進行簽名素标,同時附帶自己的證書称诗,對方節(jié)點就可以通過證書驗證消息發(fā)送方的身份,繼而通過證書里的公鑰來驗證消息確實是由擁有該身份的節(jié)點發(fā)送過來的头遭。
MSP 的配置信息如下:
OrdererOrgs:
- Name: Orderer
Domain: training.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: sap
Domain: sap.training.com
Template:
Count: 2
Users:
Count: 1
- Name: ibm
Domain: ibm.training.com
Template:
Count: 2
Users:
Count: 1
從上面配置我們可以看到前面提到的 Orderer 節(jié)點組織和 Peer 節(jié)點組織寓免。Template.Count 指定了所要生成的節(jié)點數(shù)量。Users.Count 指定了需要生成的初始化用戶數(shù)量计维。
這里為了方便再榄,把配置寫在了一個配置文件中。在項目實際操作過程中享潜,為了私鑰安全困鸥,可以每個組織分別生成自己的 MSP 信息。
把上面的配置在當前文件夾下保存為crypto-config.xml, 可以調(diào)用下面的命令來生成 MSP 配置信息:
cryptogen generate --config crypto-config.yaml
該命令會在當前目錄生成一個 crypto-config 的目錄結(jié)構(gòu)剑按,如下面截圖所示:
第四步 生成 Orderer 創(chuàng)世區(qū)塊
在 Orderer 節(jié)點上維護的有個 system chain, 這個創(chuàng)世區(qū)塊實際上是這個 system chain 的創(chuàng)世區(qū)塊疾就。在 Fabric 的上下文中,chain艺蝴,channel 基本上可以通用猬腰,下面有時會稱 system chain 為 system channel。
這個創(chuàng)世區(qū)塊都包含什么東西呢猜敢?可以看看用來生成這個區(qū)塊的配置文件姑荷。
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
---
Organizations:
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: crypto-config/ordererOrganizations/training.com/msp
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
- &Sap
Name: SapMSP
ID: SapMSP
MSPDir: crypto-config/peerOrganizations/sap.training.com/msp
AnchorPeers:
- Host: peer0.sap.training.com
Port: 7051
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
- &Ibm
Name: IbmMSP
ID: IbmMSP
MSPDir: crypto-config/peerOrganizations/ibm.training.com/msp
AnchorPeers:
- Host: peer0.ibm.training.com
Port: 7051
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
Orderer: &OrdererDefaults
OrdererType: solo
Addresses:
- orderer.training.com:7050
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
Kafka:
Brokers:
- 127.0.0.1:9092
Organizations:
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
Channel: &ChannelDefaults
# Policies defines the set of policies at this level of the config tree
# For Channel policies, their canonical path is
# /Channel/<PolicyName>
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
Application: &ApplicationDefaults
# Organizations is the list of orgs which are defined as participants on
# the application side of the network
Organizations:
# Policies defines the set of policies at this level of the config tree
# For Application policies, their canonical path is
# /Channel/Application/<PolicyName>
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
################################################################################
#
# Profile
#
# - Different configuration profiles may be encoded here to be specified
# as parameters to the configtxgen tool
#
################################################################################
Profiles:
TrainingOrdererGenesis:
<<: *ChannelDefaults
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
TrainingConsortium:
Organizations:
- *Sap
- *Ibm
TrainingChannel:
Consortium: TrainingConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Sap
- *Ibm
猛一看會感覺這個配置文件的內(nèi)容有點兒多盒延,我們可以從一個入口進去,拆開來慢慢看鼠冕。在這個文件里有兩個 Profile添寺, 一個是 TrainingOrdererGenesis, 一個是 TrainingChannel。一個 Profile 代表了一組配置懈费,我們生成創(chuàng)世區(qū)塊用的就是TrainingOrdererGenesis這個 Profile计露。里面包含了通道相關(guān)配置,Orderer 節(jié)點相關(guān)配置憎乙,聯(lián)盟成員相關(guān)配置票罐。通道相關(guān)配置確定了系統(tǒng)通道的一些權(quán)限策略,Orderer 節(jié)點配置確定了 Orderer 節(jié)點的類型(是 solo 還是 kafaka)泞边,Orderer 節(jié)點的訪問地址该押,還有出塊時間,區(qū)塊大小阵谚,區(qū)塊內(nèi)允許包含的交易數(shù)量等蚕礼。聯(lián)盟配置確定了聯(lián)盟的名稱和聯(lián)盟所包含的組織,對組織來說這里最為關(guān)鍵的是組織的 MSP ID 和路徑椭蹄,這些信息都會被包含到 system chain 中闻牡。
我們可以在當前目錄創(chuàng)建一個 artifacts 文件夾來存放要接下來要生成的各種區(qū)塊鏈工件。
mkdir artifacts
然后用下面的命令來生成創(chuàng)世區(qū)塊:
configtxgen -profile TrainingOrdererGenesis -channelID orderer-channel -outputBlock artifacts/orderer.genesis.block
如果我們不指定配置文件的路徑绳矩,該命令會從當前目錄下讀取名為 configtx.yaml 的配置文件罩润。這個命令需要指定一個 channelID,注意這里的 channelID 為系統(tǒng)鏈(system chain)的 channelID翼馆。
到這一步割以,其實就可以通過orderer命令或 docker 容器來啟動網(wǎng)絡(luò)了,orderer 啟動的時候會查找一個名為 orderer.yaml 的配置文件应媚,文件內(nèi)容比較多严沥,具體可以查看orderer 默認配置。這個配置文件不是必須的中姜,在找不到這個配置文件時消玄,orderer 命令會使用默認配置。我們也可以通過環(huán)境變量或命令行參數(shù)的方式去對每個配置項進行覆蓋丢胚。
下面截圖里"environment"配置項翩瓜,實際上就是在 docker 啟動的時候,通過環(huán)境變量覆蓋 orderer 默認配置對 orderer 節(jié)點進行自定義配置携龟。
為了方便我們做實驗兔跌,可以把 fabric-samples/first-network/base 文件夾拷貝到當前目錄,將配置文件里的域名和環(huán)境變量進行替換來作為自己 fabric 配置的基礎(chǔ)峡蟋,節(jié)省一些工作量坟桅。
實際工作中华望,我們也傾向與盡量站在前人的肩上,能復用的復用仅乓,將自己更多的時間花費在更有創(chuàng)造性的貢獻中去赖舟。
盡管這時我們已經(jīng)可以啟動 fabric 網(wǎng)絡(luò)了,但這個網(wǎng)絡(luò)沒有任何應用級別的通道(channel)方灾,相當于也沒啥用建蹄。
所以一般來說碌更,我們也會把創(chuàng)建應用通道所需要的工件準備好裕偿,再進行網(wǎng)絡(luò)的啟動。
第五步 生成通道交易
注意:這里我們生成的是個用來生成通道創(chuàng)世區(qū)塊的交易痛单,而不是創(chuàng)世區(qū)塊嘿棘。
通過下面的命令,可以生成這樣的一個交易旭绒。
configtxgen -profile TrainingChannel -outputCreateChannelTx artifacts/training-channel.tx -channelID training-channel
該命令會讀取和生成 Orderer 相同的配置文件鸟妙,只是使用了 "TrainingChannel" 這個 Profile,確定了通道的權(quán)限策略挥吵,創(chuàng)建通道的聯(lián)盟和組織信息重父。
只是創(chuàng)建了通道,而不創(chuàng)建錨節(jié)點的化忽匈,通道區(qū)塊數(shù)據(jù)就無法跨組織傳播房午,所以一般還要通過下面的命令創(chuàng)建用來更新錨節(jié)點的交易。
configtxgen -profile TrainingChannel -outputAnchorPeersUpdate artifacts/SapMSPAnchor.tx -asOrg SapMSP -channelID training-channel
configtxgen -profile TrainingChannel -outputAnchorPeersUpdate artifacts/IbmMSPAnchor.tx -asOrg IbmMSP -channelID training-channel
上面的命令生成了為每個組織生成錨節(jié)點的交易丹允。
到這里郭厌,我們就可以通過 “peer 命令” 或 docker 容器啟動包含 Orderer 節(jié)點,Peer 節(jié)點的 Fabric 網(wǎng)絡(luò)了雕蔽。peer 命令在啟動 peer 節(jié)點時默認會讀取 core.yaml, 該文件的默認配置見peer節(jié)點配置折柠。
在讀到這個配置文件之前,我一致對 fabric 網(wǎng)絡(luò)中 leader 節(jié)點如何產(chǎn)生批狐,orderer 節(jié)點如何感知 leader 節(jié)點的變化一致不是太清楚扇售,但這個配置文件把這點兒描述的算是比較清楚了。
# Defines whenever peer will initialize dynamic algorithm for
# "leader" selection, where leader is the peer to establish
# connection with ordering service and use delivery protocol
# to pull ledger blocks from ordering service. It is recommended to
# use leader election for large networks of peers.
useLeaderElection: true
# Statically defines peer to be an organization "leader",
# where this means that current peer will maintain connection
# with ordering service and disseminate block across peers in
# its own organization
orgLeader: false
從配置描述基本可以推斷出嚣艇,peer 節(jié)點會主動聯(lián)系 orderer 節(jié)點來明確當前的 leader 節(jié)點承冰。
這個階段把網(wǎng)絡(luò)啟動后,還是啥事都做不了髓废,節(jié)點之間也沒有通信巷懈。因為我們還沒真正去生成應用通道的創(chuàng)世區(qū)塊。
這時我們通過下面的命令來生成應用通道的創(chuàng)世區(qū)塊:
peer channel create -t 50s -o orderer.training.com:7050 -c training-channel -f ./channel-artifacts/training-channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/training.com/orderers/orderer.training.com/msp/tlscacerts/tlsca.training.com-cert.pem
然后通過下面的命令加入?yún)^(qū)塊:
peer channel join -b training-channel.block
在通過下面的命令來更新組織的錨節(jié)點:
peer channel update -o orderer.training.com:7050 -c training-channel -f ./channel-artifacts/SapMSPAnchor.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/training.com/orderers/orderer.training.com/msp/tlscacerts/tlsca.training.com-cert.pem
為什么創(chuàng)建應用通道搞的這么繁瑣呢慌洪?我想這主要由聯(lián)盟鏈的性質(zhì)決定的:
- 對聯(lián)盟鏈上與聯(lián)盟成員有關(guān)的任何網(wǎng)絡(luò)變動顶燕,都要網(wǎng)絡(luò)成員的確定凑保。否則,如果任何一個成員都可以對網(wǎng)絡(luò)進行修改涌攻,整個網(wǎng)絡(luò)的信任基礎(chǔ)也就蕩然無存了欧引。
- 加入通道,修改通道配置這些操作都需要各個網(wǎng)絡(luò)成員的確認恳谎。將操作步驟分開芝此,由每個節(jié)點的管理員自主加入通道,由每個組織的管理員來更新錨點等配置因痛。實際上是讓每個組織對相關(guān)操作進行了確認婚苹。
錨節(jié)點更新成功之后,一個可用的鸵膏,帶有應用通道的 Fabric 網(wǎng)絡(luò)就啟動起來了膊升。我們接下來就可以向網(wǎng)絡(luò)中部署鏈碼來實現(xiàn)業(yè)務(wù)邏輯了。
總結(jié)
部署 Fabric 網(wǎng)絡(luò)是個繁瑣的過程谭企,需要反復的練習廓译、試錯、琢磨债查,才能理解透徹非区,舉一反三。