在這篇文章中,使用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網絡中一起講解。到這里,整個網絡的手動搭建過程已經完成,希望大家能夠有所收獲。