Hyperledger Fabric - 官方 e2e_cli 範例快速佈署教學
e2e_cli 的場景是設定了一個簡單的 fabric 的網路場景,有兩個 Organization,有兩個 peer,並使用 solo ordering 服務
網路所有需要的加密文件,已經先放進去相對應目錄和配置文件裡面,無須自行配置
examples/e2e_cli 文件裡面包含了 docker-compose 文件和要用來創建和測試網路的腳本文件
下載 fabric 程式碼
1 | git clone https://github.com/hyperledger/fabric.git |
切換分支到 1.0
1 | git checkout release-1.0 |
編譯 configtxgen 工具
Linux 下的指令:
1 | cd $GOPATH/src/github.com/hyperledger/fabric |
會編譯出一個 configtxgen 為檔名的 binary file
路徑位於:$GOPATH/src/github.com/hyperledger/fabric/build/bin
執行腳本來執行所有任務,加快部署過程
執行該腳本會生成配置結果 本地網路 Chaincode 測試
進入 $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli 目錄
利用腳本來從 Docker Hub 拉取鏡像:
1 | # 使腳本可以執行 |
現在運行腳本,來啟動完整的網路
1 | ./network_setup.sh up <channel-ID> |
如果沒有打 channel-ID 參數,channel 默認名稱是 mychannel
錯誤採坑解決:
1 | Error: Error endorsing chaincode: rpc error: code = Unknown desc = Error starting container: API error (404): {"message":"network e2ecli_default not found"} |
解決方法:
因為 docker 預設產生的網路應該是名稱應該是 ele_cli_default
但是 ele_cli 裡面的 docker 執行腳本網路名稱卻寫 elecli_default
因此需要去更改 ele_cli 裡面的 docker 網路名稱改成 ele_cli_default
位置:$GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli/base
裡面的 peer-base.yaml 裡面有個 CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE 要改成
ele_cli_default
改完後,要關閉 docker container,在重新啟動
1 | ./network_setup.sh up down |
錯誤採坑解決:
1 | Error: Error endorsing query: rpc error: code = Unknown desc = could not find chaincode with name 'mycc' - make sure the chaincode mycc has been successfully instantiated and try again - <nil> |
解決方法:
通常出現這個錯誤 很有可能是 docker image 裡面有版本不符合 1.0 所需要的
可以用以下方式修改:
1 | ./download-dockerimage.sh -c x86_64-1.0.0 -f x86_64-1.0.0 |
會幫你的 docker image 找到 x86_64-1.0.0 的版本而不是原本它幫你下載的 x86_64-1.0.0-beta
可能是 beta 版的不符合 有夠雷 官方教學還說 ok
所以也可以在前面執行 download-dockerimages.sh 那邊不執行,改成直接去 docker pull 一個一個拉下來這樣也可以
啟動成功的畫面
1 | ===================== Query on PEER3 on channel 'mychannel' is successful ===================== |
可以透過 docker images 看到啟動哪些 Chaincode 鏡像
1 | dev-peer1.org2.example.com-mycc-1.0 latest 88cf417424ea 13 hours ago 173MB |
可以透過 docker ps 看到啟動哪些容器 會看到啟動四個 peer 容器 一個 orderer 容器 三個 Chaincode 容器
1 | dev-peer1.org2.example.com-mycc-1.0 |
可以看到 e2e_cli 資料夾裡面多了 crypto-config 跟 channel-artifacts 兩個資料夾
network_setup.sh 內容介紹
可以傳入四個參數:UP_DOWN (執行類型)、CH_NAME (頻道名稱)、CLI_TIMEOUT (用戶端逾時設定)、IF_COUCHDB (是否啟動 CouchDB 版本的 yaml 檔案)
如果沒有指定 CLI_TIMEOUT 預設為 10000
另外也指定了兩個官方準備好的 yaml 可執行檔
1 | COMPOSE_FILE=docker-compose-cli.yaml |
因為剛剛啟動沒有指定 IF_COUCHDB,因此預設執行 docker-compose-cli.yaml
該檔案位於 network_setup.sh 同級目錄下
如果執行 network_setup up 會預設執行內部的 networkUp 方法:
先判斷是否存在 crypto-config 目錄 預設情況是不存在 如果不存在 會呼叫 generateArtifacts.sh 指令來建立 crypto-config 目錄及所需的區塊練網路憑證等檔案
generateArtifacts.sh 內容介紹
要先注意前面有宣告兩個變數
1 | export FABRIC_ROOT=$PWD/../.. |
這個代表在 Fabric 跟目錄下執行 而且設定檔的路徑就在目前路徑下
裡面有三個執行方法 執行順序為:generateCerts、replacePrivateKey、generateChannelArtifacts
-
generateCerts
裡面指定了 cryptogen 檔案的路徑
也就是在 fabric/realease/linux-amd64/bin
如果裡面沒有 cryptogen 檔案 它會幫你 build 出來
這個檔案功用是為了後續執行產生排序及驗收或同步節點憑證及檔案等內容 會出現在 crypto-config 目錄中
1
$CRYPTOGEN generate --config=./crypto-config.yaml
透過以上的指令
對應的設定檔就是目前目錄下的 crypto-config.yaml
cropto-config.yaml 內容介紹
-
OrdererOrgs:排序節點的組織的定義
定義排序節點的時候會同時定義節點名稱 節點域名 以及 規範列表中節點所需的不帶域名的主機名稱
可以設定多個排序服務節點 實現排序服務的叢集部署
-
PeerOrgs:Peer 節點的組織的定義
在定義 peer 節點時 與排序節點一樣類似的設定 節點域名 名稱等等
設定有兩種方式:
- 透過規範列表來指定
- 透過範本建立的方式
第一種寫法:
在 Templaet 中指定了 Count 數量 代表意思是允許透過該範本定義建立 0~count-1 個所屬組織節點或主機
Users 則是指除了 Admin 之外的建立使用者 其下 Count 定義代表建立的使用者數量
1
2
3
4
5
6
7
8
9
10
11
12
13PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 2
Users:
Count: 1
- Name: Org2
Domain: org2.example.com
Template:
Count: 2
Users:
Count: 1第二種寫法:
在 Specs 中設定一組標準項目 每個標準項目由兩個欄位組成
1
2
3
4
5
6
7- Name: Org1
Domain: org1.example.com
Specs:
- Hostname: foo
CommonName: foo27.org5.example.com
- Hostname: bar
- Hostname: baz也就是 Hostname 跟 CommonName
Hostname 定義不帶域的主機名稱
CommonName 可選參數 可以來重新定義範本檔案名稱
預設格式為 Hostname.Domain
下面沒特別指定的話
-
-
replacePrivateKey 方法
會取代 docker-compose-e2e-template.yaml 檔案中的 CAI_PERIVATE_KEY 為目前的目錄 crypto-config/peer/Organizations/org1.example.com/ca/ 下的_sk 結尾的檔案名稱
還有取代 CA2_PERIVATE_KEY 為目前目錄 crypto-config/peerOrganizations/org2.example.com/ca/ 下的_sk 結尾的檔案名稱
最後會產生新檔案在目前資料夾下 命名為 docker-compose-e2e.yaml 在該檔案下定義了 CA 的 CERTFILE 及 KEYFILE
也透過 command 內建參數顯示啟動了 Fabric-CA 服務端
-
generateChannelArtifacts 方法
跟 generateCerts 前面一樣 確定 configtxgen 該檔案存不存在 不存在會幫你 build
最後透過該檔案來產生創世區塊 頻道檔案等資訊
它會存取該目錄下的設定檔 configtx.yaml
configtx.yaml
這裡面定義了五大資訊
- Profiles 設定檔
- Organizations 組織節點資訊
- Orderer 啟動模式
- Application 應用
- Capabilities 功能特性集合
之後判斷即將啟動的 Compose 檔案是否是 CouchDB 的
如果沒有指定 預設執行 docker-compose-cli.yaml 檔案
docker-compose-cli.yaml 檔案介紹
排序服務節點繼承了 base/docker-compose-base.yaml 中的 orderer.example.com 屬性
其他四個 peer 節點繼承了 base/docker-compose-base.yaml 中與容器名稱對應的屬性
繼承的檔案屬性,關鍵屬性如下:
- environment 設定外界的環境變數
- working_dir 目前容器啟動後的工作路徑
- volumes 外界實體機路徑掛載或指引到容器內的路徑
- ports 指定目前容器啟動後對應到實體機上的通訊 port
- depends_on 指定目前本身容器啟動後所依賴的啟動容器物件
這些節點設定資訊基本上已經滿足實際生產應用
真正使用這些服務節點進行 資料維護和管理的則是用客戶端或 SDK 來執行 也就是設定檔的 cli
直接看 cli 的 command 屬性 在 command 中指定當 cli 容器啟動後會執行目標的目錄中 scripts 目錄下的 script.sh 指令稿
Peer 節點及排序服務節點的操作分別有以下九個步驟:
-
createChannel
根據之前在 generateArtifacts.sh 指令稿中透過 configtx.yaml 設定檔產生的頻道檔案建立頻道
-
joinChannel
Peer 節點加入指定頻道
-
updateAnchorPeers
為頻道中的每個組織設定 Peer 節點
-
installChaincode
在 Peer0/Org1 和 Peer2/Org2 上安裝智慧合約
-
instantiateChaincode
在 Peer2/Org2 上對智慧合約進行實例化操作
-
chaincodeQuery
在 Peer0/Org1 上執行智慧合約中的查訊方法
-
chaincodeInvoke
在 Peer0/Org1 上執行智慧合約中的交易方法
-
installChaincode
在 Peer3/Org2 上安裝智慧合約
-
chaincodeQuery
在 Peer3/Org2 上執行智慧合約中的查詢方法
智能合約需要在每一台 Peer 節點伺服器上執行一次安裝操作 而智慧合約的產生實體操作與安裝合約不同 產生實體指需要執行一次即可 即假設有四台 Peer 節點伺服器 如果這四台節點伺服器都有執行同一份智慧合約的需求 則都需要執行一次智慧合約的安裝操作 但產生實體智慧合約只需要在其中任意一台就能完成 多次產生實體沒有額外的意義
同時執行智慧合約產生實體操作時需要確認背書方案 所謂背書就是對目前合約執行寫入的許可權控制方案 背書支援 and 和 or 的單例或混合撰寫方案
query 是執行合約但不發送讀寫集到排序服務
invoke 是既執行合約又同時把 Peer 節點傳回的讀寫集發送至排序服務形成資料寫入操作 最後產生區塊並同步到所有節點
介紹 script.sh
這個是 e2e_cli 中真正對 peer 節點 頻道 智能合約集合操作示範
一些需要注意的指令及坑
停止網路指令
1 | ./network_setup.sh down |
這個會刪除所有 docker container 跟 相關的 docker image
刪除所有 docker image
1 | docker rmi -f $(docker images -q) |
network_setup.sh 坑
./network_setup.sh 這個腳本執行 如果你沒有相對應的 image 檔案
也會自動幫你下載 但注意 這邊它會幫你自動下載最新版本的 image
因此就會有版本不符合的錯誤
最好解決辦法 親自用 docker pull image 下來 是最保險的
基本上需要的 docker image 有
-
hyperledger/fabric-tools
-
hyperledger/fabric-couchdb
-
hyperledger/fabric-kafka
-
hyperledger/fabric-zookeeper
-
hyperledger/fabric-orderer
-
hyperledger/fabric-peer
-
hyperledger/fabric-javaenv
-
hyperledger/fabric-ccenv
-
hyperledger/fabric-ca
-
hyperledger/farbic-baseos
注意,這個 image 執行 network_setup.sh 會自動幫你下載
這個版本會是對的 所以它幫你下載 是 ok 的
執行不會出錯
此外以上的 image 必須 tag 設置為 latest
否則 network_setup.sh 會自動判斷如果沒有 tag 為 latest 的 image
它會幫你自動下載 就會出錯!
注意 image 之版本問題
- hyperledger/fabric-couchdb 沒有 x86_64-1.1.0 版本
- hyperledger/fabric-kafka 沒有 x86_64-1.1.0 版本
- hyperledger/fabric-zookeeper 沒有 x86_64-1.1.0 版本
以上這三個 image 不必跟著 fabric source code 的版本跟著跑
基本上抓 latest 就可以 執行不太會出錯 有相容
其他 image 要跟著 fabric source code 的版本 才不會執行出錯
執行其他版本該注意事項
- image 版本要跟著 fabric source code 版本
- 有些 image 抓 latest 即可
- 將上述的錯誤採坑解決方法走過一遍
就開心執行 ^^
最後最後!請聽我一言!
如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!