我們接着上一節來講;
在熟悉動態增加組織或修改配置的步驟后,我們就可以使用java的api來完成動態增加組織或修改配置了;
廢話不多說,直接上干貨;
1,預制條件
org3的證書以及組織3的MSP詳情信息,需要提前准備(如果不清楚的,可以回頭看一下上一章)
fabric-java-sdk 1.2 我這里使用的是1.2版本,更高版本基本相同,沒有什么大變化
2,啟動configtxlator工具的rest服務
准備configtxlator工具,你可以通過源碼編譯或在網上自己下載
執行 ./configtxlator start命令,默認端口是7059

3,創建通道鏈接

4, 獲取通道配置字節碼
byte[] mychannelConfig = channel.getChannelConfigurationBytes();
這一步對應的是peer channel fetch config命令生成后的pb文件
5,將字節碼轉化為json

通過configtxlator 工具提供的decode方法,解碼的消息類型為 common.Config
6,讀取org3.json內容

7,將組織3的內容和channel當前的配置信息合並
當前配置信息的結構體如下圖,我們可以使用JSONObject來代替cli客戶端的jq工具來操作json內容

8,將合並后的json文件,編碼成字節碼

將json文件提交給configtxlator 工具提供的encode方法,解碼的消息類型為 common.Config

這一段邏輯就相當於是將修改后的json,轉化為pb文件的邏輯
9,在第4步中,我們獲取過通道的字節碼,而這里我們有修改后的字節碼,只要對這兩個做一次對比;就可以獲取到需要修改的部分內容;

依舊使用configtxlator工具,而這時候需要調用的是計算接口:compute,消息類型為:update-from-configs

10,構建修改配置,向orderer發送變更交易了;
這里大家可能有個疑惑,不是要需要其他組織簽名的嗎?是不是少了一步?
當前需要簽名,而這也是使用api的一個好處,他幫我們做了好多事情;先看一下下面的這段代碼,有幾點注意點:

注意點:
a),通道的updateChannelConfiguration方法,第二個參數是無邊界的數組;

b)這個參數,就是各個組織的修改提供的簽名人。上面是動態增加組織的,如果是修改配置的話;比如修改區塊大小信息,那么這里主要傳一個orderer的用戶就可以;
c)是不是什么用戶都可以進行提交修改?當然不是,必須是admin;
d)此方法,是沒由返回值的,所以只能通過異常捕獲,或使用斷言的方法,來判斷你的修改是否成功了;
備注:channel,在提交修改的sendUpdateChannel方法中,動態幫我們組裝了echo '{"payload":{"header":{"channel_header":... 這個段邏輯。這也解釋了上述的那個問題。

11,判斷是否修改成功

主要再獲取一下最新的通道配置,檢查一下你新增的組織是否在這個json對象中即可;
12,其他步驟,就不在追溯了,后面要做的就是,組織jion、安裝/升級合約.這樣組織3才會更新數據。否則會被orderer拒絕訪問同步。在orderer端,你會看到需要Org1MSP/Org2MSP,但獲取到是Org3MSP的異常;
我使用是是couchdb,數據已經同步。ok完成動態新增組織;動態修改配置,其實是一個步驟。就不在追溯了;

備注:
當前這一章中提到了configtxlator工具,但並沒有過多的對其進行詳細說明,后面我們花一章時間對他做一個說明;
