hyperledge工具-configtxgen


參考http://www.blockchainbrother.com/article/1339

configtxgen是Hyperledger Fabric提供的用於通道配置的實用程序,主要生成以下3種文件:

  • 排序服務節點使用的創世區塊;
  • 創建通道使用的通道配置交易;
  • 更新通道用的錨節點交易。

目前,該工具主要側重於生成排序服務節點的創世區塊,但是將來預計增加生成新通道的配置以及重新配置已有的通道。

 

1.編譯生成該configtxgen工具的方法與cryptogen相似,有兩種辦法:

該工具的源碼在github.com/hyperledger/fabric/common/tools/configtxgen
1)在github.com/hyperledger/fabric目錄下運行:

vagrant@ubuntu-xenial:/opt/gopath/src/github.com/hyperledger/fabric$ configtxgen --help
configtxgen: command not found
vagrant@ubuntu-xenial:/opt/gopath/src/github.com/hyperledger/fabric$ make configtxgen
.build/bin/configtxgen
CGO_CFLAGS=" " GOBIN=/opt/gopath/src/github.com/hyperledger/fabric/.build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/tools/configtxgen/metadata.CommitSHA=325999f" github.com/hyperledger/fabric/common/tools/configtxgen
Binary available as .build/bin/configtxgen

然后會生成./build/bin/configtxgen可執行文件

2)在github.com/hyperledger/fabric/common/tools/configtxgen目錄下運行go build

 

2.編譯成功后查看其參數信息:

vagrant@ubuntu-xenial:/opt/gopath/src/github.com/hyperledger/fabric$ configtxgen --help
Usage of configtxgen:
  -asOrg string
      作為特定的組織(按名稱string)執行配置生成,只包括org(可能)有權設置的寫集中的值。如用來指明生成的錨節點所在的組織
  -channelCreateTxBaseProfile string
      指定一個概要文件作為orderer系統通道當前狀態,以允許在通道創建tx生成期間修改非應用程序參數。僅在與“outputCreateChannelTx”組合時有效。
  -channelID string
      在configtx中使用的通道ID,即通道名稱,默認是"testchainid"
  -configPath string
      包含要使用的配置的路徑(如果設置的話)
  -inspectBlock string
      按指定路徑打印塊中包含的配置,用於檢查和輸出通道中創世區塊的內容,錨節點在configtx.yaml中的AnchorPeers中指定
  -inspectChannelCreateTx string
      按指定路徑打印交易中包含的配置,用來檢查通道的配置交易信息
  -outputAnchorPeersUpdate string
      創建一個配置更新來更新錨節點(僅在默認通道創建時工作,並且僅在第一次更新時工作)
  -outputBlock string
      將genesis塊寫入(如果設置)的路徑。configtx.yaml文件中的Profiles要指定Consortiums,否則啟動排序服務節點會失敗
  -outputCreateChannelTx string
      將通道配置交易文件寫入(如果設置)的路徑。configtx.yaml文件中的Profiles必須包含Application,否則創建通道會失敗
  -printOrg string
      將組織的定義打印為JSON。(對於手動向通道添加組織非常有用)
  -profile string
      指定使用的是configtx.yaml中某個用於生成的Profiles配置項。(默認為“SampleInsecureSolo”)
  -version
      顯示版本信息

 

3.使用代碼分析命令:

在github.com/hyperledger/fabric-samples/first-network/byfn.sh文件中使用該工具來生成orderer genesis塊、通道配置交易和錨節點更新交易,代碼如下:

 

