組織(Org)和通道(Channel)的名稱是fabric網絡比較重要的兩個配置參數,在fabric提供的示例中都已經設置好了這兩個參數,一般組織名為"Org1"和"Org2",通道名為"mychannel"。而在實際應用開發中通常需要自定義組織和通道的名稱,這里以最接近實際應用的balance-transfer為例說明如何自定義設置組織和通道名稱。
前言
Fabric網絡在啟動前會通過二進制工具cryptogen和configtxgen生成成員的證書目錄、排序創世區塊以及通道配置交易,組織和通道名稱會在此時被寫入配置信息中去。
所以如果想自定義設置這兩個參數,需要重新生成這些配置信息,以及修改其他有關的配置文件以及應用程序代碼。
balance-transfer是fabric-samples中的一個示例,基於fabric Node SDK實現了一個較為完整的應用程序,這里選擇的是v1.0.0版本。
一、獲取工具cryptogen和configtxgen
下載cryptogen
和configtxgen
這兩個工具的方法在first-network示例中已經介紹,除了這種從網絡直接下載的方法,還可以在fabric項目中手動編譯獲得。
cd ~/go/src/github/hyperledger/fabric // 進入fabric目錄
make cryptogen && make configtxgen // 編譯生成工具
工具生成於fabric/build/bin
目錄下,移動至.../fabric-samples/balance-transfer/artifacts/channel
目錄下供后續使用。
二、修改cryptogen.yaml和configtx.yaml配置文件
這兩個文件存放在bartifacts/channel
目錄下的,作用是配合上述工具生成網絡初始化的配置信息。
改動很簡單,將文件中的"Org1"和"Org2"分別替換成想要設置的組織名稱即可。
三、生成證書目錄,創世區塊和通道配置交易
在artifacts/channel
目錄下執行以下命令生成配置信息。
rm -rf crypto-config genesis.block mychannel.tx //刪除原有配置
./cryptogen generate --config=./cryptogen.yaml
./configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesis.block
./configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./airtrip-union.tx -channelID newchannel
注:如果需要修改通道名稱,只需要在此步的--channelID
參數后指定channel名稱(默認是mychannel),然后修改balance-transfer目錄下的config.json文件,替換channelName
參數即可完成通道名稱的修改。
完成后會在channel目錄下生成新組織名的crypto-config
目錄,genesis.block
以及newchannel.tx
四、修改網絡配置文件network-config.json
該文件路徑為app/network-config.json
,文件中主要設置了網絡各節點的ip和port信息,以及所屬的組織。
同樣,需要把這個文件中所有與組織名稱有關的參數進行替換,注意不要遺漏了其中相關證書路徑的修改。
五、修改CA服務器配置文件
這個文件的改動過程比較復雜,因為它是在CA節點啟動時在內部自動生成的,想要修改只能夠先將內容復制到外部進行改動,再映射到內部達到覆蓋的效果。
該文件位於CA節點的文件系統中,需要在啟動CA節點后進入容器內部:
docker exec -it ca_peerOrg1 // 假設此時還未修改組織名稱
cat /etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml
打開該文件找到affiliations
部分如下:
affiliations:
org1:
- department1
- department2
org2:
- department1
發現這里把組織名稱固定了,如果不修改,則會在用戶注冊時報錯。首先需要在宿主機的artifacts
目錄下新建一個fabric-ca-server-config.yaml文件,然后將節點內部通過cat打印的整個文件內容復制上去,並且將affiliations部分的組織名修改成想要設置的名稱。
這樣,新的ca配置文件就在容器外部生成了,在下一步驟會將其映射到容器內部,這樣可以覆蓋自動生成的配置文件,從而達到修改的目的。
六、修改容器配置文件docker-compose.yaml
1.首先將docker-compose.yaml中所有需要修改的組織名稱進行批量替換。
2.將CA節點配置的environment
部分的CA KEYFILE
和TLS KEYFILE
值最后的私鑰文件名(以_sk結尾)改成crypto-config/peerOrganizations/orgname.example.com/ca
目錄下的私鑰文件名稱,其中orgname是設置的新組織名稱。
這一步是因為我們重新生成了msp目錄crypto-config,所以私鑰路徑也發生了改變,不重新設置的話CA節點會因為找不到對應文件而啟動失敗。
3.設置CA服務器配置文件。將上一步重新生成的CA配置文件映射到容器內部,需要在volumes
部分添加一行:
- ./fabric-ca-server-config.yaml:/etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml
七、修改應用程序代碼
1.修改app/helper.js
helper.js最開始的一段全局代碼中有如下語句:
for (let key in ORGS) {
if (key.indexOf('org') === 0) {
...
}
}
ORGS對象是從network-config.json中讀取的所有組織信息,鍵分別為"orderer", "org1"和"org2"(未修改前),這一段循環的意思是對orderer除外的其他組織進行操作,但是很顯然這里的if語句默認針對的是org1和org2,而我們修改了組織名稱之后直接就失效了。
所以應該將if語句改為
if (key != 'orderer') {...}
2.修改啟動及測試腳本
最后需要把啟動腳本runApp.sh和testApp.sh中和組織名、通道名有關的變量進行修改,改完后分別啟動這兩個腳本就可以完成新網絡的啟動及測試,這時候就可以發現組織和通道的名稱已經改成了我們自定義設置的內容啦!
腳本一鍵配置
沒想到修改兩個小小的參數竟然需要如此多繁瑣的步驟,牽扯到這么多的配置文件,屬實有點抽象。關於這個問題我寫了一個能夠一鍵執行完成以上操作的腳本,地址為https://github.com/zhayujie/fabric-tools。執行如下命令就可以設置整個項目的組織和通道名稱:
./set_config.sh <orgName> <channelName>
主要的操作是去自動生成證書等初始配置,以及對需要修改的配置文件進行批量替換。目前這個腳本只適用於單機單組織,稍作修改就可以應用於多機和多組織場景下。