導語:文章沒有重復的地方,沒有廢話,如果能幫助到你,那是我的榮幸,記得一鍵三連喲
Fabric 組態檔詳解
- 一、四個核心組態檔
- 二、Fabric 的核心組態檔
- 三、網路啟動步驟
- 1. 生成認證證書
- crypto-config.yaml
- 2. 生成起始區塊
- configtx.yaml
- Organizations:
- Capabilities:
- Application:
- Orderer:
- Channel:
- Profiles:
- 3. 創建通道組態檔
- 4. 創建組織錨節點組態檔
- 4.1 創建Org1組織錨節點組態檔
- 4.2 創建Org2組織錨節點組態檔
- 4.3關閉TLS傳輸
- 5. docker 容器啟動
- docker-compose-cli.yaml
- cli客戶端節點
- orderer排序節點
- peer對等節點
- 進入docker容器
- 6. 根據通道組態檔生成通道
- 7. 將peer0.Org1節點加入通道
- 7. 將peer1.Org1節點加入通道
- 7. 將peer0.Org2節點加入通道
- 7. 將peer1.Org2節點加入通道
- 8. 根據錨節點組態檔更新錨節點
- 8. 根據錨節點組態檔更新錨節點-Org2
- 8. 根據錨節點組態檔更新錨節點-Org1
- 9. 安裝鏈碼
- 9. 安裝鏈碼-peer0.Org1
- 9. 安裝鏈碼-peer0.Org2
- 10. 實體化鏈碼
- 11. 鏈碼查詢
- 12. 鏈碼互動
一、四個核心組態檔
1、crypto-config.yaml
2、configtx.yaml
3、docker-compose-cli.yaml
4、byfn.sh
二、Fabric 的核心組態檔
Fabric 將節點運行在docker容器中,其證書認證、通道創建、鏈碼安裝、鏈碼互動等,都可以通過組態檔與命令列工具執行,
在Fabric 網路搭建的程序中,有三個組態檔起到很重要的作用,我們可以通過對這個幾個配置
檔案的修改,來構建符合業務邏輯和企業需求的區塊鏈網路, 這幾個組態檔我們可以在fabric-samples
目錄下的first-network 專案里找到:
1、crypto-config.yaml:認證證書、組織資訊、網路節點數量等;
2、configtx.yaml:起始區塊、通道組態檔、共識演算法設定等;
3、docker-compose-cli.yaml:docker容器設定、批量管理docker容器等;
4、還有一個shell腳本byfn.sh,詳細說明了啟動Fabric 區塊鏈網路所需的大部分命令;
三、網路啟動步驟
- 生成認證證書;
- 生成起始區塊;
- 創建通道組態檔;
- 創建組織錨節點組態檔;
- docker 容器啟動;
- 根據通道組態檔生成通道
- 將節點加入通道;
- 根據錨節點組態檔更新錨節點;
- 安裝鏈碼;
- 實體化鏈碼;
- 鏈碼互動;
- 鏈碼查詢;
1. 生成認證證書
crytogen 組件,為每一個組織生成MSP 所需要的證書與密鑰,它與crypto-config.yaml檔案配
套使用,在命令列輸入以下命令:
cd $HOME/fabric-samples/first-network cryptogen
generate --config=./crypto-config.yaml
會在當前目錄下自動生成crypto-config目錄,里邊存放了所有的證書與密鑰,為MSP 提供服務;
crypto-config.yaml
Name:組織名稱
Domain:組織域名
Specs:
- Hostname:自定義節點名稱
Template:使用模板定義節點名稱 peer($Count +1)- Count:節點數量
Users:用戶名稱 user$Count- Count:用戶數量
2. 生成起始區塊
configtxgen 組件,用于生成通道創世區塊或通道交易的組態檔,需要與configtx.yaml檔案配套使用,
configtxgen -profile TwoOrgsOrdererGenesis -channelID syschannel -outputBlock ./channel-artifacts/genesis.block
-profile:后邊接通道配置名稱,從configtx.yaml檔案的profiles配置段中尋找相關通道配置名稱載入, -channelID:后邊接通道名稱,這里定義的是系統通道的名稱,建議全小寫并且沒有特殊字符; -outputBlock:后邊接創世區塊輸出的檔案路徑,路徑中目錄如果不存在,需提前創建;
cd $HOME/fabric-samples/first-network
mkdir -p channel-artifacts
configtxgen -profile TwoOrgsOrdererGenesis -channelID syschannel -outputBlock ./channel-artifacts/genesis.block
configtx.yaml
該檔案總共有六個配置段:
Organizations:定義了各組織機構的名稱、MSPID、MSP目錄、讀寫策略等;
Capabilities:能力定義,設定了不同版本的節點所能做的事情;
Application:定義了要寫入創世區塊或配置交易的應用引數,
Orderer:定義了通道的共識模式與區塊的相關資訊;
Channel:定義了通道中相關API的呼叫權限;
Profiles:定義configtxgen工具的相關配置入口;
Organizations:
Name:在網路中的名稱
ID:MSP中的唯一ID
MSPDir:msp的相關目錄
Policies:讀寫策略
AnchorPeers:錨節點配置
Capabilities:
Capabilities段用來定義fabric網路的能力,這是版本v1.1.0引入的一個新的配置段,當與版本
v1.0.x的對等節點與排序節點混合組網時不可使用,
Capabilities段定義了fabric程式要加入網路所必須支持的特性,例如,如果添加了一個新的
MSP型別,那么更新的程式可能會根據該型別識別并驗證簽名,但是老版本的程式就沒有辦法驗
證這些交易,這可能導致不同版本的fabric程式中維護的世界狀態不一致,
因此,通過定義通道的能力,就明確了不滿足該能力要求的fabric程式,將無法處理交易,除非
升級到新的版本,對于v1.0.x的程式而言,如果在Capabilities段定義了任何能力,即使宣告不
需要支持這些能力,都會導致其有意崩潰,
Application:
這一部分后續由應用程式端進行配置;
Orderer:

Channel:

Profiles:
configtxgen 工具 -profile 命令 后接的名稱要與profiles 下的欄位 匹配;
3. 創建通道組態檔
configtxgen 組件,用于生成通道創世區塊或通道交易的組態檔,需要與configtx.yaml檔案配套使用,
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
-profile:后邊接通道配置名稱,從configtx.yaml檔案的profiles配置段中尋找相關通道配置名稱載入, -outputCreateChannelTx:后邊接通道組態檔輸出的檔案路徑;
-channelID:后邊接通道名稱,這里定義的是業務通道的名稱,建議全小寫并且沒有特殊字符
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
4. 創建組織錨節點組態檔
configtxgen 組件,用于生成通道創世區塊或通道交易的組態檔,需要與configtx.yaml檔案配套使用,
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
-profile:后邊接通道配置名稱,從configtx.yaml檔案的profiles配置段中尋找相關通道配置名稱載入,
-outputAnchorPeersUpdate:后邊接組織錨節點組態檔輸出的檔案路徑;
-channelID:后邊接通道名稱,這里定義的是業務通道的名稱,建議全小寫并且沒有特殊字符;
-asOrg:后邊接所屬組織的MSPID,要與configtx.yaml檔案中Organizations配置段的定義一致;
錨節點每個組織至少有一個,有多少個錨節點就創建多少個錨節點組態檔;
4.1 創建Org1組織錨節點組態檔
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP


4.2 創建Org2組織錨節點組態檔
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP


4.3關閉TLS傳輸
修改docker-compose的yaml 檔案,將TLS相關配置關閉:
一:修改docker-compose-cli.ymal中service下的cli容器的environment:
將TLS欄位的環境變數注釋掉;
修改docker-compose的yaml 檔案,將TLS相關配置關閉:
二:修改base/peer-bash.ymal中service下的peer-base容器和orderer容器的environment: 將TLS欄位的環境變數注釋掉;
5. docker 容器啟動
使用docker-compose 組件,根據docker-compose-cli.yaml 檔案批量啟動docker容器;
docker-compose -f docker-compose-cli.yaml up -d
-f:使用指定組態檔
up:啟動
-d:后臺運行,不占用命令列視窗
docker-compose -f docker-compose-cli.yaml up -d

docker-compose-cli.yaml
此yaml檔案定義了docker的相關資訊,供docker-compose啟動時使用;
以下是頂級的配置項:
version:定義了版本資訊;
volumes:定義了卷資訊,提供給 services 中的 具體容器使用;
networks:定義了網路資訊,提供給 services 中的 具體容器使用;
services:定義了服務的配置資訊以及該服務啟動的每個容器的配置;
以下是services配置項下的服務資訊以及相關的容器配置:
container_name:指定容器的名稱;
image:指定服務所使用的鏡像,如果本地不存在,將拉取鏡像;
tty:是否默認給容器一個虛擬終端;
environment:環境變數配置,可以用陣列或字典兩種方式;
working_dir:作業目錄,登錄該容器終端時默認訪問的目錄;
command:覆寫容器啟動后默認執行的命令;
depends_on:容器啟動的先后問題;
extends:拓展使用另一yaml檔案中的內容;
networks:使用頂級配置項networks所定義的網路,容器只能在同一網路中進行互動;
- volumes:卷掛載路徑;
- 本地的目錄名稱:容器中的目錄名稱
- ports:埠映射資訊;
- “宿主機埠:容器埠”
cli客戶端節點
客戶端節點cli的環境變數配置;
orderer排序節點
排序節點orderer的環境變數配置;
peer對等節點
對等節點peer的環境變數配置;
進入docker容器
當執行到第5步,啟動docker容器后,在byfn.sh腳本的195行,使用了exec命令,執行了cli容
器里的腳本檔案,所以接下來的命令都是在cli容器中執行的;
所以,我們需要進入到cli容器中:
docker exec -it cli bash
-i :即使沒有附加也保持STDIN 打開
-t :分配一個偽終端 bash:可執行shell命令
6. 根據通道組態檔生成通道
peer 組件,可用于創建通道、節點加入、鏈碼安裝、鏈碼實體化、鏈碼互動等操作;
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx
peer channel create:創建通道;
-o:與某個排序節點連接;
-c:通道名稱;
-f:使用通道組態檔;
–tls:是否開啟TLS加密傳輸協議;
–cafile:服務端的證書檔案;
7. 將peer0.Org1節點加入通道
peer channel join -b mychannel.block
peer channel join:加入通道;
-b:參考那個起始區塊;
mychannel.block 是第6步創建通道時生成的檔案,以通道名稱命名,.block結尾;
7. 將peer1.Org1節點加入通道
cli客戶端節點,通過下圖的四個環境變數,使其默認與peer0.Org1節點連接,所以上一條命令, 我們將peer0.Org1這個節點加入了通道;

現在我們也需要修改這幾個變數,使其連接其他節點,再將節點加入通道當中,
export CORE_PEER_ADDRESS=peer1.org1.example.com:7051 peer channel join -b mychannel.block

7. 將peer0.Org2節點加入通道
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/user/Admin@org2.example.com/msp
peer channel join -b mychannel.block

7. 將peer1.Org2節點加入通道
export CORE_PEER_ADDRESS=peer1.org2.example.com:7051
peer channel join -b mychannel.block

8. 根據錨節點組態檔更新錨節點
peer channel update -o orderer.example.com:7050 -c mychannel \ -f
./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx
peer channel update:更新通道;
-o:與某個排序節點連接;
-c:通道名稱;
-f:使用通道組態檔,是第4步時生成的檔案;
–tls:是否開啟TLS加密傳輸協議;
–cafile:服務端的證書檔案;
8. 根據錨節點組態檔更新錨節點-Org2
因為我們現在連接的使peer1.Org2,所以我們先更新Org2組織的錨節點,因為我們在
configtx.yaml檔案中的Organizations里設定了peer0.org2為錨節點,所以要修改環境變數, 連接到peer0.Org2節點;
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx
8. 根據錨節點組態檔更新錨節點-Org1
因為我們現在連接的使peer0.Org2,并且我們在configtx.yaml檔案中的Organizations里設定了peer0.org1為錨節點,所以要修改環境變數,連接到peer0.Org1節點;
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx
9. 安裝鏈碼
因為我們現在連接的是peer0.Org1節點,所以我們把鏈碼安裝到這個節點上,使其成為背書節點,
peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH}
在fabric-samples/first-network/scripts/script.sh檔案里:
peer chaincode install:安裝鏈碼;
-n:鏈碼名稱,首次在這里定義;
-v:鏈碼版本號,默認1.0;
-l:鏈碼編程語言,使用golang;
-p:鏈碼目錄的路徑,為容器中的路徑,在docker-compose-cli.yaml里的cli容器,通過檔案映 射連接宿主機的鏈碼;
9. 安裝鏈碼-peer0.Org1
peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"
9. 安裝鏈碼-peer0.Org2
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
peer chaincode install -n mycc -v 1.0 -l golang -p "github.com/chaincode/chaincode_example02/go/"
10. 實體化鏈碼
實體化鏈碼,每條鏈碼只需要實體化一次,重復實體化會報錯,
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
peer chaincode instantiate:實體化鏈碼;
-o:與某個排序節點連接;
-l:鏈碼編程語言,使用golang;
–tls:是否開啟TLS加密傳輸協議;
-v:鏈碼版本號,默認1.0;
–cafile:服務端的證書檔案;
-c:傳輸給鏈碼的引數;
-C:通道名稱;
-P:背書策略;
-n:鏈碼名稱;
因為現在連接的是peer0.Org2節點,所以這里是將peer0.Org2節點的鏈碼實體化成容器,單獨運行;
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -l
golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

11. 鏈碼查詢
peer0.Org2的鏈碼實體化操作后,其他的鏈碼可以通過查詢鏈碼使其生成容器單獨運行,
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/user/Admin@org1.example.com/msp peer chaincode query -C mychannel -n mycc -c ‘{“Args”:[“query”,“a”]}’
peer chaincode query:鏈碼查詢;
-n:鏈碼名稱;
-C:通道名稱;
-c:傳輸給鏈碼的引數;
12. 鏈碼互動
鏈碼互動,應實體化時選擇了 AND背書策略,所以在發起請求時,需要用–peerAddresses 指令 發送多條請求,
peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc --peerAddresses peer0.Org1.example.com:7051 --peerAddresses peer0.Org2.example.com:7051 -c '{"Args":["invoke","a","b","10"]}'
peer chaincode invoke:鏈碼互動;
-C:通道名稱;
-o:與某個排序節點連接;
-n:鏈碼名稱;
–tls:是否開啟TLS加密傳輸協議;
-c:傳輸給鏈碼的引數;
–cafile:服務端的證書檔案;
–peerAddresses:背書節點地址;
–tlsRootCertFiles:背書節點的證書檔案;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/308927.html
標籤:區塊鏈
上一篇:檢查清單——企業估值
下一篇:CHNG時間分片獎勵發布












修改docker-compose的yaml 檔案,將TLS相關配置關閉:

















