1. 程式人生 > >HyperLeger Fabric SDK開發(二)——Fabric SDK配置

HyperLeger Fabric SDK開發(二)——Fabric SDK配置

HyperLeger Fabric SDK開發(二)——Fabric SDK配置

一、Fabric SDK配置

Fabric區塊鏈網路應用程式需要大量的引數,用於連線Fabric區塊鏈網路。通常將Fabric區塊鏈網路應用程式所需的引數放到一個配置檔案進行管理,配置檔案定義Fabric SDK Go的配置和使用者自定義引數,指定了連線Fabric區塊鏈網路所需的全部資訊,例如Fabric區塊鏈網路元件的主機名和埠等。Fabric SDK GO為應用程式提供的配置檔案通常使用yaml檔案格式編寫,並命名為config.yaml,配置檔案會在應用程式程式碼中被讀取。
Fabric SDK Go版本提供了config.yaml模板,開發者可以參考
fabric-sdk-go/pkg/core/config/testdata/template/config.yaml,也可以根據fabric-sdk-go/test/fixtures/config/config_e2e.yaml例項進行改寫。

二、version定義

version用於定義config.yaml檔案內容的版本,Fabric SDK Go會使用version匹配相應的解析規則。
version: 1.0.0

三、channels定義

channels部分描述已經存在的通道資訊,每個通道包含哪些orderer、peer 。
peer部分可以定義peer節點的角色屬性,角色如下:
endorsingPeer:可選。peer節點節點必須安裝鏈碼。peer節點是否會被髮送交易提案進行背書。應用程式也可以使用本屬性來決定傳送鏈碼安裝請求到哪個peer節點。預設值:true。
chaincodeQuery:可選。peer節點必須安裝鏈碼。peer節點是否會被髮送交易提案只進行查詢。應用程式還可以使用本屬性來決定傳送鏈碼安裝的請求到哪個peer節點。預設值:true。
ledgerQuery:可選。是否可以向peer節點發送不會進行鏈碼查詢的提案,如queryBlock(),queryTransaction()等。預設值:true。
eventSource:可選。peer節點是否為SDK事件監聽器註冊的目標,所有的peer節點都可以生產事件,但通常只需要連線一個對事件進行監聽。預設值:true。

# 如果應用程式建立了通道,不需要本部分
channels:
  # 如果沒有定義channel配置或是定義的channel沒有資訊,使用預設channel
  # 如果channel沒有定義peers,使用預設channel的peers
  # 如果channel沒有定義orderes,使用預設channel的orderes
  # 如果channel沒有定義背書策略,使用預設channel的背書策略
  # 如果channel定義了背書策略,但某些背書策略缺失,缺失的背書策略會被預設channel填充
  _default:
    # 可選,參與組織的peers列表
    peers:
      peer1.org1.example.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true

    # 可選,應用程式使用下列選項執行通道操作,如獲取通道配置
    policies:
      #可選,獲取通道配置區塊
      queryChannelConfig:
        #可選,成功響應節點的最小數量
        minResponses: 1
        # 可選
        maxTargets: 1
        # 可選,查詢配置區塊的重試選項
        retryOpts:
          # 可選,重試次數
          attempts: 5
          # 可選, 第一次重試的後退間隔
          initialBackoff: 500ms
          # 可選, 重試的最大後退間隔
          maxBackoff: 5s
          backoffFactor: 2.0
      # 可選,獲取發現資訊選項
      discovery:
        maxTargets: 2
        # 重試選項
        retryOpts:
          # 可選,重試次數
          attempts: 4
          initialBackoff: 500ms
          maxBackoff: 5s
          backoffFactor: 2.0

      # 可選,事件服務選項
      eventService:
        # 可選 resolverStrategy指定連線到peer節點時選擇peer節點的決策策略
        # 可選值:PreferOrg(預設), MinBlockHeight, Balanced
        # PreferOrg:
        #   基於區塊高度滯後閥值決定哪些peer節點是合適的, 雖然會在當前組織中優先選擇peer節點
        #   如果當前組織中沒有合適的peer節點,會從其它組織中選取
        # MinBlockHeight:
        #   根據區塊高度滯後閥值選擇最好的peer節點,
        #   所有peer節點的最大區塊高度是確定的,區塊高度小於最大區塊高度但在滯後閥值範圍內的peer節點會被載入,
        #   其它peer節點不會被考慮。
        # Balanced:
        #   使用配置的balancer選擇peer節點
        resolverStrategy: PreferOrg

        # 可選 balancer是選擇連線到peer節點的負載均衡器
        # 可選值: Random (default), RoundRobin
        balancer: Random

        # 可選,blockHeightLagThreshold設定區塊高度滯後閥值,用於選擇連線到的peer節點
        # 如果一個peer節點滯後於最新的peer節點給定的區塊數,會被排除在選擇之外
        # 注意:當minBlockHeightResolverMode設定為ResolveByThreshold時,本引數才可用
        # 預設: 5
        blockHeightLagThreshold: 5

        # 可選,reconnectBlockHeightLagThreshold - 如果peer節點的區塊高度落後於指定的區塊數量,
        # 事件客戶端會從peer節點斷開,重新連線到一個性能更好的peer節點
        # 如果peerMonitor設定為啟用(預設),本引數才可用
        # 預設值: 10
        # 注意:設定值太低會導致事件客戶端頻繁斷開或重連,影響效能
        reconnectBlockHeightLagThreshold: 8

        # 可選, peerMonitorPeriod是事件客戶端從連線節點斷開重新連線到另外一個節點的時間
        # 預設: 對於Balanced resolverStrategy禁用,為0; 對於PreferOrg和MinBlockHeight為5s
        peerMonitorPeriod: 6s

  #如果_default沒有定義,必選;如果_default已經定義,可選。
  # 通道名稱
  assetchannel:
    # 如果_default peers沒有定義,必選;如果_default peers已經定義,可選。
    # 參與組織的peer節點列表
    peers:
      peer0.org1.example.com:
        # 可選。peer節點是否會被髮送交易提議只進行查詢。peer節點必須安裝鏈碼。
        # 應用程式還可以使用本屬性來決定傳送鏈碼安裝的請求到哪個peer節點。預設值:true
        endorsingPeer: true

        # 可選。peer節點必須安裝鏈碼。peer節點是否會被髮送交易提案只進行查詢。
        # 應用程式還可以使用本屬性來決定傳送鏈碼安裝的請求到哪個peer節點。預設值:true
        chaincodeQuery: true

        # 可選。是否可以向peer節點發送不會進行鏈碼查詢的提案,如queryBlock(),
        # queryTransaction()等。預設值:true。
        ledgerQuery: true

        # 可選。peer節點是否為SDK事件監聽器註冊的目標,所有的peer節點都可以生產事件,
        # 但通常只需要連線一個對事件進行監聽。預設值:true。
        eventSource: true

