1. 程式人生 > >HyperLeger Fabric開發(九)——HyperLeger Fabric網路部署實戰(單機

HyperLeger Fabric開發(九)——HyperLeger Fabric網路部署實戰(單機

HyperLeger Fabric開發(九)——HyperLeger Fabric部署實戰(單機)

系統環境:RHEL 7.3作業系統Fabric release 1.3

一、crypto-config.yaml檔案

1、Orderer節點組織

(1)單節點

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer

(2)多節點

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer1
      - Hostname: orderer2
      - Hostname: orderer3

排序組織節點全限定域名為Hostname + Domain
(3)重寫全限定域名

# CommonName
# 預設值為 {{.Hostname}}.{{.Domain}}
OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer
        CommonName: myorderer.example.com

(4)替換Specs為Template配置式

# Template 使用模板定義節點
# Count 節點總數
# Start 節點下標起始值
# Hostname 全限定域名 命名格式 
# Prefix 預設 peer
# Index 取Start值 無配置從1開始自增
OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Template:
      Count: 2
      # Start: 5
      # Hostname: {{.Prefix}}{{.Index}} # default

2、Peer節點組織

# Domain 參考OrdererOrgs
# EnableNodeOUs 允許節點 OUS -> out of service
# Template 參考OrdererOrgs 可替換為Specs配置式
# Users -> Count 新增到管理員的使用者帳戶數
PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

四個節點的全限定域名為
peer0.org1.example.com
peer1.org1.example.com
peer0.org2.example.com
peer1.org2.example.com
Template Count=2表示為組織生成2套公私鑰和證書。Users Count=1表示每個Template包含的普通User(Admin不包含在計數中)數量為1,即普通使用者[email protected]

二、公私鑰、證書生成

1、公私鑰、證書簡介

Fabric中有兩種型別的公私鑰和證書,一種是給節點之前通訊安全而準備的TLS證書,另一種是使用者登入和許可權控制的使用者證書。證書本來應該是由CA來頒發,但目前只有兩個社群,所以目前暫時沒有啟用CA節點,但Fabric提供了一個crytogen工具來生成證書。

2、crypto-config.yaml檔案編寫

HyperLedger官方在fabric-samples/first-network目錄下提供了一份供cryptogen工具使用的配置檔案crypto-config.yaml,檔案包含需要生成證書和公私鑰的Orderer組織與Peer組織配置。配置檔案內容如下:

# 管理排序節點的組織
OrdererOrgs:
  # 定義第一個排序節點組織
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer

# 管理Peer節點的組織
PeerOrgs:
  # 定義第一個組織
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
  # 定義第二個組織
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

crypto-config.yaml檔案包含Orderer組織配置(包含1個Orderer)和Peer組織的配置(包含2個Peer組織org1、org2)。
Name:定義名稱
Domain與Hostname:組合構成節點的名稱,即生成的目錄名稱。
Template Count:用來指定每個org下所擁有的節點數,本例配置每個org各2個Peer。
Users Count:用來指定新增進節點的預設使用者數
使用cryptogen可以生成crypto-config.yaml檔案模板,命令如下:

cryptogen showtemplate > crypto-config.yaml

3、公私鑰、證書生成

公私鑰、證書生成命令如下:
cryptogen generate --config=./crypto-config.yaml
生成的目錄路徑為fabric-samples/first-network/crypto-config
證書代表身份,用來在實體間進行通訊以及交易的時候進行簽名與驗證身份。
檢視證書檔案(數字證書是經過CA認證過的公鑰)的標準為X.509,編碼格式為pem,以-----BEGIN開頭,以-----END結尾。X.509數字證書不但包括使用者名稱和公共金鑰,而且還包括有關該使用者的其它資訊。數字證書除了副檔名為PEM,也可以是CRT、KEY。
CRT:Certificate縮寫,PEM編碼格式。
KEY:用來存放一個公鑰或私鑰,並非X.509證書,PEM格式。
證書的預設簽名演算法為ECDSA,Hash演算法為SHA-256。Fabric中設計了三種類型證書:
登記證書(ECert):頒發給提供了註冊憑證的使用者或節點實體,長期有效。(主要就是通ECert對實體身份檢驗)
通訊證書(TLSCert):TLS證書用來保障通訊鏈路安全,控制對網路層的接入訪問,可以對遠端實體身份校驗,防止竊聽。
交易證書(TCert):頒發給使用者,控制每個交易的許可權,一般針對某個交易,短期有效。(此功能Fabric還暫未啟用)
在ChainCode裡可以通過shim API的GetCreator函式提取呼叫當前交易的客戶端的×××書,使用GO語言的pem包將證書解碼,然後使用x.509包解析證書中的資訊。
生成crypto-config目錄如下:

├── ordererOrganizations
│   └── example.com
│       ├── ca
│       │   ├── 705338b2bb55ab5ea4045260ec511cdd4adea4b268be0764e7608934ecc656d8_sk
│       │   └── ca.example.com-cert.pem
│       ├── msp
│       │   ├── admincerts
│       │   │   └── [email protected]
│       │   ├── cacerts
│       │   │   └── ca.example.com-cert.pem
│       │   └── tlscacerts
│       │       └── tlsca.example.com-cert.pem
│       ├── orderers
│       │   └── orderer.example.com
│       │       ├── msp
│       │       │   ├── admincerts
│       │       │   │   └── [email protected]
│       │       │   ├── cacerts
│       │       │   │   └── ca.example.com-cert.pem
│       │       │   ├── keystore
│       │       │   │   └── 2f0b6bbf98dd6336af2aac04066f58635a46a1d9442a5b68b84c3dce177afa10_sk
│       │       │   ├── signcerts
│       │       │   │   └── orderer.example.com-cert.pem
│       │       │   └── tlscacerts
│       │       │       └── tlsca.example.com-cert.pem
│       │       └── tls
│       │           ├── ca.crt
│       │           ├── server.crt
│       │           └── server.key
│       ├── tlsca
│       │   ├── eb30f77a962408e9d068452478556ff937941ac737d354871cf464a8e7986842_sk
│       │   └── tlsca.example.com-cert.pem
│       └── users
│           └── [email protected]
│               ├── msp
│               │   ├── admincerts
│               │   │   └── [email protected]
│               │   ├── cacerts
│               │   │   └── ca.example.com-cert.pem
│               │   ├── keystore
│               │   │   └── ef96219b1fd2fb9f5e35ef0e78395bd5b7d6658c0f42676905f2bca21a3f57d4_sk
│               │   ├── signcerts
│               │   │   └── [email protected]
│               │   └── tlscacerts
│               │       └── tlsca.example.com-cert.pem
│               └── tls
│                   ├── ca.crt
│                   ├── client.crt
│                   └── client.key
└── peerOrganizations
├── org1.example.com
│   ├── ca
│   │   ├── 9bdc3eb7bf1c0c8ca37ef2308bf3ba4279f6c6434bc6f75feedc66c7d8ceffb4_sk
│   │   └── ca.org1.example.com-cert.pem
│   ├── msp
│   │   ├── admincerts
│   │   │   └── [email protected]
│   │   ├── cacerts
│   │   │   └── ca.org1.example.com-cert.pem
│   │   ├── config.yaml
│   │   └── tlscacerts
│   │       └── tlsca.org1.example.com-cert.pem
│   ├── peers
│   │   ├── peer0.org1.example.com
│   │   │   ├── msp
│   │   │   │   ├── admincerts
│   │   │   │   │   └── [email protected]
│   │   │   │   ├── cacerts
│   │   │   │   │   └── ca.org1.example.com-cert.pem
│   │   │   │   ├── config.yaml
│   │   │   │   ├── keystore
│   │   │   │   │   └── b5549b156ed07dd8484234a1247c83dd03b5f0711f5c287eb9412780e244c59c_sk
│   │   │   │   ├── signcerts
│   │   │   │   │   └── peer0.org1.example.com-cert.pem
│   │   │   │   └── tlscacerts
│   │   │   │       └── tlsca.org1.example.com-cert.pem
│   │   │   └── tls
│   │   │       ├── ca.crt
│   │   │       ├── server.crt
│   │   │       └── server.key
│   │   └── peer1.org1.example.com
│   │       ├── msp
│   │       │   ├── admincerts
│   │       │   │   └── [email protected]
│   │       │   ├── cacerts
│   │       │   │   └── ca.org1.example.com-cert.pem
│   │       │   ├── config.yaml
│   │       │   ├── keystore
│   │       │   │   └── 8fd0ffd3b475955a61de020f3174f31edd509749ee01a1caf4565e99d515dc08_sk
│   │       │   ├── signcerts
│   │       │   │   └── peer1.org1.example.com-cert.pem
│   │       │   └── tlscacerts
│   │       │       └── tlsca.org1.example.com-cert.pem
│   │       └── tls
│   │           ├── ca.crt
│   │           ├── server.crt
│   │           └── server.key
│   ├── tlsca
│   │   ├── 9a4a1c0f9bb06e6f4f08e94bddc6a69adf2426de9d0c19c1f0d5223d69e5b9a5_sk
│   │   └── tlsca.org1.example.com-cert.pem
│   └── users
│       ├── [email protected]
│       │   ├── msp
│       │   │   ├── admincerts
│       │   │   │   └── [email protected]
│       │   │   ├── cacerts
│       │   │   │   └── ca.org1.example.com-cert.pem
│       │   │   ├── keystore
│       │   │   │   └── f97f63bb97d902e3a444b28cd344f9196d0a03793e380162bc1e415fc7dba64c_sk
│       │   │   ├── signcerts
│       │   │   │   └── [email protected]
│       │   │   └── tlscacerts
│       │   │       └── tlsca.org1.example.com-cert.pem
│       │   └── tls
│       │       ├── ca.crt
│       │       ├── client.crt
│       │       └── client.key
│       └── [email protected]
│           ├── msp
│           │   ├── admincerts
│           │   │   └── [email protected]
│           │   ├── cacerts
│           │   │   └── ca.org1.example.com-cert.pem
│           │   ├── keystore
│           │   │   └── 88e6d225882f7d162f48108c0a7181d6f56984764a990618a0dd2607f2a18488_sk
│           │   ├── signcerts
│           │   │   └── [email protected]
│           │   └── tlscacerts
│           │       └── tlsca.org1.example.com-cert.pem
│           └── tls
│               ├── ca.crt
│               ├── client.crt
│               └── client.key
└── org2.example.com
├── ca
│   ├── b5116bb58cd2927a0e2d64c40646f26bd5759ea96e65e30473c92aecadabd868_sk
│   └── ca.org2.example.com-cert.pem
├── msp
│   ├── admincerts
│   │   └── [email protected]
│   ├── cacerts
│   │   └── ca.org2.example.com-cert.pem
│   ├── config.yaml
│   └── tlscacerts
│       └── tlsca.org2.example.com-cert.pem
├── peers
│   ├── peer0.org2.example.com
│   │   ├── msp
│   │   │   ├── admincerts
│   │   │   │   └── [email protected]
│   │   │   ├── cacerts
│   │   │   │   └── ca.org2.example.com-cert.pem
│   │   │   ├── config.yaml
│   │   │   ├── keystore
│   │   │   │   └── 1afc87575ab9ea9a55d245c6635a4282ce3f190d05ebb2aac4826723321b792b_sk
│   │   │   ├── signcerts
│   │   │   │   └── peer0.org2.example.com-cert.pem
│   │   │   └── tlscacerts
│   │   │       └── tlsca.org2.example.com-cert.pem
│   │   └── tls
│   │       ├── ca.crt
│   │       ├── server.crt
│   │       └── server.key
│   └── peer1.org2.example.com
│       ├── msp
│       │   ├── admincerts
│       │   │   └── [email protected]
│       │   ├── cacerts
│       │   │   └── ca.org2.example.com-cert.pem
│       │   ├── config.yaml
│       │   ├── keystore
│       │   │   └── 73ebe67ce05bcd196850adc3b8d8396d61574e5668005f932d26073d6bde8bf5_sk
│       │   ├── signcerts
│       │   │   └── peer1.org2.example.com-cert.pem
│       │   └── tlscacerts
│       │       └── tlsca.org2.example.com-cert.pem
│       └── tls
│           ├── ca.crt
│           ├── server.crt
│           └── server.key
├── tlsca
│   ├── b9c54fa6859f886073a928786d541b7a885c5238b0d117d3aafb7989a1172471_sk
│   └── tlsca.org2.example.com-cert.pem
└── users
├── [email protected]
│   ├── msp
│   │   ├── admincerts
│   │   │   └── [email protected]
│   │   ├── cacerts
│   │   │   └── ca.org2.example.com-cert.pem
│   │   ├── keystore
│   │   │   └── c52eab0380ac1bc6918893403c5ba9c076634f82b1af161740ae9cb05ff2fada_sk
│   │   ├── signcerts
│   │   │   └── [email protected]
│   │   └── tlscacerts
│   │       └── tlsca.org2.example.com-cert.pem
│   └── tls
│       ├── ca.crt
│       ├── client.crt
│       └── client.key
└── [email protected]
  ├── msp
  │   ├── admincerts
  │   │   └── [email protected]
  │   ├── cacerts
  │   │   └── ca.org2.example.com-cert.pem
  │   ├── keystore
  │   │   └── 919400ca0386ba0d44ff8d01c1636325d0c96f03766b35e4fdec3940e02e97e5_sk
  │   ├── signcerts
  │   │   └── [email protected]
  │   └── tlscacerts
  │       └── tlsca.org2.example.com-cert.pem
  └── tls
      ├── ca.crt
      ├── client.crt
      └── client.key

三、證書的結構

1、組織的證書結構

每個組織都會生成單獨的根證書。
 (1)ca
ca目錄存放組織的根證書和對應的私鑰檔案,採用EC演算法,證書為自簽名(自已簽發自己的公鑰)。組織內的實體將基於該證書作為根證書。
(2)msp
msp目錄存放代表該組織的身份資訊。
A、admincerts:存放被根證書籤名的組織管理員的身份驗證證書。
B、cacerts:存放組織的根證書,與ca目錄下的根證書檔案相同。
C、tlscacerts:用於TLS的ca證數,證書為自簽名。
(3)peers(orders)
每個Orderer或Peer節點的證書結構都是相同的,包括msp和tls目錄。
(4)tlsca
存放組織的TLS證書。
(5)users
用於存放屬於該組織的使用者實體。

2、Peer節點的證書結構

每個Orderer或Peer節點的證書結構都是相同的,包括msp和tls目錄。
(1)、msp:
admincerts:存放組織管理員的身份驗證證書,用於驗證交易簽名者是否為管理員身份。
cacerts:存放組織的根證書。
keystore:本節點的身份私鑰,用來簽名。
signcerts:驗證本節點簽名的證書,被組織根證書籤名。
tlscacerts:TLS連線用的×××書,即組織的TLS證書。
(2)、tls
存放tls相關的證書和私鑰。
ca.crt:組織的根證書。
server.crt:驗證本節點簽名的證書,被組織根證書籤名。
server.key:本節點的身份私鑰,用來簽名。

3、使用者實體的證書結構

(1)[email protected]br/>A、msp
admincerts:存放管理員×××書[email protected]
cacerts:存放組織的根證書ca.org1.example.com-cert.pem。
br/>keystore:存放本使用者的身份私鑰,用來簽名。
signcerts:存放管理員使用者的身份驗證證書[email protected],由組織根證書籤名,要放到Peer節點的msp/admincerts下才會被Peer節點認可。
tlscacerts:TLS連線用的×××書,即組織TLS證書tlsca.org1.example.com-cert.pem。
B、tls
ca.crt:組織的根證書。
client.crt: 管理員使用者的身份驗證證書,由組織根證書籤名。
br/>client.key:管理員的身份私鑰,用來簽名。
(2)[email protected]
A、msp
br/>admincerts:使用者×××書[email protected]
cacerts:存放組織的根證書ca.org1.example.com-cert.pem。
br/>keystore:本使用者的身份私鑰,用來簽名。
signcerts:使用者的身份驗證證書[email protected],由組織根證書籤名。
tlscacerts:TLS連線用的×××書,即組織TLS證書tlsca.org1.example.com-cert.pem。
B、tls
ca.crt:組織的根證書。
client.crt: 使用者的身份驗證證書,由組織根證書籤名。
client.key:使用者身份私鑰,用來簽名。

四、configtx.yaml檔案

1、configtx.yaml檔案簡介

configtx.yaml檔案定義了將要建立通道的配置資訊,通常包括以下部分:
A、Profiles:包含了通道的配置模板,通過configtxgen工具的引數 -profile來指定使用哪個模板。
B、Organizations: 定義了組織以及相應的MSP。
C、Orderer: 定義系統通道的相關配置,如排序節點地址、共識演算法。
D、Application: 定義應用通道相關配置,被Profiles引用。

2、Organization

Organizations主要定義一系列的組織結構,根據服務物件型別的不同,分為Orderer 組織和普通應用組織,Orderer型別組織包括名稱、ID、MSP目錄路徑、管理員策略等,應用型別組織還會配置錨節點資訊。Organizations所定義的組織會被Profiles部分使用。

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/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

3、Orderer

Orderer部分定義Orderer系統通道自身的配置資訊,包括Orderer型別、地址、批處理限制、Kafka資訊、最大應用通道數目等,參與到此Orderer的組織資訊。

Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050                   
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Kafka:
        Brokers:
            - 127.0.0.1:9092
    Organizations:

4、Application

Application定義應用通道相關配置,被Profiles引用。

Application: &ApplicationDefaults
    Organizations:

5、Profiles

Profiles定義了系統通道和應用通道兩種不同型別的通道。系統通道必須定義Orderer和Consortiums兩部分,應用通道必須定義Application和Consortium兩部分。

Profiles:
    TwoOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2

應用通道模板中必須包括Orderer和Consortiums資訊。
Orderer:指定Orderer系統通道自身的配置資訊,通常引用Orderer部分的定義以及Organizations部分的定義。網路啟動時,必須首先創Orderer系統通道。
Consortiums: Orderer所服務的聯盟列表。每個聯盟中組織彼此使用相同的通道建立策略,可以彼此建立應用通道。
應用通道模板中必須包括Application、Consortium資訊:
Application:指定屬於某應用通道的資訊,主要包括屬於通道的組織資訊。
Consortium:應用通道所關聯的聯盟的名稱。

6、configtx.yaml例項

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP # MSP ID
        MSPDir: crypto-config/ordererOrganizations/example.com/msp #MSP相關檔案本地路徑
    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
        AnchorPeers: #錨節點地址,用於跨組織的Gossip通訊
            - Host: peer0.org1.example.com
              Port: 7051
    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
        AnchorPeers: #錨節點地址,用於跨組織的Gossip通訊
            - Host: peer0.org2.example.com
              Port: 7051
Orderer: &OrdererDefaults
    OrdererType: solo # Orderer共識外掛型別,分solo或kafka
    Addresses:
        - orderer.example.com:7050 #服務地址
    BatchTimeout: 2s #出塊間隔
    BatchSize: #寫入區塊內的交易個數
        MaxMessageCount: 10 #一批訊息的最大個數
        AbsoluteMaxBytes: 98 MB #一批交易的最大位元組數,任何時候均不能超過
        PreferredMaxBytes: 512 KB #批量交易的建議位元組數
    Kafka:
        Brokers: #Kafka埠
            - 127.0.0.1:9092
    Organizations: #參與維護Orderer的組織,預設空

Application: &ApplicationDefaults
    Organizations: #加入到通道的組織資訊,此處為不包括任何組織

Profiles:
    TwoOrgsOrdererGenesis: #Orderer系統通道配置
        Orderer:
            <<: *OrdererDefaults #引用OrdererDefaults併合併到當前
            Organizations: #屬於Orderer通道的組織
                - *OrdererOrg 
        Consortiums: #Orderer所服務的聯盟列表
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel: #應用通道配置
        Consortium: SampleConsortium #應用通道關聯的聯盟
        Application: 
            <<: *ApplicationDefaults #引用ApplicationDefaults併合併到當前
            Organizations: #初始加入應用通道的組織
                - *Org1
                - *Org2

configtx.yaml配置檔案一般包括Profiles、Organizations、Orderer和Application四個部分。
Profiles用於配置聯盟,包括Orderer系統通道模板和應用通道模板,其中TwoOrgsOrdererGenesi為系統通道模板,TwoOrgsChannel為應用通道模板。

五、configtxgen工具

1、configtxgen主要功能

configtxgen是Fabric提供的工具,用於生成通道所需要的配置檔案。configtxgen工具以一個yaml檔案作為輸入,一般為configtx.yaml。
configtxgen主要功能如下:
A、生成啟動orderer需要的創世區塊,並支援檢查區塊內容
B、生成建立應用通道需要的配置交易,並支援檢查交易內容
C、生成錨點Peer的更新配置交易

2、configtxgen命令使用

配置選項:
-profile string:從configtx.yaml中查詢到指定的profile來生成配置,預設使用Sample-InsecureSolo
-channelID string:指定操作的通道名稱,預設是mychannel
生成選項:
-outputBlock string:將初始區塊寫入指定檔案
-outputCreateChannelTx string:將通道建立交易寫入指定檔案
-outputAnchorPeersUpdate string:建立更新錨點Peer的配置更新請求,需要同時使用-asOrg來指明組織身份
-asOrg string:以指明的組織身份執行更新配置交易(入更新錨節點)的生成,意味著寫集合中包含了該組織有許可權操作的鍵值
檢視選項:
-inspectBlock string:列印指定區塊檔案中的配置資訊
-inspectChannelCreateTx:列印通道建立交易檔案中的配置更新資訊

3、Configtxgen示例

定義好configtx.yml檔案後,需要把configtxgen工具以及msp目錄都拷貝到yaml檔案的所在的目錄下,configtxgen預設會讀取當前目錄的configtx.yaml作為輸入:
A、建立排序節點的初始區塊:
configtxgen -profile Genesis -outputBlock genesis.block
通過profile引數來指定生成yaml檔案中Profile.Genesis的配置,通過 -outputBlock引數來將區塊寫入genesis.block檔案。
B、建立應用通道mychannel的初始區塊的交易檔案channel.tx:
configtxgen -profile Channel -outputCreateChannelTx channel.tx -channelID mychannel
通過-outputCreateChannelTx引數將生成的交易寫入channel.tx檔案,通過-channelID來指定建立通道的名稱為mychannel。
C、建立配置區塊的交易檔案Org1MSPanchors.tx以更新mychannel中PeerOrg1的錨節點:
configtxgen -profile Channel -outputAnchorPeersUpdate Org1MSPanchors.tx -channelID mychannel -asOrg PeerOrg1MSP
通過-asOrg來指定使用PeerOrg1MSP身份建立配置區塊,並且通過-outputAnchorPeersUpdate引數將配置區塊寫入到檔案Org1MSPanchors.tx中。
建立配置區塊的交易檔案Org2MSPanchors.tx以更新mychannel中 PeerOrg2的錨節點:
configtxgen -profile Channel -outputAnchorPeersUpdate Org2MSPanchors.tx -channelID mychannel -asOrg PeerOrg2MSP

六、Fabric網路部署

1、生成創世區塊

生成Orderer節點啟動所需的創世區塊
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/orderer.genesis.block
通過profile引數來指定生成yaml檔案中Profile.Genesis的配置,通過 -outputBlock引數來將區塊寫入genesis.block檔案。
檢視通道配置
configtxgen -profile TwoOrgsOrdererGenesis -inspectBlock ./channel-artifacts/orderer.genesis.block

2、生成業務通道交易配置檔案

生成建立應用通道的交易配置檔案
configtxgen -profile TwoOrgsChannel -channelID assetchannel -outputCreateChannelTx ./channel-artifacts/assetchannel.tx
通過-outputCreateChannelTx引數將生成的交易寫入channel.tx檔案,通過-channelID來指定建立通道的名稱為assetchannel。
檢視配置檔案內容
configtxgen -profile TwoOrgsChannel -inspectChannelCreateTx ./channel-artifacts/assetchannel.tx

3、生成更新組織錨節點配置檔案

生成更新組織錨節點的配置資訊檔案
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID assetchannel -asOrg Org1MSP
通過-asOrg來指定使用Org1MSP身份建立配置區塊,並且通過-outputAnchorPeersUpdate引數將配置區塊寫入到檔案Org1MSPanchors.tx中。
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID assetchannel -asOrg Org2MSP
通過-asOrg來指定使用Org2MSP身份建立配置區塊,並且通過-outputAnchorPeersUpdate引數將配置區塊寫入到檔案Org2MSPanchors.tx中。

4、docker-compose.yaml檔案編寫

version: '2'

services:
  orderer.example.com:
    container_name: orderer.example.com
    image: hyperledger/fabric-orderer
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/orderer/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
    command: orderer
    volumes:
      - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/orderer
      - ./channel-artifacts/orderer.genesis.block:/etc/hyperledger/fabric/orderer.genesis.block
    ports:
      - 7050:7050

  peer:
    container_name: peer
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock # docker的服務端注入
      - CORE_LOGGING_PEER=debug
      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/msp # msp證書(節點證書)
      - CORE_LEDGER_STATE_STATEDATABASE=goleveldb # 狀態資料庫的儲存引擎(or CouchDB)
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=deploy_default# 鏈碼與Peer節點使用同一網路
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: peer node start

  peer0.org1.example.com:
    extends:
      service: peer
    container_name: peer0.org1.example.com
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
    ports:
      - 17051:7051 # grpc服務埠
      - 17053:7053 # eventhup埠
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com:/etc/hyperledger/peer
    depends_on:
      - orderer.example.com

  peer1.org1.example.com:
    extends:
      service: peer
    container_name: peer1.org1.example.com
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer1.org1.example.com
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
    ports:
      - 27051:7051 # grpc服務埠
      - 27053:7053 # eventhup埠
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com:/etc/hyperledger/peer
    depends_on:
      - orderer.example.com

  peer0.org2.example.com:
    extends:
      service: peer
    container_name: peer0.org2.example.com
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org2.example.com
      - CORE_PEER_LOCALMSPID=Org2MSP
      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
    ports:
      - 37051:7051 # grpc服務埠
      - 37053:7053 # eventhup埠
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com:/etc/hyperledger/peer
    depends_on:
      - orderer.example.com

  peer1.org2.example.com:
    extends:
      service: peer
    container_name: peer1.org2.example.com
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer1.org2.example.com
      - CORE_PEER_LOCALMSPID=Org2MSP
      - CORE_PEER_ADDRESS=peer1.org2.example.com:7051
    ports:
      - 47051:7051 # grpc服務埠
      - 47053:7053 # eventhup埠
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com:/etc/hyperledger/peer
    depends_on:
      - orderer.example.com

  cli:
    container_name: cli
    image: hyperledger/fabric-tools
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/peer/users/[email protected]/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/
    command: /bin/bash
    volumes:
        - ./channel-artifacts:/etc/hyperledger/channel-artifacts
        - ./chaincode:/opt/gopath/src/github.com/chaincode # 鏈碼路徑注入
        - ./crypto-config/peerOrganizations/org1.example.com/:/etc/hyperledger/peer

5、啟動Fabric網路

使用docker-compose啟動Fabric網路
docker-compose -f docker-compose.yaml up
如果Fabric網路啟動失敗,檢視日誌資訊,確定錯誤原因。修改docker-compose.yaml檔案後重新啟動。在啟動前需要先關閉網路,清除網路快取。
關閉所有的Docker容器
docker rm -f $(docker ps -aq)
清除網路快取
docker network prune

七、Fabric區塊鏈部署

1、建立業務通道

進入cli容器:
docker exec -it cli bash
進入/etc/hyperledger/channel-artifacts目錄:
cd /etc/hyperledger/channel-artifacts
建立業務通道:
peer channel create -o orderer.example.com:7050 -c assetchannel -f assetchannel.tx
在當前目錄下會生成assetchannel.block區塊

2、加入通道

peer channel join -b assetchannel.block

3、設定主節點

peer channel update -o orderer.example.com:7050 -c assetchannel -f Org1MSPanchors.tx

4、鏈碼安裝

安裝sacc鏈碼:
peer chaincode install -n sacc -v 1.0.0 -l golang -p github.com/chaincode/sacc

5、鏈碼例項化

peer chaincode instantiate -o orderer.example.com:7050 -C assetchannel -n sacc -l golang -v 1.0.0 -c '{"Args":["user1","100"]}'

6、鏈碼查詢

查詢使用者餘額:
peer chaincode query -n sacc -c '{"Args":["get","user1"]}' -C assetchannel
設定使用者餘額:
peer chaincode invoke -n sacc -c '{"Args":["set", "user1", "1000"]}' -C assetchannel

八、Fabric區塊鏈部署的問題

1、工程示例

HyperLeger Fabric開發(九)——HyperLeger Fabric網路部署實戰(單機
上述工程位於deploy目錄下。

2、網路名稱問題

Error: Error endorsing chaincode: rpc error: code = Unknown desc = Error starting container: API error (404): {“message”:“network deploy_default not found”}
docker–compose啟動網路時會建立一個預設網路名:[directory]_default
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=deploy_default環境變數用於指定建立的網路名稱。網路名稱在關閉網路後,清除網路快取時看到。