向fabric網絡通道中添加組織Org3
(1)使用密鑰生成器cryptogen產生Org3的加密材料
Cryptogen generate –config=./org3-crypto.yaml
(2)使用交易配置工具configtxgen生成Org3對應的配置材料
export FABRIC_CFG_PATH=$PWD (用來告訴configtxgen 去哪兒找configtx.yaml 文件)
Configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
(3)拷貝排序節點的 MSP 材料到 Org3 的 crypto-config 目錄下
Cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
(4)更新通道配置,首先設置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
(5)獲取通道mychannel最新的配置區塊
Peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
(6)用configtxlator將通道配置解碼爲JSON格式,裁剪所有的頭部、元數據、創建者簽名等
configtxlator proto_decode –input config_block.pb –type common.Block | jq .data.data[0].payload.data.config > config.json
(7)使用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
CLI容器中目前包含兩個json文件config.json(包含Org1和Org2兩組織的配置文件)和modified_config.json(包含Org1,Org2,Org3總共3個組織的配置文件)。
(8)將config.json和modified_config.json編碼成config.pb和modified_config.pb格式
Configtxlator proto_encode –input config.json –type common.Config –output config.pb
Configtxlator proto_encode –input modified_json –type common.Config –output modified_json.pb
(9)計算兩個pb文件的差異,輸出新的pb文件,即org3_update.pb
Configtxlator compute_update –channel_id $CHANNEL_NAME –original config.pb –updated modified_config.pb –output org3_update.pb
(10)將org3_update.pb解碼成org3_update.json
Configtxlator proto_decode –input org3_update.pb –type common.ConfigUpdate | jq . > org3_update.json
(11)把之前裁剪掉的頭部信息還原回來,生成新文件org3_update_in_envelope.json
echo ‘{“payload”:{“header”:{“channel_header”:{“channel_id”:”mychannel”, “type”:2}},”data”:{“config_update”:’$(cat org3_update.json)’}}}’ | jq . > org3_update_in_envelope.json
(12)把org3_update_in_envelope.json轉換爲pb格式
Configtxlator proto_encode –input org3_update_in_envelope.json –type common.Envelope –output org3_update_in_envelope.pb
(13)分別配置Org1和Org2管理員簽名更新org3_update_in_envelope.pb
Peer channel signconfigtx -f org3_update_in_envelope.pb
切換到Org2MSP環境,然後執行
Peer channel signconfigtx -f org3_update_in_envelope.pb
(14)更新channel
Peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 –tls true –cafile $ORDERER_CA
(15)配置領導節點選舉(默認設置爲動態領導選舉)
新加入的節點是根據初始區塊啓動的,初始區塊是不包含通道配置更新中新加入的組織信息 的。因此新的節點無法利用 gossip 協議,因爲它們無法驗證從自己組織裏其他節點發送過 來的區塊,除非它們接收到將組織加入到通道的那個配置交易。新加入的節點必須有以下配 置之一才能從排序服務接收區塊:
1. 採用靜態領導者模式,將節點配置爲組織的領導者
CORE_PEER_GOSSIP_USELEADERELECTION=false
CORE_PEER_GOSSIP_ORGLEADER=true
2. 採用動態領導者選舉,配置節點採用領導選舉的方式:
CORE_PEER_GOSSIP_USELEADERELECTION=true
CORE_PEER_GOSSIP_ORGLEADER=false
(16)將org3加入通道channel-mychannel
1. 打開新的終端啓動Org3 docker compose:
Docker-compose -f docker-compose-org3.yaml up -d
2. 導出兩個關鍵變量
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
3. 向排序服務發送一個獲取 mychannel 初始區塊的請求。如果通道更新成功執行,排序服務會成功校驗這個請求中 Org3 的簽名。如果 Org3 沒有成功地添加到通 道配置中,排序服務會拒絕這個請求。
Peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME –tls –cafile $ORDERER_CA
4. 將peer0將入到通道中
peer channel join -b mychannel.block
切換環境,把peer1加入到channel中
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:12051
peer channel join -b mychannel.block
(17)升級和調用鏈碼,升級背書策略以加入Org3
在Org3cli安裝:peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
在原始cli安裝:peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
在原始cli升級背書策略: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')"
在Org3cli中查詢鏈碼:peer chaincode query -n mycc -C $CHANNEL_NAME -c '{"Args":["query","a"]}'
在Org3cli中調用鏈碼: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"]}'