四、organizations定義

organizations描述peer節點所屬的組織(org),證書頒發機構,以及組織的MSP ID。

# Fabric區塊鏈網路中參與的組織列表
organizations:
  org1:
    mspid: Org1MSP
    # 組織的MSP儲存位置,絕對路徑或相對cryptoconfig的路徑
    cryptoPath:  peerOrganizations/org1.example.com/users/{username}@org1.example.com/msp
    peers:
      - peer0.org1.example.com
      - peer1.org1.example.com
    # 可選,證書頒發機構簽發×××明,Fabric-CA是一個特殊的證書管理機構,提供REST API支援動態證書管理,如登記、撤銷、重新登記
    # 下列部分只為Fabric-CA伺服器設定
    certificateAuthorities:
      - ca.org1.example.com

  org2:
    mspid: Org2MSP

    # 組織的MSP儲存位置,相對於cryptoconfig的相對位置或絕對路徑
    cryptoPath:  peerOrganizations/org2.example.com/users/{username}@org2.example.com/msp
    peers:
      - peer0.org2.example.com
    certificateAuthorities:
      - ca.org2.example.com

  # Orderer組織名稱
  ordererorg:
      # 組織的MSPID
      mspID: OrdererMSP
      # 載入使用者需要的金鑰和證書,絕對路徑或相對路徑
      cryptoPath: ordererOrganizations/example.com/users/{username}@example.com/msp

五、orderers定義

orderers必須指定要連線的Hyperledger Fabric區塊鏈網路中所有orderder節點的主機名和埠。orderers物件可以包含多個orderder節點。

# 傳送交易請求或通道建立、更新請求到的orderers列表
# 如果定義了超過一個orderer,SDK使用哪一個orderer由程式碼實現時指定
orderers:
  # orderer節點,可以定義多個
  orderer.example.com:
    url: orderer.example.com:7050
    # 以下屬性由gRPC庫定義,會被傳遞給gRPC客戶端建構函式
    grpcOptions:
      ssl-target-name-override: orderer.example.com
      # 下列引數用於設定伺服器上的keepalive策略,不相容的設定會導致連線關閉
      # 當keep-alive-time被設定為0或小於啟用客戶端的引數,下列引數失效
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false

    tlsCACerts:
      # 證書的絕對路徑
      path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem

六、peers定義

peers必須指定Hyperledger Fabric區塊鏈網路中所有peer節點的主機名和埠,可能會在其它地方引用,如channels,organizations等部分。

