深刻解析Hyperledger Fabric搭建的全過程

在這篇文章中,使用fabric-samples/first-network中的文件進行fabric網絡(solo類型的網絡)搭建全過程的解析。若有錯誤歡迎批評指正。
至於Fabric網絡的搭建這裏再也不介紹,能夠參考這一篇文章Hyperledger Fabric環境搭建過程
fabric網絡:單機,solo類型,兩個組織,分別有兩個節點
首先看一下該文件夾內有哪些文件:html

base                  connection-org2.json    docker-compose-cli.yaml           docker-compose-org3.yaml
byfn.sh               connection-org2.yaml    docker-compose-couch-org3.yaml    eyfn.sh
channel-artifacts     connection-org3.json    docker-compose-couch.yaml         org3-artifacts
configtx.yaml         connection-org3.yaml    docker-compose-e2e-template.yaml  README.md
connection-org1.json  crypto-config.yaml      docker-compose-etcdraft2.yaml     scripts
connection-org1.yaml  docker-compose-ca.yaml  docker-compose-kafka.yaml

將本次用不到的文件刪除,剩餘的文件:node

.
├── base
│   ├── docker-compose-base.yaml
│   └── peer-base.yaml
├── channel-artifacts
├── configtx.yaml
├── crypto-config.yaml
├── docker-compose-cli.yaml
├── docker-compose-couch.yaml
├── docker-compose-e2e-template.yaml

1.證書的生成

在Fabric網絡環境中,第一步須要生成各個節點的證書文件,所用到的配置文件爲crypto-config.yaml,說明一下文件內各字段的意義:git

OrdererOrgs:    #定義一個Order組織
  - Name: Orderer    #order節點的名稱,當前網絡模式爲solo類型,因此只定義了一個Order節點
    Domain: example.com    #order節點的域
    Specs:      #暫時用不到
      - Hostname: orderer
      - Hostname: orderer2
      - Hostname: orderer3
      - Hostname: orderer4
      - Hostname: orderer5

PeerOrgs:      #定義Peer組織
  - Name: Org1      #聲明Peer組織名稱爲Org1
    Domain: org1.example.com    #Org1組織的域
    EnableNodeOUs: true    #暫時沒搞清楚該字段的意義
    Template:       #在這裏能夠定義所生成的Org1組織中的Peer節點證書數量,不包括Admin
      Count: 2      #代表須要生成兩個Peer節點的證書,若是須要其餘數量的Peer節點,只須要更改這裏的數量。
    Users:        #在這裏能夠定義所生成的Org1組織中類型爲User的證書數量,不包括Admin
      Count: 1    #生成用戶的證書的數量

  - Name: Org2   #聲明第二個Peer組織名稱爲Org2,若是須要更多的Peer組織證書,只須要按該模板添加便可。
    Domain: org2.example.com  #與以上相同 
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

咱們這裏就使用兩個組織,每一個組織分別有兩個節點和一個User。接下來咱們使用該文件生成對應數量的證書:github

#路徑須要更改成本身的路徑
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/  
#在這裏可能會報錯,一般是權限問題,能夠添加sudo從新執行
cryptogen generate --config=./crypto-config.yaml
#執行完畢後,當前文件夾下會出現一個新的文件夾:crypto-config,在該文件夾下就是剛剛生成的證書.

文件夾內證書再也不詳解,會在另外一篇文章中專門解釋Fabric-ca的內容。docker

2 生成創世區塊,通道配置,錨節點配置文件

在這裏須要用到configtxgen這個二進制文件。數據庫

2.1生成創世區塊

#首先進入文件夾
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/  
#執行命令生成創世區塊 
configtxgen -profile TwoOrgsOrdererGenesis -channelID mychannel -outputBlock ./channel-artifacts/genesis.block
#若是沒有channel-artifacts這個文件夾,則須要手動去建立

若是沒有出現錯誤的話,在channel-artifacts文件夾中能夠看至生成的genesis.block文件。json

2.2生成通道配置信息

#執行命令生成通道配置信息
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel

一樣,在channel-artifacts文件夾中能夠看至生成的channel.tx文件。bash

2.3生成錨節點配置文件

#首先生成Org1的錨節點配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
#生成Org2的錨節點配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

全部須要的配置文件所有創建完成,在channel-artifacts中應該有如下幾個文件:網絡

channel.tx  genesis.block  Org1MSPanchors.tx  Org2MSPanchors.tx

3啓動網絡

到了這一步,能夠啓動網絡了。tcp

#首先進入``fabric-samples/first-network``文件夾。
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/
#啓動容器
sudo docker-compose -f docker-compose-cli.yaml up -d

