Hyperledger fabric修改組織和通道的名稱
組織(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>
主要的操作是去自動生成證書等初始配置,以及對需要修改的配置檔案進行批量替換。目前這個指令碼只適用於單機單組織,稍作修改就可以應用於多機和多組織場景下。