Fabric--configtxlator转换配置添加组织到channel
configtxlator轉換配置/添加Org組織到channel
設置環境
進入到fabric-samples/first-network目錄中, 執行.byfn.sh -m down關閉網絡,清理之前的任何環境
$ cd $HOME/hyfa/fabric-samples/first-network/ $ sudo ./byfn.sh -m down重新生成默認的BYFN構件
$ sudo ./byfn.sh -m generate啟用網絡
$ sudo ./byfn.sh -m up添加組織Org3
使用eyfn.sh腳本將Org3引入網絡
$ sudo ./eyfn.sh up從輸出中可以看到添加的Org3加密資料,配置更新正在創建和簽名,然后鏈接代碼被安裝以允許Org3執行分類賬查詢
如果執行成功, 會有如下輸出
========= All GOOD, EYFN test execution completed =========== _____ _ _ ____ | ____| | \ | | | _ \ | _| | \| | | | | | | |___ | |\ | | |_| | |_____| |_| \_| |____/進入CLI容器
$ sudo docker exec -it cli bash導出 ORDERER_CA 與 CHANNEL_NAME 變量:
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel檢查環境變量是否正確設置:
echo $ORDERER_CA && echo $CHANNEL_NAME如果重新啟動了CLI容器,則必須重新導出兩個環境變量
查詢
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'查詢結果: Query Result: 80
調用,實現從a到b轉賬
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'查詢
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'查詢結果: Query Result: 70
手動實現配置:
如果使用了eyfn.sh腳本,則需要將網絡關閉.刪除所有容器并撤銷添加Org3所做的操作
在 fabric-samples/first-network/目錄中執行如下命令:
$ sudo ./eyfn.sh down $ sudo ./byfn.sh -m down $ sudo ./byfn.sh -m generate $ sudo ./byfn.sh -m up生成Org3加密材料
從 frist-network 目錄轉至 org3-artifacts 目錄中
% cd org3-artifacts生成加密材料
$ sudo ../../bin/cryptogen generate --config=./org3-crypto.yaml為Org3 CA以及與此新Org綁定的兩個對等生成密鑰和證書
新生成的文件被保存在當前目錄下新生成的文件夾 crypto-config 中
使用 configtxgen 工具以JSON輸出Org3特定的配置材料到指定的文件中
$ export FABRIC_CFG_PATH=$PWD $ sudo ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json該文件包含Org3的策略定義,以及以Base 64格式提供的三個重要證書:admin用戶證書(稍后將用作Org3的管理員),CA根證書和TLS根證書證書
后面會將這個JSON文件附加到通道配置中
$ cd ../ $ sudo cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/將Orderer Org的MSP材料移植到Org3 crypto-config目錄中
更新通道配置
進入CLI容器
$ sudo docker exec -it cli bash安裝jq工具
jq可以將所需要的數據格式轉換成任意的數據格式
jq工具允許腳本與configtxlator工具返回的JSON文件進行交互
apt update && apt install -y jq參數說明:
-y: 忽略安裝時的提示
導出 ORDERER_CA 與 CHANNEL_NAME 變量:
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel檢查環境變量是否正確設置:
echo $ORDERER_CA && echo $CHANNEL_NAME如果重新啟動了CLI容器,則必須重新導出兩個環境變量
獲取配置
獲取 mychannel 通道的最新配置塊, 可以防止重復或替換配置更改, 有助于確保并發性, 防止刪除兩個組織
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA上述命令將二進制protobuf通道配置塊保存到 config_block.pb , (文件名及擴展名命名無限制)
?
轉換配置為JSON
利用 configtxlator 工具將此通道配置塊解碼為JSON格式, 刪除所有與想要改變的內容無關的標題,元數據,創建者簽名等等
通過 jq 工具來完成
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json.data.data[0],payload.data.config域內數據代表了完整的通道配置信息
查看config.json文件中的內容
more config.json使用jq將Org3配置定義追加org3.json到通道的應用程序組字段,并命名輸出modified_config.json
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json將 config.json 中的內容輸出為 config.pb
configtxlator proto_encode --input config.json --type common.Config --output config.pb將 modified_config.json 中的內容輸出為 modified_config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb利用這兩個配置文件, 使用configtxlator計算出更新配置時的更新量信息。該命令將輸出一個新的二進制文件,命名為org3_update.pb:
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb將 org3_update.pb 中的內容解碼為可編輯的JSON格式并將其稱為org3_update.json
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json對通道配置進行更新時, 還需要封裝為 org3_update_in_envelope 結構的配置更新交易. 因此, 需要將 org3_update 結構數據進行補全
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json將其轉換為Fabric所需的二進制交易配置文件。命名為最終更新對象org3_update_in_envelope.pb
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb簽署并提交配置更新
peer channel signconfigtx -f org3_update_in_envelope.pb導出Org2環境變量:
export CORE_PEER_LOCALMSPID="Org2MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspexport CORE_PEER_ADDRESS=peer0.org2.example.com:7051更新通道
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA命令執行后會有如下輸出: Successfully submitted channel update
新終端中(終端2)中輸出日志
打開一個新的終端(終端2)執行如下命令:
$ sudo docker logs -f peer0.org1.example.com將Org3加入到通道
打開一個新的終端(終端3), 從 first-network 中啟動Org3 docker compose
$ cd hyfa/fabric-samples/first-network/ $ sudo docker-compose -f docker-compose-org3.yaml up -d進入Org3特定的CLI容器中:
$ sudo docker exec -it Org3cli bash導出環境變量:
export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel檢查變量 :
echo $ORDERER_CA && echo $CHANNEL_NAME檢索該塊:
peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA發出命令并通過創世區塊:
peer channel join -b mychannel.block導出TLS與ADDRESS變量并重新發布
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/ca.crt && export CORE_PEER_ADDRESS=peer1.org3.example.com:7051peer channel join -b mychannel.block升級并調用Chaincode
在Org3的CLI中執行(終端3):
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/終端1中執行
使用Org2管理員身份提交了頻道更新通話(在終端1中執行):
export CORE_PEER_LOCALMSPID="Org2MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/mspexport CORE_PEER_ADDRESS=peer0.org2.example.com:7051安裝
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/切換為Org1身份:
export CORE_PEER_LOCALMSPID="Org1MSP"export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspexport CORE_PEER_ADDRESS=peer0.org1.example.com:7051再次安裝:
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/發送電話:
peer chaincode upgrade -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"如果報如下錯誤:
Error: Error getting broadcast client: failed to load config for OrdererClient: unable to load orderer.tls.rootcert.file: open /etc/hyperledger/fabric/-C: no such file or directory 則需要檢查 echo $ORDERER_CA && echo $CHANNEL_NAME 變量是否正確設置export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem && export CHANNEL_NAME=mychannel通過v標志指定新版本。可以看到Org3添加到背書政策中
與實例化調用一樣,鏈式代碼升級需要使用該init 方法
終端3中執行
升級調用將新的塊 - 塊6 - 添加到頻道的分類賬中,并允許Org3同行在認可階段執行交易。跳回Org3 CLI容器(終端3)并發出一個查詢值a:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'在終端1與終端3中通過,正確顯示查詢結果: Query Result: 90
調用,實現從a到b轉賬(終端3):
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'查詢:
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'在終端1與終端3中通過,正確顯示查詢結果: Query Result: 80
總結
以上是生活随笔為你收集整理的Fabric--configtxlator转换配置添加组织到channel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--使用多通道
- 下一篇: Fabric--CA 应用与配置