執行如下命令查看容器是否啓動成功:

sudo docker ps
#若是能夠看到以下信息說明啓動成功
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS              PORTS                      NAMES
17d79586b1b7        hyperledger/fabric-tools:latest     "/bin/bash"         30 seconds ago      Up 28 seconds                                  cli
0f4adb6b578e        hyperledger/fabric-orderer:latest   "orderer"           57 seconds ago      Up 29 seconds       0.0.0.0:7050->7050/tcp     orderer.example.com
e2795ea9d43b        hyperledger/fabric-peer:latest      "peer node start"   57 seconds ago      Up 30 seconds       0.0.0.0:10051->10051/tcp   peer1.org2.example.com
247a6e4fdd62        hyperledger/fabric-peer:latest      "peer node start"   57 seconds ago      Up 30 seconds       0.0.0.0:9051->9051/tcp     peer0.org2.example.com
ad4af3309e8c        hyperledger/fabric-peer:latest      "peer node start"   57 seconds ago      Up 31 seconds       0.0.0.0:8051->8051/tcp     peer1.org1.example.com
f6d25896b517        hyperledger/fabric-peer:latest      "peer node start"   58 seconds ago      Up 40 seconds       0.0.0.0:7051->7051/tcp     peer0.org1.example.com

3.1建立通道

建立通道須要進入cli容器:

sudo docker exec -it cli bash
#看到光標前的信息變爲
root@17d79586b1b7:/opt/gopath/src/github.com/hyperledger/fabric/peer# 
#則成功進入容器

首先配置環境變量:

#當前cli容器默認配置是節點peer0,因此不須要其餘配置信息
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#建立通道信息
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
#看到以下信息說明建立通道成功
2019-06-20 13:05:55.829 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-06-20 13:05:55.926 UTC [cli.common] readBlock -> INFO 002 Received block: 0
#將生成的文件移動到channel-artifacts文件夾中
mv mychannel.block channel-artifacts/

3.2加入通道

#由於當前cli容器使用的是peer0的配置,因此能夠直接將peer0加入通道 
 peer channel join -b channel-artifacts/mychannel.block
#更新環境變量使其餘節點也加入通道
#=========peer1.org1===========  注意這裏端口要與上面文件中配置的端口號相同
CORE_PEER_ADDRESS=peer1.org1.example.com:8051  
#=========peer0.org2============
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b channel-artifacts/mychannel.block 
#=========peer1.org2=============
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b channel-artifacts/mychannel.block
#退出容器
exit

3.3更新錨節點

#從新進入容器
sudo docker exec -it cli bash
#更新環境變量
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#========Org1================
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
#========Org2================
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
#退出容器
exit

3.4安裝鏈碼

#鏈碼的安裝仍然須要在全部節點上進行操做
#進入容器
sudo docker exec -it cli bash
#更新環境變量
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#=========peer0.org1=========== 
#這裏頗有可能會出現路徑不存在的錯誤,解決方法是在容器內找到對應的鏈碼所在位置,而後替換當前鏈碼路徑
##好比本文中鏈碼路徑爲/opt/gopath/src/github.com/chaincode/chaincode_example02/go
##則能夠將如下命令的鏈碼路徑更改成github.com/chaincode/chaincode_example02

peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
#實例化鏈碼 該步驟建立了a,b兩個帳戶,其中a帳戶餘額定義爲100,b帳戶餘額定義爲200
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"
#這一步執行完畢後能夠在其餘節點上也安裝鏈碼,具體環境變量配置見本文中4.2

3.5調用鏈碼

#以peer0.org1爲例
#首先進入cli容器
sudo docker exec -it cli bash
#執行如下命令進行查詢a帳戶餘額
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#若是命令行輸出100說明鏈碼成功調用.

#接下來咱們發起一筆交易:經過peer0.org1節點將a帳戶餘額轉帳給b20
peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
#而後登錄peer1.org1節點進行查詢
CORE_PEER_ADDRESS=peer1.org1.example.com:8051 
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#若是輸出結果爲:80
說明Fabric網絡手動搭建成功
#退出容器
exit

最後關閉網絡:

sudo docker-compose -f docker-compose-cli.yaml down --volumes 
#刪除生成的文件,下次啓動網絡須要從新生成
sudo rm -r channel-artifacts crypto-config

4總結

本文並無使用CouchDb做爲fabric網絡的數據庫,準備放到下一篇多機搭建Fabric網絡中一塊兒講解。到這裏,整個網絡的手動搭建過程已經完成,但願你們可以有所收穫。

相關文章
相關標籤/搜索