在這篇文章中,使用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
在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
在這裏須要用到configtxgen
這個二進制文件。數據庫
#首先進入文件夾 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
#執行命令生成通道配置信息 configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
一樣,在channel-artifacts
文件夾中能夠看至生成的channel.tx
文件。bash
#首先生成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
到了這一步,能夠啓動網絡了。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
建立通道須要進入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/
#由於當前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
#從新進入容器 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
#鏈碼的安裝仍然須要在全部節點上進行操做 #進入容器 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
#以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
本文並無使用CouchDb做爲fabric網絡的數據庫,準備放到下一篇多機搭建Fabric網絡中一塊兒講解。到這裏,整個網絡的手動搭建過程已經完成,但願你們可以有所收穫。