# peers節點列表
peers:
  # peer節點定義,可以定義多個
  peer0.org1.example.com:
    # URL用於傳送背書和查詢請求
    url: peer0.org1.example.com:7051

    grpcOptions:
      ssl-target-name-override: peer0.org1.example.com
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false

    tlsCACerts:
      # 證書的絕對路徑
      path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem

七、certificateAuthorities定義

certificateAuthorities必須在Hyperledger Fabric區塊鏈網路中指定證書頒發機構(CA)的主機名和埠,以便用於註冊現有使用者和註冊新使用者。

# Fabric-CA是Hyperledger Fabric提供了特殊的證書頒發機構,可以通過REST API管理證書。
# 應用程式可以選擇使用一個標準的證書頒發機構代替Fabric-CA,此時本部分不需要指定
certificateAuthorities:
  # CA機構,可以定義多個
  ca.org1.example.com:
    url: https://ca.org1.example.com:7054
    tlsCACerts:
      # Comma-Separated list of paths
      path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
      # 客戶端和Fabric CA進行SSL握手的金鑰和證書
      client:
        key:
          path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.key
        cert:
          path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.crt

    # Fabric-CA支援通過REST API進行動態使用者註冊
    registrar:
      enrollId: admin
      enrollSecret: adminpw
    # 可選,CA機構名稱
    caName: ca.org1.example.com

八、client

client部分必需定義,客戶端應用程式代表誰來和Fabric區塊鏈網路來互動,可以定義超時選項。

#客戶端定義
client:
  # 客戶端所屬的組織,必須是organizations定義的組織
  organization: org1
  #定義日誌服務
  logging:
    level: debug #debug級別

  # peer、事件服務、orderer超時的全域性配置
  # 本部分如果忽略,使用下列的值作為預設值
  peer:
    timeout:
      connection: 10s
      response: 180s
      discovery:
        greylistExpiry: 10s
  eventService:
    timeout:
      registrationResponse: 15s
  orderer:
    timeout:
      connection: 15s
      response: 15s
  global:
    timeout:
      query: 180s
      execute: 180s
      resmgmt: 180s
    cache:
      connectionIdle: 30s
      eventServiceIdle: 2m
      channelConfig: 30m
      channelMembership: 30s
      discovery: 10s
      selection: 10m

  # MSP根目錄
  cryptoconfig:
    path: ${GOPATH}/src/github.com/hyperledger/fabric/AssetExchange/deploy/crypto-config

  # 某些SDK支援外掛化的KV資料庫, 通過指定credentialStore屬性實現
  credentialStore:
    # 可選,用於使用者證書材料儲存,如果所有的證書材料被嵌入到配置檔案,則不需要
    path: "/tmp/state-store"

    # 可選,指定Go SDK實現的CryptoSuite實現
    cryptoStore:
      # 指定用於加密金鑰儲存的底層KV資料庫
      path: /tmp/msp

   # 客戶端的BCCSP模組配置
  BCCSP:
    security:
     enabled: true
     default:
      provider: "SW"
     hashAlgorithm: "SHA2"
     softVerify: true
     level: 256

  tlsCerts:
    # 可選,當連線到peers,orderes時使用系統證書池,預設為false
    systemCertPool: true

    # 可選,客戶端和peers與orderes進行TLS握手的金鑰和證書
    client:
      key:
        path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.key
      cert:
        path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.crt

九、config.yaml示例

資產交易平臺應用的配置檔案如下:

# Copyright SecureKey Technologies Inc. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
#
# The network connection profile provides client applications the information about the target
# blockchain network that are necessary for the applications to interact with it. These are all
# knowledge that must be acquired from out-of-band sources. This file provides such a source.

name: "assetchannel"

#
# Describe what the target network is/does.
#
description: "asset exchange network"

#指定版本
version: 1.0.0

#客戶端定義
client:
  # 客戶端所屬的組織,必須是organizations定義的組織
  organization: org1
  #定義日誌服務
  logging:
    level: debug #debug級別

  # MSP根目錄
  cryptoconfig:
    path: ${GOPATH}/src/github.com/hyperledger/fabric/AssetExchange/deploy/crypto-config

  # 某些SDK支援外掛化的KV資料庫, 通過指定credentialStore屬性實現
  credentialStore:
    # 可選,用於使用者證書材料儲存,如果所有的證書材料被嵌入到配置檔案,則不需要
    path: "/tmp/state-store"

    # 可選,指定Go SDK實現的CryptoSuite實現
    cryptoStore:
      # 指定用於加密金鑰儲存的底層KV資料庫
      path: /tmp/msp

   # 客戶端的BCCSP模組配置
  BCCSP:
    security:
     enabled: true
     default:
      provider: "SW"
     hashAlgorithm: "SHA2"
     softVerify: true
     level: 256

  tlsCerts:
    # 可選,當連線到peers,orderes時使用系統證書池,預設為false
    systemCertPool: true

    # 可選,客戶端和peers與orderes進行TLS握手的金鑰和證書
    client:
      key:
        # path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.key
      cert:
        #path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/tls.example.com/users/[email protected]/tls/client.crt

# 如果應用程式建立了通道,不需要本部分
channels:
  # 如果沒有定義channel配置或是定義的channel沒有資訊,使用預設channel
  # 如果channel沒有定義peers,使用預設channel的peers
  # 如果channel沒有定義orderes,使用預設channel的orderes
  # 如果channel沒有定義背書策略,使用預設channel的背書策略
  # 如果channel定義了背書策略,但某些背書策略缺失,缺失的背書策略會被預設channel填充

  #如果_default沒有定義,必選;如果_default已經定義,可選。
  # 通道名稱
  assetchannel:
    # 如果_default peers沒有定義,必選;如果_default peers已經定義,可選。
    # 參與組織的peer節點列表
    peers:
      peer0.org1.example.com:
        # 可選。peer節點是否會被髮送交易提議只進行查詢。peer節點必須安裝鏈碼。
        # 應用程式還可以使用本屬性來決定傳送鏈碼安裝的請求到哪個peer節點。預設值:true
        endorsingPeer: true

        # 可選。peer節點必須安裝鏈碼。peer節點是否會被髮送交易提案只進行查詢。
        # 應用程式還可以使用本屬性來決定傳送鏈碼安裝的請求到哪個peer節點。預設值:true
        chaincodeQuery: true

        # 可選。是否可以向peer節點發送不會進行鏈碼查詢的提案,如queryBlock(),
        # queryTransaction()等。預設值:true。
        ledgerQuery: true

        # 可選。peer節點是否為SDK事件監聽器註冊的目標,所有的peer節點都可以生產事件,
        # 但通常只需要連線一個對事件進行監聽。預設值:true。
        eventSource: true
        # 可選,應用程式使用下列選項執行通道操作,如獲取通道配置
    policies:
      #可選,獲取通道配置區塊
      queryChannelConfig:
        #可選,成功響應節點的最小數量
        minResponses: 1
        # 可選
        maxTargets: 1
        # 可選,查詢配置區塊的重試選項
        retryOpts:
          # 可選,重試次數
          attempts: 5
          # 可選, 第一次重試的後退間隔
          initialBackoff: 500ms
          # 可選, 重試的最大後退間隔
          maxBackoff: 5s
          backoffFactor: 2.0

# Fabric區塊鏈網路中參與的組織列表
organizations:
  org1:
    mspid: Org1MSP
    # 組織的MSP儲存位置,絕對路徑或相對cryptoconfig的路徑
    cryptoPath:  peerOrganizations/org1.example.com/users/{username}@org1.example.com/msp
    peers:
      - peer0.org1.example.com
      - peer1.org1.example.com
    # 可選,證書頒發機構簽發×××明,Fabric-CA是一個特殊的證書管理機構,提供REST API支援動態證書管理,如登記、撤銷、重新登記
    # 下列部分只為Fabric-CA伺服器設定
    certificateAuthorities:
      #- ca.org1.example.com

  # Orderer組織名稱
  ordererorg:
      # 組織的MSPID
      mspID: OrdererMSP
      # 載入使用者需要的金鑰和證書,絕對路徑或相對路徑
      cryptoPath: ordererOrganizations/example.com/users/{username}@example.com/msp

# 傳送交易請求或通道建立、更新請求到的orderers列表
# 如果定義了超過一個orderer,SDK使用哪一個orderer由程式碼實現時指定
orderers:
  # orderer節點,可以定義多個
  orderer.example.com:
    url: orderer.example.com:7050
    # 以下屬性由gRPC庫定義,會被傳遞給gRPC客戶端建構函式
    grpcOptions:
      ssl-target-name-override: orderer.example.com
      # 下列引數用於設定伺服器上的keepalive策略,不相容的設定會導致連線關閉
      # 當keep-alive-time被設定為0或小於啟用客戶端的引數,下列引數失效
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false

    tlsCACerts:
      # 證書的絕對路徑
      # path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem

# peers節點列表
peers:
  # peer節點定義,可以定義多個
  peer0.org1.example.com:
    # URL用於傳送背書和查詢請求
    url: peer0.org1.example.com:7051

    grpcOptions:
      ssl-target-name-override: peer0.org1.example.com
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false

    tlsCACerts:
      # 證書的絕對路徑
      #path: ${GOPATH}/src/github.com/hyperledger/fabric-sdk-go/${CRYPTOCONFIG_FIXTURES_PATH}/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem