Hyperledger Fabric Samples在Mac部署、運行

Hyperledger Fabric 整理體系:

?以下操作在fabric-samples 1.4.4版本上進行。

第一步

?下載bin目錄 hyperledger fabric,拷貝到fabric-sample目錄下。

  • configtxgen:生成初始區塊及通道交易配置文件的工具;
  • cryptogen:生成組織結構及相應的身份文件的工具;
  • configtxlator:將指定的文件在二進制格式與json格式之間進行切換

構建第一個網絡

?構建你的第一個網絡(build your first network - BYFN),提供了一個fabric網絡示例。該示例網絡由兩個組織組成,每個組織維護兩個節點,默認使用solo共識服務。

  1. 切換到first-network目錄
  2. 生成證書及創世區塊
./byfn.sh generate

?運行該命令會為fabric網絡各種實體生成所需的證書和秘鑰,保存在crypto-config目錄下。
ordererOrganizations子目錄下包括構成Orderer組織的身份信息
peerOrganizations子目錄為所有Peer節點組織的相關身份信息,其中最關鍵的是MSP目錄,代表了實體的身份信息。一般包括

  • admincerts:管理員的身份證書文件
  • cacerts:信任的根證書文件
  • keystore:節點的簽名,私鑰文件
  • signcerts:節點的簽名,身份證書文件
  • tlscacerts:TLS連接用的證書
  • intermediatercerts:信任的中間證書
  • crls:證書撤銷列表
  • config.yaml:記錄OrganizationalUnitldentifiers信息,包括跟證書位置和ID信息
$ tree crypto-config -L 4 -d
crypto-config
├── ordererOrganizations
│   └── example.com
│       ├── ca
│       ├── msp
│       │   ├── admincerts
│       │   ├── cacerts
│       │   └── tlscacerts
│       ├── orderers
│       │   └── orderer.example.com
│       ├── tlsca
│       └── users
│           └── Admin@example.com
└── peerOrganizations
    ├── org1.example.com
    │   ├── ca
    │   ├── msp
    │   │   ├── admincerts
    │   │   ├── cacerts
    │   │   └── tlscacerts
    │   ├── peers
    │   │   ├── peer0.org1.example.com
    │   │   └── peer1.org1.example.com
    │   ├── tlsca
    │   └── users
    │       ├── Admin@org1.example.com
    │       └── User1@org1.example.com
    └── org2.example.com
        ├── ca
        ├── msp
        │   ├── admincerts
        │   ├── cacerts
        │   └── tlscacerts
        ├── peers
        │   ├── peer0.org2.example.com
        │   └── peer1.org2.example.com
        ├── tlsca
        └── users
            ├── Admin@org2.example.com
            └── User1@org2.example.com

?如果報錯:cryptogen tool not found. exiting
解決方案:拉取fabric 1.4,拷貝fabric/scripts/bootstrap.sh文件到fabric-samples目錄下,直接執行該腳本。最后會生成所需bin目錄。

2.1 與組織結構和身份證書關聯的配置文件
?生成過程中依賴cryto-config.yaml配置文件,包括如下內容:

OrdererOrgs:   
 - Name: Orderer    # 組織名稱
   Domain: example.com    # 域名
   Specs:
     - Hostname: orderer    # hostname + Domain的值組成Orderer節點的完整域名

PeerOrgs:
 - Name: Org1
   Domain: org1.example.com
   EnableNodeOUs: true        # 在msp下生成config.yaml文件
   Template:
     Count: 2     # 節點數量
   Users:
     Count: 1     # 新增用戶數量

 - Name: Org2
   Domain: org2.example.com
   EnableNodeOUs: true
   Template:
     Count: 2
   Users:
     Count: 1
  1. 啟動網絡
./byfn.sh up

日志詳情:日志總結
逐步詳解:byfn 手動創建

?fabric-sample-1.4.0版本在執行first-network時,會出現一些問題,切換到1.4.4版本就OK。

2019-11-20 09:31:53.970 UTC [main] InitCmd -> ERRO 001 Cannot run peer because cannot init crypto, folder "/Users/macserver/Documents/BlockChain/src/github.com/hyperledger/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" does not exist
!!!!!!!!!!!!!!! Channel creation failed !!!!!!!!!!!!!!!!
========= ERROR !!! FAILED to execute End-2-End Scenario ===========

3.1 關聯的docker-compose-base.yaml文件

services:
  orderer.example.com:
    container_name: orderer.example.com
    image: hyperledger/fabric-orderer:$IMAGE_TAG
    environment:
      - ORDERER_GENERAL_LOGLEVEL=INFO  # 日志級別
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0  # 監聽地址
      - ORDERER_GENERAL_GENESISMETHOD=file  # 生成初始區塊的提供方式
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block  # 初始區塊配置文件路徑
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP  # 本地MSP ID
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp  # 本地MSP路徑
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true  # 開啟TLS驗證
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key  # TLS 私鑰
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt  # TLS 證書
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]  # TLS 根證書
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric  # 進入容器后,默認工作目錄
    command: orderer
    volumes:
    - ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block  # 初始區塊配置文件
    - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp  # MSP目錄
    - ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls  # TLS目錄
    - orderer.example.com:/var/hyperledger/production/orderer
    ports:
      - 7050:7050

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:   # 基本信息來源于哪個文件
      file: peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
    volumes:
        - /var/run/:/host/var/run/
        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
        - ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
        - peer0.org1.example.com:/var/hyperledger/production
    ports:
      - 7051:7051
      - 7053:7053

3.2 關聯的peer-base.yaml文件

services:
  peer-base:
    image: hyperledger/fabric-peer:$IMAGE_TAG
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
      - CORE_LOGGING_LEVEL=INFO  # 日志級別
      - CORE_PEER_TLS_ENABLED=true  # 是否開啟TLS驗證
      - CORE_PEER_GOSSIP_USELEADERELECTION=true  # 是否采用leader選舉
      - CORE_PEER_GOSSIP_ORGLEADER=false  # 是否將當前節點設為leader
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt  # TLS 證書文件
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key  # TLS 秘鑰文件
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt  # TLS 根證書文件
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer  # 進入容器默認工作目錄
    command: peer node start   # 容器啟動命令

?

第一個簡單應用:fabcar

  1. 在fabcar目錄下執行腳本,啟動網絡:
./startFabric.sh

日志詳情:日志總結

1.1 configtx.yaml配置文件

Organizations:
    - &OrdererOrg   # 組織
        Name: OrdererOrg  # 組織的名稱
        ID: OrdererMSP  # 組織ID
        MSPDir: crypto-config/ordererOrganizations/example.com/msp  # MSP路徑

    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Orderer: &OrdererDefaults
    OrdererType: solo  # 共識排序服務的實現方式,有兩種選擇(solo和kafka)
    Addresses:
        - orderer.example.com:7050  # orderer節點的服務地址和端口號

    BatchTimeout: 2s
    BatchSize:    # 批處理大小,如最大交易數量,最大字節數及建議字節數
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB

    Kafka:
        Brokers:
            - 127.0.0.1:9092

    Organizations:

Profiles:
    TwoOrgsOrdererGenesis:  # 生成Orderer服務的初始區塊文件,
        Capabilities:  # 通道的權限信息
            <<: *ChannelCapabilities
        Orderer:  # Orderer服務的信息及權限信息
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:  # 聯盟組成成員
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:  # 生成應用通道交易配置文件
        Consortium: SampleConsortium  # 聯盟信息
        Application:  # 組織及權限信息
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
            Capabilities:
                <<: *ApplicationCapabilities
  1. 在javascript文件內,運行腳本實現用戶、數據更新或查詢:
# 安裝環境
npm install
# 加入管理員 admin
node enrollAdmin
# 注冊新用戶 user1
node registerUser
# 查詢所有車輛信息
node query.js
# 插入新的車輛信息,car12
node invoke
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容