在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
這篇文章上接:ubuntu18.04 快速搭建 Hyperledger Fabric超級賬本框架,爲了更好的瞭解Fabric1.4運行時的工作原理,下面自己動手部署first-network。
文章目錄
1. 準備工作
首先在 fabric-samples/first-network
文件夾下運行./byfn.sh up
命令,若成功運行纔可進行手動部署的操作,運行成功後輸入./byfn.sh down
命令關閉網絡。每次修改源代碼且運行後,下次運行之前都要 運行./byfn.sh down
關閉之前的網絡
2. 手動部署
1. 生成MSP證書
終端進入fabric-samples/first-network
文件下,運行以下命令:
../bin/cryptogen generate --config=./crypto-config.yaml
執行成功出現以下結果:
這個步驟的是使用cryptogen工具
,根據crypto-config.yaml
配置生成MSP證書,同時當前目錄中會生成crypto-config
文件夾,文件夾中包括ordererOrganizations
和peerOrganizations
兩個文件夾,其中包含了排序服務組織機構的證書和Peer節點的證書。
cryptogen
的作用是爲各種網絡實體材料生成加密材料(x509證書和簽名祕鑰),網絡實體進行通信和交易時,使用加密材料進行簽名和認證。和其他區塊鏈網絡一樣,fabric中的交易和通信也是通過實體的私鑰(keystore)進行簽名,通過公鑰(signcerts)進行驗證。
cryptogen
使用crypto-config.yaml
作爲參數配置,這個文件裏面包含網絡拓撲,併爲組織和屬於這個組織的實體(orderer和peer)生成證書庫。每個組織被分配一個唯一根證書(ca-cert),該證書講指定的實體與組織綁定。
下面我們看一下crypto-config.yaml
中的代碼片段:
這部分爲orderer節點的代碼
網絡實體的命名約定爲{{.Hostname}}.{{.Domain}}。此order節點使用Space方式
這部分爲peer節點的代碼
對文件不做任何修改,使用tree crypto-config -L 4
查看crypto-config
文件下的目錄結構如圖所示:
2. 自己動手修改生成MSP證書的代碼
下面我們對org2.example.com
下的代碼進行修改
運行:
../bin/cryptogen generate --config=./crypto-config.yaml
再次使用tree命令查看crypto-config
下的文件結構。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JQs21z1Y-1590929339687)(/home/jsm/.config/Typora/typora-user-images/image-20200526085704234.png)]
現在修改 orderer節點的代碼,修改之前的目錄結構爲:
修改代碼:
修改後orderer節點的目錄結構:
可見Space``Template
參數可以混合用,也可隨便單獨用一個,修改orderer節點的 Users
參數貌似沒用 現在不知道是因爲我操作的問題,還是本來就是這樣。
3. 生成配置交易
使用configtxgen
生成配置交易,它會生成4個配置網絡工件:genesis.block(創世紀區塊)、channel.tx(通道配置交易)、Org1MSPanchors.tx(錨節點交易)、Org2MSPanchors.tx(錨節點交易)。configtxgen
的配置參數放在configtx.yaml
文件中。
首先我們告訴configtxgen
工作的目錄,方便它查找configtx.yaml
export FABRIC_CFG_PATH=$PWD
然後生成orderer創世紀區塊
../bin/configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
創建通道配置交易
export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
定義通道中Org1的錨節點
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
定義通道中Org2錨節點
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
終端輸出:
上述4個工件保存在 channel-artifacts
目錄下 若都運行成功會看到
錨節點是一個peer節點,在一個網絡中,有多個組織,每個組織有多個peer節點組織和組織之間需要通信,那麼每個組織中選取一個peer節點作爲代表進行通信,我們就稱這個peer節點爲錨節點,錨節點的職責就是代表當前這個組織和其他的組織進行通信,我們可以在配置文件中指定錨節點,任意的peer節點都有資格成爲錨節點,但是一個組織最多有一個錨節點。 創世紀區塊是排序服務的創世區塊;通道配置交易在通道創建時廣播給orderer;錨節點交易指定通道上每個組織的錨節點。
下面我們看一下configtx.yaml
配置文件中的內容
定義peer節點的參數
定義orderer節點共識機制相關參數
滿足BatchTimeout
、MaxMessageCount
、AbsoluteMaxBytes
、PerferredMaxBytes
中的任何一個條件orderer都會打塊。並且這4個參數還影響fabric網絡的性能,如何最優都需要根據環境的不同進行調參。
4. 啓動測試網絡
-
進入網絡
fabric網絡需要進入Docker中啓動,引用
docker-compose-cli.yaml
文件啓動docker# 不看網絡啓動日誌 docker-compose -f docker-compose-cli.yaml up -d # 看網絡啓動日誌、 docker-compose -f docker-compose-cli.yaml up
docker exec -it cli bash
若成功顯示:
-
創建通道
export CHANNEL_NAME=mychannel export 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 $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA
出現下圖表示成功
peer channel create
會返回一個創世紀區塊,區塊名爲通道名.block
,因爲我們的通道名稱爲mychannel
, 所以返回的區塊名爲mychannel.block
-c
表示通道名稱爲$CHANNEL_NAME
通道名稱必須全爲小寫;-f
表示通道配置交易channel.tx
,其包含了指定的配置信息,channel.tx
文件被掛載到CLI
容器中的channel-artifacts
目錄中;--tls --cafile
指定ORDERER_CA
的根證書路徑,要求節點驗證TLS握手。 -
將
peer0.org1
加入通道peer channel join -b mychannel.block
更新通道,將
peer0.org1
設爲錨節點peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA
爲
peer0.org1
安裝鏈碼peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
-
實例化鏈碼
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.peer','Org2MSP.peer')"
出現:
-P
是我們指定的策略爲"OR('Org1MSP.peer','Org2MSP.peer')"
,表示我們只需要一個屬於Org1或Org2的”背書“,若將OR
改爲AND
則意味着我們需要兩個”背書“。 我們在實例化鏈碼時也進行了初始化,即將
a
賦值爲100
,b
賦值爲200
,可以通過下列命令對a
的值進行查詢:peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
結果爲
100
,將命令後面的參數由a
改爲b
,可以對b
的值進行查詢。 另外由於我們是在
peer0.org1
的環境中將鏈碼實例化的,所以在另外的終端輸入docker ps
命令,會看到NAME
爲dev-peer0.org1.example.com-mycc-1.0
的容器,鏈碼會在這個容器中運行,任何安裝(peer chaincode install
)鏈碼的peer,在被調用時都會檢查是否生成了鏈碼容器,若沒有就會首先生成。且不不管鏈碼在那個peer
中被實例化,都只能實例化一次。且實例化節點必須爲Admin
。 -
將
peer0.org2
加入通道 將通道中的環境改爲
peer0.org2
(之前是peer0.org1
),具體操作就是設置peer0.org2
環境變量,CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 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
然後輸入以下命令:
# 加入通道 peer channel join -b mychannel.block # 更新通道,定義錨節點 peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA # 安裝鏈碼 peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
然後查詢
a
的值,測試是否加入成功,命令同上。成功後開始進行轉賬交易:將a移動10個到b。# 配置環境變量,聲明peer0.org1的MSP地址 PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt # 轉賬將a移動10個到b peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA -c '{"Args":["invoke", "a", "b", "10"]}'
因爲在實例化鏈碼時我們聲明指定的策略是
"OR('Org1MSP.peer','Org2MSP.peer')"
只需要一個節點MSP(背書),所以此次轉賬交易我們只用到了peer0.org1
這一個節點的背書。若聲明爲"AND('Org1MSP.peer','Org2MSP.peer')"
則需要兩個節點MSP(背書),則首先指定peer0.org2
的MSP地址,然後使用--peerAddresses
命令指定多個背書,轉賬命令改爲:# 配置環境變量,聲明peer0.org1的MSP地址 PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["invoke", "a", "b", "10"]}'
再次查詢a、b的值:
# 查詢a peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' # 結果應爲90 # 查詢b peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}' # 結果應爲210
5. 參考文獻
- https://blog.csdn.net/zxc87545586/article/details/89400941
- Hyperledger Fabric核心技術 第三章
- Fabric 的官方概念 https://www.jianshu.com/p/8d775a1c76e0
- peer和orderer的作用:https://blog.csdn.net/qq_36336522/article/details/85216240
6. 後記
恭喜你,一路看到這裏,如果以上步驟都順利完成的話,一個簡單的fabric網絡就算搭建成功了。但是細心的網友可能會發現,在生成MSP證書時,共定義了兩個組織,每個組織有定義了兩個peer節點時如圖:
現在我們只是將peer0.org1
和peer0.org2
加入了通道,還有peer1.org1
和peer1.org2
沒有加入,這個兩個peer節點就請讀者自己完成。需要注意的是每一次將一個新的peer節點加入通道時都需要將環境變量更改爲這個新的peer節點。
這篇文章斷斷續續寫了一週快兩週的時間,在此過程中付出了很多的時間,往往一個小的章節結就需要查很多的資料,唯恐自己描述的有誤,貽笑大方,但是付出總是有回報的,自己也學到了很多知識。
奮鬥吧,少年!!!
最後如果你覺得我寫的還可以的話,請鼓勵一下下吧!!!
支付寶 | 微信 |
---|---|