function generateChannelArtifacts() {
  which configtxgen
  if [ "$?" -ne 0 ]; then
    echo "configtxgen tool not found. exiting"
    exit 1
  fi

  echo "##########################################################"
  echo "#########  Generating Orderer Genesis block ##############"
  echo "##########################################################"
  # Note: For some unknown reason (at least for now) the block file can't be
  # named orderer.genesis.block or the orderer will fail to launch!
  echo "CONSENSUS_TYPE="$CONSENSUS_TYPE #查看共識類型
  set -x
  if [ "$CONSENSUS_TYPE" == "solo" ]; then
    configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  elif [ "$CONSENSUS_TYPE" == "kafka" ]; then
    configtxgen -profile SampleDevModeKafka -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  else
    set +x
    echo "unrecognized CONSESUS_TYPE='$CONSENSUS_TYPE'. exiting"
    exit 1
  fi
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate orderer genesis block..."
    exit 1
  fi
  echo
  echo "#################################################################"
  echo "### Generating channel configuration transaction 'channel.tx' ###"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate channel configuration transaction..."
    exit 1
  fi

  echo
  echo "#################################################################"
  echo "#######    Generating anchor peer update for Org1MSP   ##########"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate anchor peer update for Org1MSP..."
    exit 1
  fi

  echo
  echo "#################################################################"
  echo "#######    Generating anchor peer update for Org2MSP   ##########"
  echo "#################################################################"
  set -x
  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate \
    ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
  res=$?
  set +x
  if [ $res -ne 0 ]; then
    echo "Failed to generate anchor peer update for Org2MSP..."
    exit 1
  fi
  echo
}

 

1)首先是生成orderer創世區塊

 if [ "$CONSENSUS_TYPE" == "solo" ]; then
    configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  elif [ "$CONSENSUS_TYPE" == "kafka" ]; then
    configtxgen -profile SampleDevModeKafka -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
  else

-profile TwoOrgsOrdererGenesis : 指定使用的是configtx.yaml中Profiles配置項中的TwoOrgsOrdererGenesis配置,即:

Profiles:

    TwoOrgsOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2

 

-profile SampleDevModeKafka :指定使用的是configtx.yaml中Profiles配置項中的SampleDevModeKafka配置,即:

    SampleDevModeKafka:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: kafka
            Kafka:
                Brokers:
                - kafka.example.com:9092

            Organizations:
            - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
            - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                - *Org1
                - *Org2

-channelID byfn-sys-channel :將通道名稱命名為byfn-sys-channel

-outputBlock ./channel-artifacts/genesis.block :為生成的創世區塊文件名及保存路徑

 

2)生成通道配置交易

configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

-profile TwoOrgsChannel : 指定使用的是configtx.yaml中Profiles配置項中的TwoOrgsChannel配置,即:

    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities

-outputCreateChannelTx ./channel-artifacts/channel.tx :指明生成的通道配置交易存儲的路徑及文件名

-channelID $CHANNEL_NAME :通道名為自己設置的$CHANNEL_NAME值

3)生成組織的錨節點

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

-outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx : 為生成錨節點的更新交易文件及保存路徑-asOrg Org1MSP : 指明該錨節點所在的組織

 

除了上面的函數能夠實現的這三個功能外,configtxgen還能夠:

4)查看創世區塊信息

configtxgen -profile TwoOrgsOrdererGenesis -inspectBlock ./channel-artifacts/genesis.block

-inspectBlock ./channel-artifacts/genesis.block :指定要查看的創世區塊文件

 

5)查看通道配置交易信息

configtxgen -profile TwoOrgsChannel -inspectChannelCreateTx ./channel-artifacts/channel.tx

-inspectChannelCreateTx ./channel-artifacts/channel.tx : 指定要查看的通道配置交易信息

 

4.configtx.yaml文件

此配置文件主要分為3部分。

1)Profiles部分。它是默認的,這部分包含一些用於開發或測試場景的示例配置,這些配置涉及fabric目錄中的加密部分。configtxgen工具允許通過-profile標簽來指定配置文件。Profiles部分可以顯式聲明所有配置,但是通常都是從默認配置中繼承。

2)Organizations部分。它是默認的,這部分包含示例配置MSP定義的單一引用。對於生產部署,應該刪除這部分配置,並以新網絡成員的MSP定義來替代它。組織中每一個元素都必須帶有錨標簽,如&orgName,這些標簽可以在Profiles中部分引用。

3)默認部分。此部分是Orderer和Application的配置,包括一些屬性配置,如BatchTimeout和一般用作繼承的基礎值。

github.com/hyperledger/fabric-samples/first-network/configtx.yaml:

如果沒學過yaml,可見yaml的簡單學習

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

---
################################################################################
#
#   Section: Organizations
#
#   - 本節定義了不同的組織標識,這些標識將在稍后的配置中引用。
#
################################################################################
Organizations:

    # SampleOrg使用sampleconfig定義了一個MSP。它不應該在生產中使用,但可以用作其他定義的模板
    - &OrdererOrg
        # DefaultOrg定義了使用在fabric.git開發環境的sampleconfig中的組織
        Name: OrdererOrg

        # ID 下載MSP的ID
        ID: OrdererMSP

        # MSPDir是包含MSP配置的文件系統路徑,由cryptogen工具生成的加密材料路徑
        MSPDir: crypto-config/ordererOrganizations/example.com/msp

        # Policies定義了在這個配置樹級別的策略集
        # 對於組織策略,它們的規范路徑通常是/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('OrdererMSP.admin')"

    - &Org1
        # DefaultOrg定義了使用在fabric.git開發環境的sampleconfig中的組織
        Name: Org1MSP

        # ID 下載MSP的ID
        ID: Org1MSP

        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

        # Policies定義了在這個配置樹級別的策略集
        # 對於組織策略,它們的規范路徑通常是/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org1MSP.admin')"

        # 將此標志設置為true.
        AnchorPeers: #指明org1中使用peer0作為錨節點
            # AnchorPeers定義了可以用於跨組織gossip通信的節點的位置
            # 注意,這個值只在應用程序部分上下文的genesis塊中編碼
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        # DefaultOrg定義了使用在fabric.git開發環境的sampleconfig中的組織
        Name: Org2MSP

        # ID 來指定下載的MSP定義
        ID: Org2MSP

        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        # Policies定義了在這個配置樹級別的策略集
        # 對於組織策略,它們的規范路徑通常是/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org2MSP.admin')"

        AnchorPeers: #指明org2中使用peer0作為錨節點
            # AnchorPeers定義了可以用於跨組織gossip通信的節點的位置
            # 注意,這個值只在應用程序部分上下文的genesis塊中編碼
            - Host: peer0.org2.example.com
              Port: 9051

################################################################################
#
#   SECTION: Capabilities
#
#   - 本節定義fabric network的功能。這是v1.1.0的一個新概念,不應該在帶有v1.0.x版本orderers和peers的混合網絡中使用。
#   功能定義了fabric二進制文件中必須提供的特性,以便該二進制文件安全地參與fabric網絡。
#   例如,如果添加了新的MSP類型,較新的二進制文件可能會識別並驗證來自該類型的簽名,而沒有此支持的較老的二進制文件將無法驗證這些交易。
#   這可能導致不同版本的fabric二進制文件具有不同的世界狀態。相反,為通道定義一個功能會通知那些沒有這個功能的二進制文件,它們必須停止處理交易,直到它們被升級。
#   對於v1.0.x 版本,如果定義了任何功能(包括關閉所有功能的映射),v1.0.x版本的節點可能會故意崩潰。
#
################################################################################
Capabilities:
    # 通道功能同時適用於orderers和peers,並且必須得到雙方的支持。
    # 將功能的值設置為true以滿足需要。
    Channel: &ChannelCapabilities
        #Channel的V1.3是一個用來表示運行在V1.3.x版本上的所有orderers和peers都需要的行為的catchall標志,但這將與以前版本中的orderers和peers不兼容。
        # 在啟用V1.3通道功能之前,請確保通道上的所有orderers和peers都位於v1.3.0或更高版本。
        V1_3: true

    # Orderer功能只適用於Orderer,並且可以安全地與以前版本的節點一起使用。
    # 將功能的值設置為true以滿足需要
    Orderer: &OrdererCapabilities
        # Orderer的V1.1是一個用來表示確定被在v1.1.x中運行的所有orderers所需要的行為的catchall標志,但這與以前版本中的orderers不兼容。
        # 在啟用V1.1 orderer功能之前,請確保通道上的所有orderer都處於v1.1.0或更高版本。
        V1_1: true

    # Application功能只應用於peer網絡,並且可以安全地與以前的版本的orderers一起使用。
    # 將功能的值設置為true以滿足需要
    Application: &ApplicationCapabilities
        # Application的V1.3用來啟用新的非向后兼容特性fabric V1.3的補丁
        V1_3: true
        # Application的V1.2用來啟用新的非向后兼容特性和fabric V1.2的補丁(注意,如果設置了之后的版本的功能,則不需要設置此功能)
        V1_2: false
        # Application的V1.1啟用新的非向后兼容特性和fabric V1.1的補丁(注意,如果設置了之后的版本的功能,則不需要設置此特性)。
        # 所以這里設置是V1_3為true,另外兩個為false
        V1_1: false

################################################################################
#
#   SECTION: Application
#
#   - 本節為Application相關參數定義要編碼到配置交易或創世區塊中的值
#   注意,只有在創建channel tx時才會用Application,否則是創建區塊
#
################################################################################
Application: &ApplicationDefaults

    # Organizations是定義為網絡應用程序端參與者的組織列表
    Organizations:

    # Policies定義了在這個配置樹級別的策略集
    # 對於組織策略,它們的規范路徑通常是/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    Capabilities:
        <<: *ApplicationCapabilities
################################################################################
#
#   SECTION: Orderer
#
#   - 本節為orderer相關參數定義要編碼到配置交易或創世區塊中的值
#
################################################################################
Orderer: &OrdererDefaults

    # Orderer 類型: 要啟動的Orderer實現類型
    # 可用的類型有“solo”和“kafka”
    OrdererType: solo

    Addresses:
        - orderer.example.com:7050

    # Batch Timeout: 創建批處理之前要等待的時間
    BatchTimeout: 2s

    # Batch Size: 控制成塊的消息數量
    BatchSize:

        # Max Message Count: 批處理中允許的最大消息數
        MaxMessageCount: 10

        # Absolute Max Bytes: 批處理中允許序列化消息的絕對最大字節數。
        AbsoluteMaxBytes: 99 MB

        # Preferred Max Bytes: 批處理中允許序列化消息的首選最大字節數。
        # 大於首選最大字節的消息將導致批處理大於改值。
        PreferredMaxBytes: 512 KB

    Kafka:
        # Brokers: orderer連接到的Kafka代理的列表
        # NOTE: Use IP:port notation
        Brokers:
            - 127.0.0.1:9092

    # Organizations是組織的列表,組織被定義為網絡的orderer方的參與者
    Organizations:

    # Policies定義了在這個配置樹級別的策略集
    # 對於Orderer策略,它們的規范路徑通常是/Channel/Orderer/<PolicyName>
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        # BlockValidation指定必須包含來自orderer的哪些簽名,以便peer對其進行驗證。
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

################################################################################
#
#   CHANNEL
#
#   本節為channel相關參數定義要編碼到配置交易或創世區塊中的值
#
################################################################################
Channel: &ChannelDefaults

    # Policies定義了在這個配置樹級別的策略集
    # 對於Channel策略,它們的規范路徑通常是/Channel/<PolicyName>
    Policies:
        # 誰可能調用'Deliver' API
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        # 誰可能調用'Broadcast' API
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        # 默認,誰可能調用在這個配置級別的元素
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    # Capabilities描述通道級功能,有關詳細描述,請參閱此文件中其他部分的專用功能部分
    Capabilities:
        <<: *ChannelCapabilities

################################################################################
#
#   Profile
#
#   - 這里可以編碼不同的配置概要文件,將其指定為configtxgen工具的參數
#
################################################################################
Profiles:

    TwoOrgsOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities

    SampleDevModeKafka:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: kafka
            Kafka:
                Brokers:
                - kafka.example.com:9092

            Organizations:
            - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
            - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                - *Org1
                - *Org2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM