fabric学习(5)——添加组织机构(1)

一个组织机构(org)是无法脱离channel孤立存在的,因此fabric中想要添加org也要修改对应的channel的配置文件才可以。

操作的思路如下:

A,生成org3的证书文件(1-3步)

B,修改要加入的channel的配置文件,把org3放进去,并得到原有channel内组织的同意(4-16步)

C,启动org3的docker容器(17步)

D,进入org3控制台,加入到channel中去(18-22步)

在first-network目录下,有个eyfn.sh脚本,执行该脚本就可以添加org3进入mychannel中,手动添加的步骤与脚本中是相同的,但为了加深印象,还是选择手动的添加org3

如果docker网络没有启动,可以使用以下命令来启动

docker-compose -f docker-compose-cli.yaml start

1,编辑org3配置文件,并生成证书

PeerOrgs:
  - Name: Org3
    Domain: org3.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

first-network/org3-artifacts/org3-crypto.yaml中已经编辑好了,直接生成证书

cd org3-artifacts
cryptogen generate --config=./org3-crypto.yaml

2,生成org3的json字符串

export FABRIC_CFG_PATH=$PWD && configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json

这条命令是自动找到当前目录下的configtx.yaml配置文件

3,拷贝order证书到org3目录下

这是由于等会要获取区块的配置信息,需要有order的tls证书

cd ../ && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/

4,进入cli容器,设置ORDERER_CA和CHENNEL_NAME的环境变量

docker exec -it cli 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

5,获取mychannel的配置区块

peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

6,把配置文件转成json,并拿出部分配置到config.json中

configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json

7,将org3的json加入到此json中,并放入modified_config.json

jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json

8,config.json转为pb

configtxlator proto_encode --input config.json --type common.Config --output config.pb

9,modified_config.json转为pb

configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

10,计算2个pb之间的增量

configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb

11,pb增量转为org3_update.json

configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json

12,加入header信息,并生成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

13,org3_update_in_envelope.json再转成pb

configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb

14,org1给新的pb签名(默认用户就是org1)

peer channel signconfigtx -f org3_update_in_envelope.pb

15,切换到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.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051

16,上传新配置(签名和上块操作合二为一)

peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA

这里需要org1和org2都签名的原因是,新的组织加入一个联盟,必须获得原来联盟内大多数人(超过50%)的同意,这里的mychannel中只有2个org,所以需要2个org都同意。

17,退出cli容器,启动org3的docker容器

org3的docker-compose.yaml配置文件在first-network目录下已经有了

这里启动了3个容器,分别是peer0.org3,peer1.org3,org3cli

exit
docker-compose -f docker-compose-org3.yaml up -d

18,进入org3的cli容器,并设置ORDERER_CA证书和CHANNEL_NAME环境变量(这就是第3步拷贝证书的原因)

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

19,请求mychannel的配置区块

peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

20,加入到channel

peer channel join -b mychannel.block

21,切换到另一peer,也加入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

22,验证是否成功

#查看channel列表
peer channel list
#查看区块高度
peer channel getinfo -c mychannel

查看channel列表可以看到已经加入mychannel,查看区块高度,也可以看出来已经同步了区块高度

由于链码没有安装,所以还是无法调用及查询链码,安装链码的过程,在后面的文章中再探讨。


转载请注明来源

×

喜欢就点赞,疼爱就打赏