這一節主要講一下啓動fabric網絡的腳本編寫以及tps的壓測。
腳本的講解
在fabric_raft這個目錄中主要有四個腳本,分別是updown.sh
、genesis.sh
、cc.sh
以及script/official.sh
這四個腳本,其中updown.sh
腳本就是啓動或者宕掉fabric網絡,genesis.sh這個腳本比較重要的是下面幾行:
- 1.這裏是根據之前編寫好的
crypto-config.yaml
文件,通過cryptogen
二進制文件來生成證書文件,這裏需要注意的一點是cryptogen
最好是跟你要搭建的網絡的版本一致,不然生成的證書有可能有出入導致一些奇奇怪怪的錯誤,一般關於這個二進制的獲取可以直接clone fabric
的官方代碼,checkout
到自己想要的版本,然後make cryptogen
,會在 .build/bin這個目錄下生成這個二進制。 - 2.也是根據
configtx.yaml
文件,通過configtxgen
來生成證書文件,同樣的版本最好是一致的,獲取方式是通過make configtxgen
來獲得;第一行命令是生成system channel
的創世區塊;第二行是生成application channel
的通道交易配置;第三行跟第四行都是生成錨節點配置文件;這些artificials
在official.sh
腳本中都會用到。
cc.sh這個腳本就是在容器外來調用容器內部的official.sh腳本,所以它的命令就只有一行:
docker exec cli bash scripts/official.sh
這麼做的好處就是不需要進入到容器內部去執行腳本,其實相當於:
docker exec -it cli bash
bash scripts/official.sh
official.sh這個腳本講一下里面的大概邏輯。
- 第一步是組織的節點創建channel並加入channel;
在節點peer0.org1.example.com
中根據通道配置交易(就是上一步由configtxgen
生成的)創建一個channel,這時會在當前目錄下生成一個application channel
的創世區塊,即mychannel.block
,這個區塊在join channel的時候需要指定,然後就是更新錨節點,錨節點是用於組織與組織之間的通信;切換到節點peer0.org2.example.com
的環境變量使當前的節點加入到channel
中,順便提一下,cli
容器與各個節點容器是通過grpc
進行交互的,所以可以通過切換環境變量的方式來控制不同的節點。
- 第二步是安裝實例化chaincode
- 1.安裝鏈碼,所有加入某個
channel
且參與背書的節點都需要安裝鏈碼,安裝鏈碼實際上就是將鏈碼文件拷貝到本地某個目錄下,用於實例化的時候將鏈碼文件拷貝進容器中; - 2.實例化鏈碼,第一次運行這一步的時候會比較慢,原因是系統會先拉取
ccenv
鏡像,然後在此基礎之上構建出一個新的鏈碼鏡像(這個鏡像包含了鏈碼文件),然後再根據這個鏡像啓動容器;實例化鏈碼只需要一次,此後其他節點並不需要都去執行同樣的命令,其他節點只需要執行查詢或者調用鏈碼的操作,系統會自動爲當前的節點啓動一個新的鏈碼容器;重點的參數**-P**是指背書策略,包括OR,AND,NOutOf,詳細可以查看這一篇:Fabric背書策略相關概念與背書驗證過程 - 3.調用鏈碼
- 4.查詢鏈碼
壓測
壓測一開始本來是想使用fabric官方推薦的caliper,但是由於各種原因,沒搞明白[哭狀臉],所以就放棄了,使用了一個使用非常簡單的壓測小工具Stupid,下面是我對這個測試網絡的壓測的過程。
下載
git clone https://github.com/guoger/stupid.git
編譯二進制
cd stupid
go build -o stupid
編寫配置文件
新建文件stupid-config.json
vim stupid-config.json
編寫文件(sample)
{
"peer_addr": "peer0.org1.example.com:7051",
"orderer_addr": "orderer.example.com:7050",
"channel": "mychannel",
"chaincode": "mycc",
"version": "",
"args": ["invoke", "a", "b", "10"],
"mspid": "Org1MSP",
"private_key": "crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/keystore/priv_sk",
"sign_cert": "crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/signcerts/[email protected]",
"tls_ca_certs": ["crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem","crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem"],
"num_of_conn": 20,
"client_per_conn": 40
}
private_key
、sign_cert
、tls_ca_certs
填寫相對應的目錄文件, num_of_conn
這個參數是指client端與peer端、orderer端之間所建立的grpc連接數,client_per_conn
這個參數是指向一個peer發送交易提案的客戶端數目。
**注意:**把peer0.org1.example.com
跟orderer.example.com
寫到本機的hosts文件中
啓動測試
# 發起4000筆交易
./stupid stupid-config.json 4000
結果
總共耗時25秒,tps大概在157左右。
好了,整個過程大概就是這樣,接下來按照原計劃就是開始編寫chaincode。