搭建 Fabric 網(wǎng)絡(luò)分步走

本文作為 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)剑按,如下面截圖所示:


msp 目錄結(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é)點進行自定義配置携龟。

image.png

為了方便我們做實驗兔跌,可以把 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ì)決定的:

  1. 對聯(lián)盟鏈上與聯(lián)盟成員有關(guān)的任何網(wǎng)絡(luò)變動顶燕,都要網(wǎng)絡(luò)成員的確定凑保。否則,如果任何一個成員都可以對網(wǎng)絡(luò)進行修改涌攻,整個網(wǎng)絡(luò)的信任基礎(chǔ)也就蕩然無存了欧引。
  2. 加入通道,修改通道配置這些操作都需要各個網(wǎng)絡(luò)成員的確認恳谎。將操作步驟分開芝此,由每個節(jié)點的管理員自主加入通道,由每個組織的管理員來更新錨點等配置因痛。實際上是讓每個組織對相關(guān)操作進行了確認婚苹。

錨節(jié)點更新成功之后,一個可用的鸵膏,帶有應用通道的 Fabric 網(wǎng)絡(luò)就啟動起來了膊升。我們接下來就可以向網(wǎng)絡(luò)中部署鏈碼來實現(xiàn)業(yè)務(wù)邏輯了。

總結(jié)

部署 Fabric 網(wǎng)絡(luò)是個繁瑣的過程谭企,需要反復的練習廓译、試錯、琢磨债查,才能理解透徹非区,舉一反三。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盹廷,一起剝皮案震驚了整個濱河市征绸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌速和,老刑警劉巖歹垫,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颠放,居然都是意外死亡排惨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門碰凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暮芭,“玉大人,你說我怎么就攤上這事欲低≡辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵砾莱,是天一觀的道長瑞筐。 經(jīng)常有香客問我,道長腊瑟,這世上最難降的妖魔是什么聚假? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任块蚌,我火速辦了婚禮,結(jié)果婚禮上膘格,老公的妹妹穿的比我還像新娘峭范。我一直安慰自己,他們只是感情好瘪贱,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布纱控。 她就那樣靜靜地躺著,像睡著了一般菜秦。 火紅的嫁衣襯著肌膚如雪甜害。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天喷户,我揣著相機與錄音唾那,去河邊找鬼访锻。 笑死褪尝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的期犬。 我是一名探鬼主播河哑,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼龟虎!你這毒婦竟也來了璃谨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤鲤妥,失蹤者是張志新(化名)和其女友劉穎佳吞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉安,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡底扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贡耽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衷模。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒲赂,靈堂內(nèi)的尸體忽然破棺而出阱冶,到底是詐尸還是另有隱情,我是刑警寧澤滥嘴,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布木蹬,位于F島的核電站,受9級特大地震影響若皱,放射性物質(zhì)發(fā)生泄漏镊叁。R本人自食惡果不足惜有梆,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望意系。 院中可真熱鬧泥耀,春花似錦、人聲如沸蛔添。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迎瞧。三九已至夸溶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凶硅,已是汗流浹背缝裁。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留足绅,地道東北人捷绑。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像氢妈,于是被迫代替她去往敵國和親粹污。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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