fabric 新增组织

现有的网络节点为:
peer0.org1.example.com
peer1.org1.example.com
peer0.org2.example.com
peer2.org2.example.com
orderer.example.com
将增加的节点为:
peer0.org3.example.com
peer1.org3.example.com

一、更新通道配置
1 为Org3 CA以及与此新Org绑定的两个对等生成密钥和证书,使用目录下的org3-crypto.yaml文件

cd  /opt/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network/org3-artifacts
../../bin/cryptogen generate --config=./org3-crypto.yaml

执行成功后会在org3-artifacts文件下生成crypto-config文件夹
复制first-network/crypto-config/ordererOrganizations到org3-artifacts/crypto-config/,

cp -rf  ../crypto-config/ordererOrganizations crypto-config/

若不执行在后面执行第二部分第四步骤org3cli获取创世区块时会报Error: failed to create deliver client: failed to load config for OrdererClient: unable to load orderer.tls.rootcert.file: open /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem: no such file or directory 错误

2 使用 configtxgen 工具以JSON输出Org3特定的配置材料到指定的文件中,该文件包含Org3的策略定义,以及以Base 64格式提供的三个重要证书:admin用户证书(稍后将用作Org3的管理员),CA根证书和TLS根证书证书,后面会将这个JSON文件附加到通道配置中执行json操作的工具 sudo yum -y install jq

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

在这里插入图片描述
3 执行docker exec -it cli bash进入cli客户端 ,使用env | grep CORE查看当前peer节点
在这里插入图片描述
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 获取通道的最新配置块,生成config_block.pb文件。peer channel fetch :从指定通道获取具体的区块并写入文件
config:指定获取的区块是配置区块(fabric网络区块类型分为配置区块和普通交易区块)
查看当前通道可以在cli客户端执行 peer channel list 查看

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

在这里插入图片描述
可以看到mychannel通道中共生成了5个区块(创世区块序号为0).但是最新的配置区块序号为2:
配置区块0:创世区块
配置区块1:组织一的锚节点更新
配置区块2:组织二的锚节点更新
普通区块3:实例化链码
普通区块4:调用链码
而本文获取到了最新的配置区块是区块2,并将该区块写入到了config_block.pb文件中。

6利用 configtxlator 工具将此通道配置块解码为JSON格式, 通过 jq 工具来完成删除所有与想要改变的内容无关的标题,元数据,创建者签名等等

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

7 使用jq将第二步生成的Org3配置定义org3.json结合通道配置块config.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和modified_config.json编码成区块。

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

9 利用这两个配置文件, 使用configtxlator工具计算出更新配置时的更新量信息。该命令将输出一个新的二进制文件,命名为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 中的内容解码为可编辑的JSON格式并将其称为org3_update.json

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

11 将 org3_update 结构数据进行补全,封装为 envelope格式的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 将其转换为fabric所需的二进制交易配置文件。命名为最终更新对象org3_update_in_envelope.pb

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

13 执行ls命令查看所有生成的文件
在这里插入图片描述
14 通道内已经存在的节点需要签名org3_update_in_envelope.pb 文件
执行 source scripts/utils.sh setGlobals 0 1切换到peer0.org1 签名文件

peer channel signconfigtx -f org3_update_in_envelope.pb

在这里插入图片描述
执行setGlobals 1 1切换到peer1.org1 签名文件peer channel signconfigtx -f org3_update_in_envelope.pb
执行 setGlobals 0 2切换到peer0.org2 签名文件peer channel signconfigtx -f org3_update_in_envelope.pb
执行setGlobals 1 2切换到peer1.org2 签名文件peer channel signconfigtx -f org3_update_in_envelope.pb
15 通道内节点全部签名后提交通道配置更新命令

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

在这里插入图片描述
二、组织org3加入创世区块,执行交易
1 打开新的终端,cd到指定目录

cd  /opt/gopath/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network

2 执行docker命令,启动容器

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

在这里插入图片描述
3 执行docker exec -it Org3cli bash声明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

4 获取第0号位置的区块(创世区块),报错的话参考第一部分第一步骤,拷贝文件

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

在这里插入图片描述
5执行env | grep CORE查看peer详情
在这里插入图片描述
6 org3的peer0节点加入创世区块

 peer channel join -b mychannel.block

在这里插入图片描述
切换节点 。org3.peer1通过创世区块加入通道
在这里插入图片描述
7 查看org3组织节点加入通道情况
在这里插入图片描述
8 在peer0.org3上安装链码 版本号发生变化

 peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

在这里插入图片描述
9 此时在org3.peer0上执行交易查询会报错,org1和org2安装的链码版本为1 所以需要重新安装org1和org2的链码
在这里插入图片描述
10 回到第一个终端(cli终端,当前为Org3cli终端)
peer0.org1安装版本号为2 的链码

 peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

在这里插入图片描述
切换节点 peer0.org2安装链码

 peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

在这里插入图片描述
11 重新声明

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

12 链式代码升级需要使用该init 方法 ,此时背书策略发生变化,任意组织背书就可以完成交易

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')"

在这里插入图片描述
13 此时 在peer0.org1、peer0.org2、peer0.org3上安装了链码
验证peer0.org2:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

在这里插入图片描述
验证peer0.org3:

peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

在这里插入图片描述
交易验证

 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"]}'

在这里插入图片描述
查看节点上安装的链码:
peer0.org1和peer0.org2

peer chaincode list --installed

在这里插入图片描述
peer0.org3
在这里插入图片描述
14 docker ps 查看当前运行容器
在这里插入图片描述
三、为新组织指定锚节点
锚节点是用来进行跨组织通信的。初始的跨组织通信启动信息需要通过锚节点的设置提供。
1获取最新的配置块
2更新配置块
3将配置块过呢更新到链上
重新进入Org3cli终端,进行以下操作:
1 获取最新的配置区块config_block.pb

#还是之前的组织三的CLI容器,并且环境变量$CHANNEL_NAME,$ORDERER_CA需要提前配置好
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

在这里插入图片描述
2 将配置区块config_block.pb解码为json格式config.json,并去除不需要的信息

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

3增加组织三的锚节点配置信息进入config.json文件,生成modified_anchor_config.json文件

jq '.channel_group.groups.Application.groups.Org3MSP.values += {"AnchorPeers":{"mod_policy": "Admins","value":{"anchor_peers": [{"host": "peer0.org3.example.com","port": 11051}]},"version": "0"}}' config.json > modified_anchor_config.json

4将config.json和 modified_anchor_config.json都编码为common.Config格式

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

5计算两文件的差异,输出为anchor_update.pb文件

configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_anchor_config.pb --output anchor_update.pb

6将anchor_update.pb文件解码为anchor_update.json文件

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

7添加头部信息,封装为envelop格式的anchor_update_in_envelope.json文件

echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL_NAME'", "type":2}},"data":{"config_update":'$(cat anchor_update.json)'}}}' | jq . > anchor_update_in_envelope.json

8将anchor_update_in_envelope.json文件编码为fabric可识别的文件类型

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

9更新配置文件

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

在这里插入图片描述

帮忙部署ipfs 区块链 联盟链 fabric网络(多共识 多版本 多数据库 ca ) 网络封装接口 区块链浏览器,相关配置文件联系微信 18852897525

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值