思路:
使用 configltxlator 可以將配置區塊的二進位制轉換為 JSON ,然後修改JSON,增加ORG,再使用這個工具生成一個增量區塊。再配合 peer channel update 命令,實現對原有的配置更新,最後啟動新的組織的節點,把各個節點加入到通道中。
說明:
本文中都是以e2e網路,啟動的整個fabric,並且關閉了TLS證照。
工具:
1.JQ :用來通過指令碼處理與configlator 返回的JSON 互動,既可以格式化JSON資料
2.CURl
3.configtxlator:該工具能夠在不同的等效資料在表示/格式之間輕鬆轉換,可以基於兩組不同的配置交易之間的區別來計算配置更新
步驟:
- 檢索當前配置。
- 使用 configtxlator 將該配置解碼為 JSON 配置的人類可讀版本。
- 提取 config 節。
- 提取的 config 節上執行自動或手動編輯,以建立新配置。
- 使用 configtxlator 對更新後的和原始的配置進行編碼。
- 將它們傳送到 configtxlator 以計算配置更新增量,也就是對配置的更改。
- 對配置更新進行解碼並將它包裝在一個配置更新envelope中。
- 建立新配置交易。
- 提交新的已簽名配置交易來更新通道
- 配置新的組織的證照檔案crypto.yaml,利用cryptogen生成新的組織的證照
- 配置新的組織的啟動檔案docker-compose.yaml,啟動新的組織裡的節
- 把新組織的節點加入到通道中。
1.開啟configtxlator
configtxlator start &
2.進入cli 獲取通道的當前配置區塊
docker exec -it cli bash
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c mychannel
3.使用 configtxlator 工具將二進位制 protobuf 渠道配置塊資訊解碼為人類可讀的文字 JSON 格式。使用 file 命令驗證 JSON 檔案的已解碼內容,看看是否已成功解碼:
curl -X POST --data-binary @config_block.pb http://127.0.0.1:7059/protolator/decode/common.Block > config_block.json
(curl 操作要注意出現 failed to connect to 127.0.0.1 prot 7059:Connection refused.
出現的原因是:用docker啟動的CLI網路和configtxlator不在同一個網路裡面。
解決方案是:先把config_block.pb檔案移動到docker容器和系統的對映檔案都可以訪問的到的資料夾:channel-artifacts裡面,然後再退出cli。
因為我本地專案是用e2e啟動的整個網路。)
使用file 命令驗證json檔案的已解碼內容,檢視是否解碼成功
file *.json
4.從應用程式渠道 mychannel 的已解碼渠道配置塊中提取資料的載荷資料節的配置節,然後驗證是否已正確且成功地提取:
jq .data.data[0].payload.data.config config_block.json > config.json
5.對提取的配置節進行編輯,以建立新配置
把config.json 檔案複製一份,改成updated_config.json,在裡面配置要新增的的組織,複製Org1的配置即可,修改對應的細節。
6.使用 configtxlator 編碼原始的和修改後的配置。
使用該工具將應用程式 mychannel 的原始配置編碼為 protobuf,然後驗證是否已正確編碼
curl -X POST --data-binary @config.json http://127.0.0.1:7059/protolator/encode/common.Config > config.pb
使用該工具將應用程式渠道 mychannel 的修改後的配編碼為 protobuf,然後驗證是否已正確編碼
curl -X POST --data-binary @updated_config.json http://127.0.0.1:7059/protolator/encode/common.Config > updated_config.pb
7.將它們傳送到 configtxlator 來計算配置更新增量:
執行以下命令來計算配置更新,它們是使用該工具在應用程式 mychannel 的原始和修改後的通道配置間的過渡。驗證計算的配置更新是否正確
curl -X POST -F original=@config.pb -F updated=@updated_config.pb http://127.0.0.1:7059/configtxlator/compute/update-from-configs -F channel=mychannel > config_update.pb
8.解碼配置更新並將它包裝在一個配置更新 envelope中
curl -X POST --data-binary @config_update.pb http://127.0.0.1:7059/protolator/decode/common.ConfigUpdate > config_update.json
採用 JSON 格式為配置更新訊息建立一個envelope中,驗證envelope建立步驟是否已成功完成,如圖 14 所示。
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel","type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' > config_update_as_envelope.json
9.建立新配置交易
將配置更新訊息編碼為 protobuf 格式,驗證編碼操作是否已成功完成,
curl -X POST --data-binary @config_update_as_envelope.json http://127.0.0.1:7059/protolator/encode/common.Envelope > config_update_as_envelope.pb
10.提交新的已簽名配置交易來更新通道
用組織1(Org1)執行以下命令來對配置更新交易進行簽名。 此命令將該交易的一個簽名新增到檔案系統中的合適位置。
peer channel signconfigtx -f config_update_as_envelope.pb -o orderer.example.com:7050
用組織2(Org2)執行以下命令來提交配置更新交易。在將配置更新提交到orderer之前,update 命令自動將使用者的簽名新增到配置更新上(所以不需要第二次使用 signconfigtx)
peer channel update -f config_update_as_envelope.pb -o orderer.example.com:7050 -c mychannel
(這裡要用不同的組織來進行簽名和更新操作,應該是背書策略中的組織都要對最新的配置交易簽名,而 update 操作會先把簽名新增到配置上,所以執行 update 命令的組織不要執行簽名的操作)
檢視組織是否新增成功:
執行以下命令來抓取更新的當前配置
peer channel fetch config config_block_Org3MSP.pb -o orderer.example.com:7050 -c mychannel
執行以下命令來解碼成功更新的當前通道配置,然後驗證更新操作,
curl -X POST --data-binary @config_block_Org3MSP.pb http://127.0.0.1:7059/protolator/decode/common.Block > config_block_Org3MSP.json
11. 組織更新完成之後,再e2e_cli目錄下新建組織的crypto.yaml 配置檔案,利用cryptogen工具生成新的組織證照。
./cryptogen generate --config=./org3-crypto-config.yaml
再把新生成的組織的證照資料夾放到crypto-config/peerORganizations/目錄下
12.再e2e_cli目錄下建立新組織的啟動檔案 dockers-compose-cli-org3.yaml
用docker-compose -f docker-compose-cli-org3.yaml up -d 命令啟動
13. 進入新組織的CLI,將組織的節點加入到通道中
peer channel join -b ./mychannel.block