Hyperledger Fabric手動生成CA證書搭建Fabric網絡


之前介紹了使用官方腳本自動化啟動一個Fabric網絡,並且所有的證書都是通過官方的命令行工具cryptogen直接生成網絡中的所有節點的證書。在開發環境可以這么簡單進行,但是生成環境下還是需要我們自定義對網絡中的節點的證書進行配置。
所以在本文中,將會詳細介紹一個從手動生成證書一直到啟動網絡的整體步驟。本文只交代整體的搭建步驟。對於Fabric-Ca的講解不在本文的范圍內,將在另一篇文章中說明。
正篇文章也是根據官方的文檔進行的。但是由於官方的文檔尚未完工,也是好多沒有交代清楚的,並且有些地方是錯誤的,所以筆者也是一步一步摸索出來的,所以如果本文哪里沒有交代清楚或者錯誤的地方,希望各位批評指正。
在這里貼出官方文檔地址.

1.整體架構


架構圖直接貼過來好了:
系統架構

官方文檔采用的是多機環境,這里簡潔化一點,所有的操作都在一台機器上進行,至於多機環境,以后再補充好了。
介紹一下本文所采用的整體架構:

  1. 三個組織
    1. Org0 -> 組織0
    2. Org1 -> 組織1
    3. Org2 -> 組織2
  2. 組織中的成員
    1. Org0 一個Orderer節點,一個Org0的Admin節點
    2. Org1 兩個Peer節點,一個Org1的Admin節點,一個Org1的User節點
    3. Org2 兩個Peer節點,一個Org2的Admin節點,一個Org2的User節點
  3. 共有四台CA服務器
    1. TLS服務器 -> 為網絡中所有節點頒發TLS證書,用於通信的加密
    2. Org1的CA服務器 -> 為組織1中所有用戶頒發證書
    3. Org2的Ca服務器 -> 為組織2中所有用戶頒發證書
    4. Org0的CA服務器 -> 為組織0中所有用戶頒發證書

這里的四台CA服務器都是根服務器。彼此之間都是獨立的存在,沒有任何關系。,也就是說每一個CA服務器生成的證書在其他CA服務器都是不能用的。
介紹完之后,可以進入正題了。

1.1Fabric,Fabric-Ca安裝

本文默認讀者都是對Fabric有一定的了解的,所以一些安裝過程這里就沒有重復說明。
第一步是安裝Fabric-Ca環境,可以參考這里,這篇文章還沒有寫完,以后慢慢補,不過環境的安裝已經有說明。
還有就是Fabric的環境安裝,可以參考這里

完成環境搭建后,我們還需要一個HOME文件夾,用於存放我們生成的證書文件與fabric配置相關的文件。
本文設置HOME文件夾路徑為:

$GOPATH/src/github.com/caDemo/

請讀者自行創建,一般不要用太復雜的路徑,也不要用中文路徑,會為之后的操作帶來很多麻煩。在下文中簡單稱HOME文件夾為工作目錄,除非特殊說明,一般命令的執行都是在工作目錄進行

2 CA服務器配置


2.1啟動TLS CA服務器

前期工作准備好之后,我們開始啟動第一台CA服務器。本文中使用Docker容器啟動。
首先在工作目錄創建docker-compose.yaml文件:

touch docker-compose.yaml

並在文件內添加以下內容(tips:內容格式不要亂掉):

version: '2'

networks:
  fabric-ca:
  
services:
  
  ca-tls:
    container_name: ca-tls
    image: hyperledger/fabric-ca
    command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052'
    environment:
      - FABRIC_CA_SERVER_HOME=/ca/tls
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_CSR_CN=ca-tls
      - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
      - FABRIC_CA_SERVER_DEBUG=true
    volumes:
      - $GOPATH/src/github.com/caDemo:/ca  ##重要!!!記得修改這里的路徑為自己的工作目錄
    networks:
      - fabric-ca
    ports:
      - 7052:7052
      

啟動該docker容器:

docker-compose -f docker-compose.yaml up ca-tls

如果命令行出現以下內容則說明啟動成功:

[INFO] Listening on https://0.0.0.0:7052

同時工作目錄下會出現一個tls的文件夾。文件夾中的內容暫先不解釋,留着在另一篇文章中說明。不過有一個文件需要解釋一下,因為之后會用到。
$GOPATH/src/github.com/caDemo/tls/路徑下的ca-cert.pem文件。這是TLS CA服務器簽名的根證書,目的是用來對CATLS證書進行驗證,同時也需要持有這個證書才可以進行證書的頒發。在多機環境下,我們需要將它復制到每一台機器上,不過本文采用的是單機環境,所以省略掉了這一步。

2.2 TLS CA服務器注冊用戶

第一步是在TLS CA服務器中注冊用戶,經過注冊的用戶才擁有TLS證書,本文中由於只在各節點之間進行TLS加密通信,所以只將ordererpeer節點的身份注冊到TLS服務器。
打開一個新的終端輸入以下命令:

#設置環境變量指定根證書的路徑(如果工作目錄不同的話記得指定自己的工作目錄,以下不再重復說明)
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#設置環境變量指定CA客戶端的HOME文件夾
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/tls/admin
#登錄管理員用戶用於之后的節點身份注冊
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052

登錄成功在工作目錄下的tls文件夾下將出現一個admin文件夾,這里面是admin的相關證書文件.
並且只有登錄了admin,才具有權限進行用戶的注冊,因為該用戶具有CA的全部權限,相當於CA服務器的root用戶。
接下來對各個節點進行注冊。

fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052

這里將三個組織中的節點都進行了注冊。

  • 不過-d這個參數並沒有找到相關資料
  • id.name是指定用戶的名稱
  • --id.secert是指定密碼
  • --id.type是指定用戶類型,用戶類型默認為client,主要包括peer,app,user,orderer.
  • -u則是指定請求CA服務器的URL。

這里我們為各個節點注冊TLS證書,之后Fabric網絡的通信則需要通過這一步驟注冊過的用戶的TLS證書來進行TLS加密通信。
到這里我們只是注冊了各個節點的身份,還沒有獲取到他們的證書。證書可以通過登錄獲取,不過暫時不着急獲取他們的TLS證書。
接下來,我們對其他幾個CA服務器進行配置。

2.3配置Org0的CA服務器

再強調一下,本文中的幾個CA服務器都是根服務器,彼此之間沒有任何關系,所以上一步驟的TLS CA服務器在這一部分並沒有用到。
同樣,本文使用Docker容器啟動CA服務器。配置文件如下,只需要添加進之前的docker-compose.yaml文件中就好:

  org0:
    container_name: org0
    image: hyperledger/fabric-ca
    command: /bin/bash -c 'fabric-ca-server start -d -b org0-admin:org0-adminpw --port 7053'
    environment:
      - FABRIC_CA_SERVER_HOME=/ca/org0/crypto
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_CSR_CN=org0
      - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
      - FABRIC_CA_SERVER_DEBUG=true
    volumes:
      - $GOPATH/src/github.com/caDemo:/ca
    networks:
      - fabric-ca
    ports:
      - 7053:7053
      

添加完之后啟動它:

docker-compose -f docker-compose.yaml up org0

打開另一個終端,接下來注冊org0的用戶:

#首先指定環境變量,這里的TLS證書不是之前的TLS CA服務器的根證書,而是本組織CA服務器啟動時生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
#指定本組織的CA客戶端工作目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/admin

登錄org0的CA服務器管理員身份用於注冊本組織的用戶:

fabric-ca-client enroll -d -u https://org0-admin:org0-adminpw@0.0.0.0:7053

在本組織中共有兩個用戶:orderer節點和admin用戶(這里的admin和管理員是不同的。)
將他們注冊到org0的CA服務器:

fabric-ca-client register -d --id.name orderer-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053

命令執行完之后,將會注冊一個Orderer節點的身份和一個Admin的身份。同時在工作目錄下的org0子文件夾中會有兩個文件夾:cryptoadmincrypto中是CA服務器的配置信息,admin是服務器管理員的身份信息。

2.4配置Org1的CA服務器

同樣的步驟,對org1組織的CA服務器進行配置:

  org1:
    container_name: org1
    image: hyperledger/fabric-ca
    command: /bin/bash -c 'fabric-ca-server start -d -b org1-admin:org1-adminpw'
    environment:
      - FABRIC_CA_SERVER_HOME=/ca/org1/crypto
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_CSR_CN=org1
      - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
      - FABRIC_CA_SERVER_DEBUG=true
    volumes:
      - $GOPATH/src/github.com/caDemo:/ca
    networks:
      - fabric-ca
    ports:
      - 7054:7054
      

啟動服務器:

docker-compose -f docker-compose.yaml up org1

打開新的終端,配置環境變量:

export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/admin

登錄CA服務器管理員身份:

fabric-ca-client enroll -d -u https://org1-admin:org1-adminpw@0.0.0.0:7054

組織一種共有四個用戶:peer1,peer2,admin,user,分別注冊他們:

fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054

2.5配置Org2的CA服務器

和上一部分相同,這里只列舉需要的命令:
CA服務器配置文件:

  org2:
    container_name: org2
    image: hyperledger/fabric-ca
    command: /bin/bash -c 'fabric-ca-server start -d -b org2-admin:org2-adminpw --port 7055'
    environment:
      - FABRIC_CA_SERVER_HOME=/ca/org2/crypto
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_CSR_CN=org2
      - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
      - FABRIC_CA_SERVER_DEBUG=true
    volumes:
      - $GOPATH/src/github.com/caDemo:/ca
    networks:
      - fabric-ca
    ports:
      - 7055:7055
      

啟動服務器:

docker-compose -f docker-compose.yaml up org2

打開新的終端,配置環境變量:

export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/admin

登錄CA服務器管理員身份:

fabric-ca-client enroll -d -u https://org2-admin:org2-adminpw@0.0.0.0:7055

組織一種共有四個用戶:peer1,peer2,admin,user,分別注冊他們:

fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name admin-org2 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name user-org2 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7055

3.生成證書並配置TLS


到目前為止,所有的用戶我們都注冊完畢,接下來就是為每一個用戶生成證書並配置TLS證書。
其中證書分為兩部分,分別是本組織的MSP證書,以及組織之間進行加密通信的TLS證書。
所以本文需要對兩部分證書進行分別生成與配置。
從組織一開始:

3.1 組織一節點配置

3.1.1 peer1

首先是本組織的MSP證書:

  • 配置環境變量
#指定peer1節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/peer1
#指定**本**組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
  • 登錄peer1節點到org1 CA 服務器上:
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054

這一步完成后,在$GOPATH/src/github.com/caDemo/org1/peer1下會出現一個msp文件夾,這是peer1節點的MSP證書。
接下來是TLS證書:

  • 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#指定TLS證書的HOME目錄
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/peer1/tls-msp
  • 登錄peer1節點到TLS CA服務器上:
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1

這一步完成后,在$GOPATH/src/github.com/caDemo/org1/peer1下會出現一個tls-msp文件夾,這是peer1節點的TLS證書。

  • 修改秘鑰文件名
    為什么要修改呢,進入這個文件夾看一下就知道了,由服務器生成的秘鑰文件名是一長串無規則的字符串,后期我們使用的時候難道要一個字符一個字符地輸入?
cd $GOPATH/src/github.com/caDemo/org1/peer1/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo

3.1.2 peer2

peer2節點和上面步驟相同:
這里就直接放需要的命令了:

  • 生成MSP證書
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7054
  • 生成TLS證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/peer2/tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org1
cd $GOPATH/src/github.com/caDemo/org1/peer2/tls-msp/keystore/
mv *_sk key.pem

3.1.3 admin

接下來是admin用戶,這個用戶有什么作用呢,實際上,安裝和實例化鏈碼都需要admin的證書,所以才需要注冊一個admin用戶,還要它的證書。

  • 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
#這里多了一個環境變量,是指定admin用戶的msp證書文件夾的
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/adminuser/msp
  • 登錄admin用戶獲取MSP證書:
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054

因為我們生成這個用戶的證書主要就是為了之后鏈碼的安裝和實例化,所以配不配置他的TLS證書也無關緊要了(關鍵是我們之前也沒有將這個用戶注冊到tls服務器中)

  • 復制證書到admincerts文件夾:
    去看Fabric官方的例子,每一個peer節點的MSP文件夾下都有admincerts這個子文件夾的,而且是需要我們手動創建的。
mkdir -p $GOPATH/src/github.com/caDemo/org1/peer1/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org1/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org1/peer1/msp/admincerts/org1-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/

3.1.4 啟動peer節點

到這里,已經配置好了一個節點,所以我們就可以啟動這個節點了,當然在之后和orderer節點一起啟動也可以,不過忙活了這么多,還是應該提前看到一下所做的工作的成果的!
附上peer1節點的容器配置信息:

  peer1-org1:
    container_name: peer1-org1
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer1-org1
      - CORE_PEER_ADDRESS=peer1-org1:7051
      - CORE_PEER_LOCALMSPID=org1MSP
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
      - FABRIC_LOGGING_SPEC=debug
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer1
    volumes:
      - /var/run:/host/var/run
      - $GOPATH/src/github.com/caDemo/org1/peer1:/tmp/hyperledger/org1/peer1
    networks:
      - fabric-ca
      

啟動它!!

docker-compose -f docker-compose.yaml up peer1-org1

如果沒有報錯的話,說明之前配置的沒有什么問題,如果出錯的話,則需要返回去檢查一下了。。。
peer2節點的容器配置信息:

  peer2-org1:
    container_name: peer2-org1
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer2-org1
      - CORE_PEER_ADDRESS=peer2-org1:8051
      - CORE_PEER_LOCALMSPID=org1MSP
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer2/msp
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
      - FABRIC_LOGGING_SPEC=debug
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer2/tls-msp/keystore/key.pem
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer2
    volumes:
      - /var/run:/host/var/run
      - $GOPATH/src/github.com/caDemo/org1/peer2:/tmp/hyperledger/org1/peer2
    networks:
      - fabric-ca
      

啟動它!!

docker-compose -f docker-compose.yaml up peer2-org1

3.2 組織二節點配置

和之前一樣的步驟,所以沒什么好解釋的了:

3.2.1 peer1

  • 配置環境變量
#指定peer2節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/peer1
#指定本組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
  • 登錄peer1節點到org2 CA 服務器上:
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7055

接下來是TLS證書:

  • 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#指定TLS證書的HOME目錄
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/peer1/tls-msp
  • 登錄peer1節點到TLS CA服務器上:
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org2
  • 修改秘鑰文件名
cd $GOPATH/src/github.com/caDemo/org2/peer1/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo

3.2.2 peer2

  • 生成MSP證書
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7055
  • 生成TLS證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/peer2/tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org2
cd $GOPATH/src/github.com/caDemo/org2/peer2/tls-msp/keystore/
mv *_sk key.pem

3.2.3 admin

  • 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/adminuser/msp
  • 登錄admin用戶獲取MSP證書:
fabric-ca-client enroll -d -u https://admin-org2:org2AdminPW@0.0.0.0:7055
  • 復制證書到admincerts文件夾:
    去看Fabric官方的例子,每一個peer節點的MSP文件夾下都有admincerts這個子文件夾的,而且是需要我們手動創建的。
mkdir -p $GOPATH/src/github.com/caDemo/org2/peer1/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org2/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org2/peer1/msp/admincerts/org2-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/

3.2.4 啟動peer節點

附上peer1節點的容器配置信息:

  peer1-org2:
    container_name: peer1-org2
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer1-org2
      - CORE_PEER_ADDRESS=peer1-org2:9051
      - CORE_PEER_LOCALMSPID=org2MSP
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
      - FABRIC_LOGGING_SPEC=debug
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:9051
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer1
    volumes:
      - /var/run:/host/var/run
      - $GOPATH/src/github.com/caDemo/org2/peer1:/tmp/hyperledger/org2/peer1
    networks:
      - fabric-ca
      

啟動它.

docker-compose -f docker-compose.yaml up peer1-org2

peer2節點的容器配置信息:

  peer2-org2:
    container_name: peer2-org2
    image: hyperledger/fabric-peer
    environment:
      - CORE_PEER_ID=peer2-org2
      - CORE_PEER_ADDRESS=peer2-org2:10051
      - CORE_PEER_LOCALMSPID=org2MSP
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer2/msp
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
      - FABRIC_LOGGING_SPEC=debug
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer2/tls-msp/keystore/key.pem
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:9051
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer2
    volumes:
      - /var/run:/host/var/run
      - $GOPATH/src/github.com/caDemo/org2/peer2:/tmp/hyperledger/org2/peer2
    networks:
      - fabric-ca
      

啟動它.

docker-compose -f docker-compose.yaml up peer2-org2

3.3 排序節點配置

接下來是排序節點的配置,為什么放在最后面呢,因為排序節點的啟動需要提前生成創世區塊,而創世區塊的生成涉及到另一個配置文件,所以就先配置簡單的peer節點。

3.3.1 orderer

  • 配置環境變量
#指定order節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/orderer
#指定本組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
  • 登錄order節點到org0 CA 服務器上:
fabric-ca-client enroll -d -u https://orderer-org0:ordererpw@0.0.0.0:7053

接下來是TLS證書:

  • 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org0/orderer/tls-msp
#指定TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
  • 登錄orderer節點到TLS CA服務器上:
fabric-ca-client enroll -d -u https://orderer-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer-org0
  • 修改秘鑰文件名
cd $GOPATH/src/github.com/caDemo/org0/orderer/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo

3.3.2 admin

  • 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org0/adminuser/msp
  • 登錄admin用戶獲取MSP證書:
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053
  • 復制證書到admincerts文件夾:
mkdir $GOPATH/src/github.com/caDemo/org0/orderer/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org0/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org0/orderer/msp/admincerts/orderer-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/

4.Fabric網絡配置


接下來到重頭戲了,證書都生成好了,即將要啟動網絡了。不過在啟動網絡之前還是有很多准備工作需要做。其實到這里,官方文檔已經好多沒有交代清楚的了,所以一下好多內容都是筆者自己摸索出來的,如有錯誤歡迎批評指正。

4.1 configtx.yaml文件配置

在下一個步驟的生成創世區塊和通道配置信息需要一個文件:configtx.yaml文件。筆者根據官方的例子按照本文內容修改了一下,直接放在工作目錄:

Organizations:
  - &orderer-org0
    Name: orderer-org0
    ID: org0MSP
    MSPDir: ./org0/msp
  #    Policies:
  #      Readers:
  #        Type: Signature
  #        Rule: "OR('orderer-org0MSP.member')"
  #      Writers:
  #        Type: Signature
  #        Rule: "OR('orderer-org0MSP.member')"
  #      Admins:
  #        Type: Signature
  #        Rule: "OR('orderer-org0MSP.admin')"
  
  - &org1
    Name: org1MSP
    ID: org1MSP
    
    MSPDir: ./org1/msp
    #    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')"
    AnchorPeers:
      - Host: peer1-org1
        Port: 7051
  
  - &org2
    Name: org2MSP
    ID: org2MSP
    MSPDir: ./org2/msp
    #    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:
      - Host: peer1-org2
        Port: 9051

Capabilities:
  Channel: &ChannelCapabilities
    V1_4_3: true
    V1_3: false
    V1_1: false
  Orderer: &OrdererCapabilities
    V1_4_2: true
    V1_1: false
  Application: &ApplicationCapabilities
    V1_4_2: true
    V1_3: false
    V1_2: false
    V1_1: false

Application: &ApplicationDefaults
  Organizations:
  #  Policies:
  #    Readers:
  #      Type: ImplicitMeta
  #      Rule: "ANY Readers"
  #    Writers:
  #      Type: ImplicitMeta
  #      Rule: "ANY Writers"
  #    Admins:
  #      Type: ImplicitMeta
  #      Rule: "MAJORITY Admins"
  
  Capabilities:
    <<: *ApplicationCapabilities
    
Orderer: &OrdererDefaults
  OrdererType: solo
  
  Addresses:
    - orderer-org0:7050
  BatchTimeout: 2s
  BatchSize:
    MaxMessageCount: 10
    AbsoluteMaxBytes: 99 MB
    PreferredMaxBytes: 512 KB
  Organizations:
#  Policies:
#    Readers:
#      Type: ImplicitMeta
#      Rule: "ANY Readers"
#    Writers:
#      Type: ImplicitMeta
#      Rule: "ANY Writers"
#    Admins:
#      Type: ImplicitMeta
#      Rule: "MAJORITY Admins"
#    # BlockValidation specifies what signatures must be included in the block
#    # from the orderer for the peer to validate it.
#    BlockValidation:
#      Type: ImplicitMeta
#      Rule: "ANY Writers"

Channel: &ChannelDefaults
  #  Policies:
  #    # Who may invoke the 'Deliver' API
  #    Readers:
  #      Type: ImplicitMeta
  #      Rule: "ANY Readers"
  #    # Who may invoke the 'Broadcast' API
  #    Writers:
  #      Type: ImplicitMeta
  #      Rule: "ANY Writers"
  #    # By default, who may modify elements at this config level
  #    Admins:
  #      Type: ImplicitMeta
  #      Rule: "MAJORITY Admins"
  Capabilities:
    <<: *ChannelCapabilities

Profiles:
  
  TwoOrgsOrdererGenesis:
    <<: *ChannelDefaults
    Orderer:
      <<: *OrdererDefaults
      Organizations:
        - *orderer-org0
      Capabilities:
        <<: *OrdererCapabilities
    Consortiums:
      SampleConsortium:
        Organizations:
          - *org1
          - *org2
  TwoOrgsChannel:
    Consortium: SampleConsortium
    <<: *ChannelDefaults
    Application:
      <<: *ApplicationDefaults
      Organizations:
        - *org1
        - *org2
      Capabilities:
        <<: *ApplicationCapabilities

注釋掉的部分是策略部分,筆者還沒有完全搞懂,所以索性就先注釋掉了,以后搞懂了再添加進去。
還有一部分msp需要配置,就是configtx.yaml文件中第一部分指定的MSPDir,很簡單,按照一下命令復制一下就好了:

#進入工作目錄
cd $GOPATH/src/github.com/caDemo
############################################
#org0
mkdir org0/msp &&  cd org0/msp
mkdir admincerts && mkdir cacerts && mkdir tlscacerts 
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem
############################################
#org1
cd $GOPATH/src/github.com/caDemo
mkdir org1/msp/  && cd org1/msp/
mkdir admincerts && mkdir cacerts && mkdir tlscacerts 
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem
############################################
#org2
cd $GOPATH/src/github.com/caDemo
mkdir org1/msp/  && cd org1/msp/
mkdir admincerts && mkdir cacerts && mkdir tlscacerts 
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem

4.2 生成創世區塊和通道配置信息

可以了,所有的前期工作都已經完成,接下來就是手動啟動網絡了,第一步,生成創世區塊和通道配置信息:

cd $GOPATH/src/github.com/caDemo
export FABRIC_CFG_PATH=$PWD
#生成創世區塊
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock $GOPATH/src/github.com/caDemo/genesis.block
#生成通道配置信息
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx $GOPATH/src/github.com/caDemo/channel.tx -channelID mychannel

4.3 啟動Orderer節點

orderer容器配置文件:

  orderer-org0:
    container_name: orderer-org0
    image: hyperledger/fabric-orderer
    environment:
      - ORDERER_HOME=/tmp/hyperledger/orderer
      - ORDERER_HOST=orderer-org0
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/tmp/hyperledger/genesis.block
      - ORDERER_GENERAL_LOCALMSPID=org0MSP
      - ORDERER_GENERAL_LOCALMSPDIR=/tmp/hyperledger/org0/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_CERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
      - ORDERER_GENERAL_TLS_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_DEBUG_BROADCASTTRACEDIR=data/logs
    volumes:
      - $GOPATH/src/github.com/caDemo/org0/orderer:/tmp/hyperledger/org0/orderer/
      - $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
    networks:
      - fabric-ca
    

關鍵部分到了,只要這一步沒有出現錯誤,整個網絡就啟動成功了。

docker-compose -f docker-compose.yaml up orderer-org0

4.4 啟動組織一的cli容器

cli容器內容,我們需要這個容器對組織1進行鏈碼的交互:

  cli-org1:
    container_name: cli-org1
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=testchainid
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_ID=cli-org1
      - CORE_PEER_ADDRESS=peer1-org1:7051
      - CORE_PEER_LOCALMSPID=org1MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1
    command: /bin/bash
    volumes:
      - $GOPATH/src/github.com/caDemo/org1/peer1:/tmp/hyperledger/org1/peer1
      - $GOPATH/src/github.com/caDemo/org1/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
      - $GOPATH/src/github.com/caDemo/org1/adminuser:/tmp/hyperledger/org1/adminuser
      - $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
    networks:
      - fabric-ca
    depends_on:
      - peer1-org1

啟動該容器:

docker-compose -f docker-compose.yaml up cli-org1

4.5 啟動組織二的cli容器

cli容器內容,我們需要這個容器對組織2進行鏈碼的交互:

  cli-org2:
    container_name: cli-org2
    image: hyperledger/fabric-tools
    tty: true
    stdin_open: true
    environment:
      - SYS_CHANNEL=testchainid
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_ID=cli-org2
      - CORE_PEER_ADDRESS=peer1-org2:9051
      - CORE_PEER_LOCALMSPID=org2MSP
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
      - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem
      - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem
      - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2
    command: /bin/bash
    volumes:
      - $GOPATH/src/github.com/caDemo/org2/peer1:/tmp/hyperledger/org2/peer1
      - $GOPATH/src/github.com/caDemo/org2/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
      - $GOPATH/src/github.com/caDemo/org2/adminuser:/tmp/hyperledger/org2/adminuser
      - $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
    networks:
      - fabric-ca
    depends_on:
      - peer1-org2

啟動該容器:

docker-compose -f docker-compose.yaml up cli-org2

5.網絡測試


所有工作准備完成,接下來讓我們測試整個網絡能不能正常運行吧:

5.1 創建與加入通道

組織1為例:

  • 首先進入cli容器:
docker exec -it cli bash
#配置環境變量
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
  • 創建通道
peer channel create -c mychannel -f /tmp/hyperledger/channel.tx -o orderer-org0:7050 --outputBlock /tmp/hyperledger/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
  • peer1-org1加入通道:
export CORE_PEER_ADDRESS=peer1-org1:7051
peer channel join -b /tmp/hyperledger/mychannel.block
  • peer2-org1加入通道:
export CORE_PEER_ADDRESS=peer2-org1:8051
peer channel join -b /tmp/hyperledger/mychannel.block

組織二步驟是相同的,唯一不同的就是不需要創建通道了,所以就不再說明了。

5.2 安裝和實例化鏈碼

組織1為例:

  • 首先進入cli容器:
docker exec -it cli bash
#配置環境變量
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
export CORE_PEER_ADDRESS=peer1-org1:7051
  • 安裝鏈碼
    記得提前將鏈碼放到$GOPATH/src/github.com/caDemo/org1/peer1/assets/chaincode路徑下。,本文使用的是fabric-samples/chaincode/chaincode_example02官方示例鏈碼。
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/
  • 實例化鏈碼
peer chaincode instantiate -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}'  -o orderer-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
  • 這一步在高版本的Fabric網絡是會出錯的,因為少了一個文件config.yaml:
NodeOUs:
  Enable: true
  ClientOUIdentifier:
    Certificate: cacerts/ca.example.com-cert.pem  #這里需要修改
    OrganizationalUnitIdentifier: client
  PeerOUIdentifier:
    Certificate: cacerts/ca.example.com-cert.pem  #這里需要修改
    OrganizationalUnitIdentifier: peer
  AdminOUIdentifier:
    Certificate: cacerts/ca.example.com-cert.pem  #這里需要修改
    OrganizationalUnitIdentifier: admin
  OrdererOUIdentifier:
    Certificate: cacerts/ca.example.com-cert.pem  #這里需要修改
    OrganizationalUnitIdentifier: orderer

因為高版本的Fabric把節點類型區分開了,所以需要我們手動配置。
將該文件復制到$GOPATH/src/github.com/caDemo/org1/adminuser/msp文件夾內,同時修改上面指定的位置的文件名(與對應文件夾內的文件名對應就好了)。

  • 實例化部分出錯的可能性是最高的,很多都是因為網絡模式指定錯誤導致鏈碼容器啟動失敗,解決方案:
#終端執行命令
docker network ls

找到以fabric-ca為后綴的一條如cademo_fabric-ca,修改之前的所有peer節點容器配置文件的環境變量:

- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca

修改完成重啟節點容器,再次執行以上的命令(需要重新配置環境變量,加入通道這兩個操作)。
終於,實例化成功了。

5.3 調用和查詢鏈碼

最后測試一下鏈碼功能能不能正常使用了:

  • 還是組織一的cli容器:
docker exec -it cli bash
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
export CORE_PEER_ADDRESS=peer1-org1:7051
  • 執行查詢功能:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

命令行應該打印出:

100
  • 執行調用功能:
peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}' --tls --cafile /tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
  • 再次查詢:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

命令行應該打印出:

90

至於其他節點操作方法也是一樣的,就不再操作了。
到此為止,從零開始的手動生成證書一直到成功搭建Fabric網絡全部步驟已經完成!!接下來還有更新錨節點等等就不再演示了,請各位讀者自行操作。整個步驟是不容易的,而且BUG百出,不過成功搭建完成確實漲了不少知識。
碼字不易,還望各位看官支持一下:

支付寶


免責聲明!

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



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