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


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

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

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

.
├── 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,說明一下文件內各字段的意義:

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    #節點組織單元,具體不了解,可以看crypto-config/peerOrganizations/*.example.com/msp/config.yaml文件了解
    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。接下來我們使用該文件生成對應數量的證書:

#路徑需要更改為自己的路徑
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/  
#在這里可能會報錯,通常是權限問題,可以添加sudo重新執行
cryptogen generate --config=./crypto-config.yaml
#執行完畢后,當前文件夾下會出現一個新的文件夾:crypto-config,在該文件夾下就是剛剛生成的證書.

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

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

在這里需要用到configtxgen這個二進制文件。

2.1生成創世區塊

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

如果沒有出現錯誤的話,在channel-artifacts文件夾中可以看至生成的genesis.block文件。

2.2生成通道配置信息

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

同樣,在channel-artifacts文件夾中可以看至生成的channel.tx文件。

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啟動網絡

到了這一步,可以啟動網絡了。

#首先進入``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  
peer channel join -b channel-artifacts/mychannel.block 
#=========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================
#更新環境變量
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 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網絡中一起講解。到這里,整個網絡的手動搭建過程已經完成,希望大家能夠有所收獲。


免責聲明!

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



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