Fabric2.0 如何添加组织
Fabric2.0 添加组织依然是通过配置来实现。
从[更新通道配置](https://learnblockchain.cn/article/693)的思路来看,动态添加组织实践上也是通过修改区块配置来实现, 接下来的操作基于[first-network已部署好的网络](https://learnblockchain.cn/article/581)。 ## 1. 新增org3证书配置 对于Fabric 网络来说,要新增一个组织,首先是从证书开始,因为证书就是 Fabric 里面的身份。 编辑证书配置org3-crypto.yaml(first-network/org3-artifacts) ``` PeerOrgs: # --------------------------------------------------------------------------- # Org3 # --------------------------------------------------------------------------- - Name: Org3 Domain: org3.example.com EnableNodeOUs: true Template: Count: 2 Users: Count: 1 ``` 配置了Org3组织 2 个节点及1个普通用户User 执行以下命令,生成证书: ```bash cd org3-artifacts/ ../../bin/cryptogen generate --config=org3-crypto.yaml --output="../crypto-config" ``` 执行完成后查看…/crypto-config/peerOrganizations目录可以看到新增的组织证书目录: ![动态添加组织](https://img.learnblockchain.cn/2020/02/59A17AF408.png) ## 2. 新增org3组织定义到区块链 之前我们启动的网络的时候,在启动前需要创建创始区块与通道配置,因此在为了让区块链知道这个新来的组织,需要把组织的配置添加到区块配置中: 配置文件在:`~/first-network/org3-artifacts/configtx.yaml` 注意证书目录必须对应正确的org3证书目录 ![动态添加组织](https://img.learnblockchain.cn/2020/02/6874122EB4.png) 在first-network目录控制台输入以下命令生成org3定义: ``` export FABRIC_CFG_PATH=$PWD bin/configtxgen -printOrg Org3MSP -configPath org3-artifacts > channel-artifacts/org3.json ``` ![动态添加组织](https://img.learnblockchain.cn/2020/02/BECF685ACA.png) ## 3.启动org3相关节点容器 容器配置 `~/first-network/docker-compose-org3.yaml` 执行以下命令启动: ``` docker-compose -f docker-compose-org3.yaml up -d ``` `docker ps -a |grep org3` 查看状态: ![动态添加组织](https://img.learnblockchain.cn/2020/02/349B514159.png) 启动失败了,查看日志如下: `Cannot run peer because error when setting up MSP of type bccsp from directory /etc/hyperledger/fabric/msp: could not load a valid signer certificate from directory /etc/hyperledger/fabric/msp/signcerts: stat /etc/hyperledger/fabric/msp/signcerts: no such file or directory` 从错误来看就是找不到证书,这时候看看docker-compose-org3.yaml,目录在`org-artifacts`下,我们之前是放在first-network/crypto-config下的,为了方便原本cli切换环境变量。 ![动态添加组织](https://img.learnblockchain.cn/2020/02/0BEEF70603.png) 知道目录错了修改为正确目录即可 ![动态添加组织](https://img.learnblockchain.cn/2020/02/F634DB9CF6.png) 删除错误容器: ``` docker-compose -f docker-compose-org3.yaml rm ``` 重新启动: ``` docker-compose -f docker-compose-org3.yaml up -d ``` 再次查看容器状态成功启动: ![动态添加组织](https://img.learnblockchain.cn/2020/02/EE2F2B9B91.png) 看到还多启动了一个Org3cli容器,是org3环境变量的cli,可以不起的,不过启动了就启动了. ## 4. 更新通道配置 接下需要将org3添加到通道里面,步骤与[Fabric2.0 更新通道配置](https://learnblockchain.cn/article/693)差不多。 `Org3cli`是默认org3配置的cli容器,不用白不用。 进入org3cli `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 ``` ### 4.1 获取配置 将配置切换成org1,因为当前org3不能获取当前通道最新配置 ``` 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 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 ``` 输入以下命令获取最新块: ``` peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA ``` 获取到第8块区块 ![动态添加组织](https://img.learnblockchain.cn/2020/02/EFCB13C777.png) ### 4.2 修改配置 将pb文件转json ```bash configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json ``` 将之前org3的配置org3.json添加到config.json 先把之前生成的org3.json放进去Org3cli容器 打开新的控制台,宿主机输入: ```bash docker cp channel-artifacts/org3.json 6b9b3f2a22c4:/opt/gopath/src/github.com/hyperledger/fabric/peer ``` 6b9b3f2a22c4: Org3cli容器id Org3cli容器: ```bash jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json org3.json > modified_config.json ``` ![动态添加组织](https://img.learnblockchain.cn/2020/02/DB666FB85A.png) 将config.json 跟modified_config.json 转pb编码 ```bash configtxlator proto_encode --input config.json --type common.Config --output config.pb configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb ``` 计算两个pb差异: ```bash configtxlator compute_update --channel_id mychannel --original config.pb --updated modified_config.pb --output org3_update.pb ``` 将更新的pb解析为json ```bash configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json ``` 现在我们有一个解码后的更新文件org3_update.json,我们需要将其包装在信封消息中。此步骤将使我们返回之前删除的header字段。我们将这个文件命名为org3_update_in_envelope.json: ```bash echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json ``` 使用我们正确格式的JSON – org3_update_in_envelope.json我们将configtxlator最后一次使用该工具,并将其转换为Fabric所需的完整protobuf格式。我们将命名我们的最终更新对象org3_update_in_envelope.pb: ``` configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb ``` ### 4.3 签名并提交更新配置 添加组织需要目前通道大部分的组织Admin签名,目前Org3cli的环境变量是org1 输入以下命令: ``` peer channel signconfigtx -f org3_update_in_envelope.pb ``` 切换环境为org2执行更新配置,因为update也会为当前组织签名,所以不需要再org2签名 ```bash 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:9051 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 ``` 更新命令: ```bash peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA ``` 更新成功 ![动态添加组织](https://img.learnblockchain.cn/2020/02/0EA2F64CB5.png) ## 5. org3加入通道 切换成org3环境变量 ```bash export CORE_PEER_LOCALMSPID=Org3MSP export CORE_PEER_ADDRESS=peer0.org3.example.com:11051 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 ``` 获取mychannel 0号块创始块: ``` peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA ``` ![动态添加组织](https://img.learnblockchain.cn/2020/02/107CED89FE.png) 该命令将创世块返回到名为的文件mychannel.block。现在,我们可以使用此块将org3的节点加入通道。 输入以下命令: ```bash peer channel join -b mychannel.block ``` 通过peer channel list 验证 ![动态添加组织](https://img.learnblockchain.cn/2020/02/22C05EE6C9.png) ## 6. 总结 动态组织加入大概就是这样,想必删除组织也是相似的,洞悉Fabric的配置原理就可以应对大部分fabric的应用需求。 转自:[Mark_MMXIX](https://blog.csdn.net/qq_28540443)
从更新通道配置的思路来看,动态添加组织实践上也是通过修改区块配置来实现, 接下来的操作基于first-network已部署好的网络。
1. 新增org3证书配置
对于Fabric 网络来说,要新增一个组织,首先是从证书开始,因为证书就是 Fabric 里面的身份。
编辑证书配置org3-crypto.yaml(first-network/org3-artifacts)
PeerOrgs:
# ---------------------------------------------------------------------------
# Org3
# ---------------------------------------------------------------------------
- Name: Org3
Domain: org3.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
配置了Org3组织 2 个节点及1个普通用户User
执行以下命令,生成证书:
cd org3-artifacts/
../../bin/cryptogen generate --config=org3-crypto.yaml --output="../crypto-config"
执行完成后查看…/crypto-config/peerOrganizations目录可以看到新增的组织证书目录:
2. 新增org3组织定义到区块链
之前我们启动的网络的时候,在启动前需要创建创始区块与通道配置,因此在为了让区块链知道这个新来的组织,需要把组织的配置添加到区块配置中:
配置文件在:~/first-network/org3-artifacts/configtx.yaml
注意证书目录必须对应正确的org3证书目录
在first-network目录控制台输入以下命令生成org3定义:
export FABRIC_CFG_PATH=$PWD
bin/configtxgen -printOrg Org3MSP -configPath org3-artifacts > channel-artifacts/org3.json
3.启动org3相关节点容器
容器配置 ~/first-network/docker-compose-org3.yaml
执行以下命令启动:
docker-compose -f docker-compose-org3.yaml up -d
docker ps -a |grep org3
查看状态:
启动失败了,查看日志如下:
Cannot run peer because error when setting up MSP of type bccsp from directory /etc/hyperledger/fabric/msp: could not load a valid signer certificate from directory /etc/hyperledger/fabric/msp/signcerts: stat /etc/hyperledger/fabric/msp/signcerts: no such file or directory
从错误来看就是找不到证书,这时候看看docker-compose-org3.yaml,目录在org-artifacts
下,我们之前是放在first-network/crypto-config下的,为了方便原本cli切换环境变量。
知道目录错了修改为正确目录即可
删除错误容器:
docker-compose -f docker-compose-org3.yaml rm
重新启动:
docker-compose -f docker-compose-org3.yaml up -d
再次查看容器状态成功启动:
看到还多启动了一个Org3cli容器,是org3环境变量的cli,可以不起的,不过启动了就启动了.
4. 更新通道配置
接下需要将org3添加到通道里面,步骤与Fabric2.0 更新通道配置差不多。
Org3cli
是默认org3配置的cli容器,不用白不用。
进入org3cli 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
4.1 获取配置
将配置切换成org1,因为当前org3不能获取当前通道最新配置
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
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
输入以下命令获取最新块:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
获取到第8块区块
4.2 修改配置
将pb文件转json
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
将之前org3的配置org3.json添加到config.json 先把之前生成的org3.json放进去Org3cli容器
打开新的控制台,宿主机输入:
docker cp channel-artifacts/org3.json 6b9b3f2a22c4:/opt/gopath/src/github.com/hyperledger/fabric/peer
6b9b3f2a22c4: Org3cli容器id
Org3cli容器:
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json org3.json > modified_config.json
将config.json 跟modified_config.json 转pb编码
configtxlator proto_encode --input config.json --type common.Config --output config.pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
计算两个pb差异:
configtxlator compute_update --channel_id mychannel --original config.pb --updated modified_config.pb --output org3_update.pb
将更新的pb解析为json
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json
现在我们有一个解码后的更新文件org3_update.json,我们需要将其包装在信封消息中。此步骤将使我们返回之前删除的header字段。我们将这个文件命名为org3_update_in_envelope.json:
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json
使用我们正确格式的JSON – org3_update_in_envelope.json我们将configtxlator最后一次使用该工具,并将其转换为Fabric所需的完整protobuf格式。我们将命名我们的最终更新对象org3_update_in_envelope.pb:
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb
4.3 签名并提交更新配置
添加组织需要目前通道大部分的组织Admin签名,目前Org3cli的环境变量是org1
输入以下命令:
peer channel signconfigtx -f org3_update_in_envelope.pb
切换环境为org2执行更新配置,因为update也会为当前组织签名,所以不需要再org2签名
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:9051
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
更新命令:
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
更新成功
5. org3加入通道
切换成org3环境变量
export CORE_PEER_LOCALMSPID=Org3MSP
export CORE_PEER_ADDRESS=peer0.org3.example.com:11051
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
获取mychannel 0号块创始块:
peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
该命令将创世块返回到名为的文件mychannel.block。现在,我们可以使用此块将org3的节点加入通道。
输入以下命令:
peer channel join -b mychannel.block
通过peer channel list 验证
6. 总结
动态组织加入大概就是这样,想必删除组织也是相似的,洞悉Fabric的配置原理就可以应对大部分fabric的应用需求。
转自:Mark_MMXIX
区块链技术网。
- 发表于 2020-02-27 14:55
- 阅读 ( 2019 )
- 学分 ( 27 )
- 分类:Fabric
评论