在使用fabric-java的sdk完成動態添加組織或動態修改組織之前,我們先看一下使用cli是如何完成動態增加組織的;
為什么要先學習一下他,因為使用javasdk的方式步驟是一樣的;所以下面,我也會一步一步帶着大家使用java-sdk完成動態添加組織;
1,cp crypto-config.yaml crypto-config-addorg.yaml
修改crypto-config-addorg.yaml副本內容

使用./bin/cryptogen generate --config=./crypto-config-addorg.yaml命令生成org3的相關證書

2,修改configtx.yaml,增加組織信息

通過使用./bin/configtxgen -printOrg Org3MSP -profile ./configtx.yaml > channel-artifacts/org3.json命令,生成組織相關的json數據


3,進入org1的cli客戶端;
4,下載jq安裝工具
執行命令apt update && apt install -y jq

執行一下內容,拉取組織相關內容;
這里說一下jq,這個工具主要是json結構體處理工具。對應java中就是使用JSONObject來代替就可以。
5,獲取 mychannel 通道的最新配置塊, 可以防止重復或替換配置更改, 有助於確保並發性, 防止刪除兩個組織;
因為我這里的tls是關閉的,所以執行peer channel fetch config mychannel.pb -o orderer.example.com:7050 -c mychannel如果沒有關閉,則執行peer channel fetch config mychannel.pb -o orderer.example.com:7050 -c mychannel --tls --cafile $ORDERER_CA
前提要先執行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,定義環境變量

6,將pb內容轉換到json文件中
configtxlator proto_decode --input mychannel.pb --type common.Block | jq .data.data[0].payload.data.config > mychannel.json

7,執行以下命令,將之前生成好的org3.json和 mychannel.json追加合並到臨時文件
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' mychannel.json ./channel-artifacts/org3.json > mychannel_config.json

8,把更新前后的文件打包成二進制文件
configtxlator proto_encode --input mychannel.json --type common.Config > original_mychannel.pb
configtxlator proto_encode --input mychannel_config.json --type common.Config > modified_mychannel.pb

9,獲取增量包並且補全,轉換成二進制文件
使用工具,計算新老二進制文件,得出相差的內容;這一塊的結構體以update的信息構成;
configtxlator compute_update --channel_id mychannel --original original_mychannel.pb --updated modified_mychannel.pb > mychannel_update.pb

configtxlator proto_decode --input mychannel_update.pb --type common.ConfigUpdate > mychannel_update.json

我們將修改后的二進制文件轉碼看一下他的大概內容。
將對比后的json內容,重新構建在下述的結構體,注意這個結構體是固定格式。在提交修改交易的時候,會對其進行對象映射。有一些變化都會有問題;
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat mychannel_update.json)'}}}' | jq . > mychannel_update_envelope.json
將修改后的結構體,轉碼為pb格式
configtxlator proto_encode --input mychannel_update_envelope.json --type common.Envelope > mychannel_update_Org_envelope.pb
10,簽署並提交配置更新
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.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel signconfigtx -f mychannel_update_Org_envelope.pb

組織org2中在提交一次

執行結果:

11,獲取簽名之后通知orderer更新通道信息
peer update -f mychannel_update_Org_enevlope.pb -c mychannel -o orderer.exeample.com:7050

結果:

12,配置org3的yaml文件,啟動即可。

13,啟動
Docker-composer -f peer-org3.yaml up -d
14,jion
export CORE_PEER_LOCALMSPID="Org3MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
export CORE_PEER_ADDRESS=peer0.org3.example.com:7051
Peer channel join -b mychannel.block
15,安裝升級合約
新增的組織,想要參與交易和數據同步,必須要將合約進行升級,否則在想orderer發消息同步時,會拋角色不匹配,被拒絕同步數據




總結一下,也是為下面我們使用java-sdk完成動態增加組織或修改配置提供知識儲備:
1,通過configtxgen工具生成組織3證書,和組織3的詳細新json文件;
2,通過configtxlator獲取目標channel的pb,轉碼為json詳情
3,將org3的json和channel詳細進行合並,轉碼成最新的字節pb
4,計算新老pb,獲得將要修改的配置信息pb,再將其轉碼為json
5,將轉碼后的json,在進行格式化,組織可被fabric解析的數據結構
6,將現存的幾個組織(原channel參與的組織),對其進行簽名
7,提交到orderer,進行配置化修改
8,將org3,jion到目標channel,並安裝、升級合約;就開始同步數據
需要注意的是,此次新增的組織只對這個channel有效,若想其對其他channel也生效,就需要重復上述的操作;對新的channel進行配置化修改
