Fabric网络下如何为通道添加新的组织
其他
2018-10-11 09:57:04
阅读次数: 0
首先要明确添加通道应该要做哪些事!一要通知orderering service服务器,新组织加入到通道,验证过的建议交易封装后是要提交给orderering service服务器,由它分发到commit peer节点。二是通道配置要改变,新组织极有可能成为背书策略贡献者。
一、生成Org3密钥资料
进入/first-network/org3-artifacts/目录,该目录有2个文件:org3-crypto.yaml和configtx.yaml,执行下列命令
../../bin/cryptogen generate --config=./org3-crypto.yaml
通过org3-crypto.yaml为org3 CA及两个与之绑定的peer节点生成密钥和证书,这些文件保存在
org3-artifacts目录下。
再使用configtxgen以JSON格式打印出
Org3-specific配置资料,这个过程用到了 configtx.yaml文件,命令如下:
export FABRIC_CFG_PATH=$PWD && ../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
生成org3.json文件,保存在/first-network/
channel-artifacts/目录下。这个文件包含了org3的策略定义和以base-64编码格式的3个重要证书:
admin、CA根证书、TLS根证书,这些信息将会被追加到通道配置文件中去。
最后一项任务是把Orderer Org’s MSP资料导入到Org3的crypto-config目录。我们主要关注
Orderer’s TLS 根证书,用来保证Org3组织与ordering节点通讯。命令如下:
cd ../ && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
现在我们可以更新通道配置了。
二、准备CLI环境
首先进入CLI容器,这个容器是执行BYFN启动的,可获取2个peer组织和orderer组织的MSP资料,可由org1 admin用户引导。命令如下:
docker exec -it cli bash
Export the ORDERER_CA
and CHANNEL_NAME
variables:
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
需要注意的是如果重启CLI容器,你必须要重复上面的命令。
三、获取配置
现在我们有了2个关键环境变量的CLI容器: ORDERER_CA和
CHANNEL_NAME。接下来要从mychannel通道获取最近的配置区块。
为什么要拉取最新版本的配置文件呢?这是因为通道配置元素是版本化的。版本化的原因有几个,可以防止配置更改,另外还可以确保一致性。(例如当新组织加入到通道后,如果你想将一个组织从通道中移出,版本化可以防止你将这两个组织同时移出),命令如下所述:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
将二进制通道配置块写入到config_block.pb文件中
,文件名及后缀有助于识别文件类型。
以上命令行执行结果如下:
2017-11-07 17:17:57.383 UTC [channelCmd] readBlock -> DEBU 011 Received block: 2
这句话告诉我们最近mychannel配置块是block 2而不是创世纪块。因此块序列如下描述:
-
block 0: genesis block
-
block 1: Org1 anchor peer update
-
block 2: Org2 anchor peer update
四、转换格式(由pb转为JSON并进行裁减)
现在要用configtxlator工具解码通道配置块至
JSON格式。同时将头、元数据、创建者签名无关修改的信息去掉,这可以用jq工具来完成,命令如下:
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
生成config.json文件,位于/
fabric-samples/first-network/目录下。
五、添加Org3加密资料
我们将用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容器有2个JSON文件:config.json和
modified_config.json。第一个文件只包含
Org1和Org2资料,而 “modified”文件则包含3个Org。先把config.json转换成
config.pb文件,命令如下:
configtxlator proto_encode --input config.json --type common.Config --output config.pb
接着将modified_config.json文件编码转成
modified_config.pb文件。命令如下:
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
使用configtxlator工具计算两pb文件的
delta。命令如下并输出org3_update.pb文件:
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb
org3_update.pb文件包含
Org3定义和指向Org1和Org2资料的链接。我们现在可以放弃org1和org2的扩展MSP资料和修改策略。因为这个数据已在通道创世纪块中了。我们只需要两个配置之间的差异了。
在提交通道更新之前,我们需要执行最后几步。前行解码org3_update.pb转成JSON格式org3_update.json。命令如下:
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json
对org3_update.json文件再进行封装,加入早先去掉的头域等信息。最终生成文件:
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
再利用configtxlator工具将org3_update_in_envelope.json转成
org3_update_in_envelope.pb文件,命令行如下:
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb
六、签署和提交配置更新
org3_update_in_envelope.pb文件是在
CLI容器中的。在写入到账本之前还需要Admin签名。通道应用组修改策略设置为缺省 “MAJORITY”表示需要存在的组管理员主体签名。此处则为Org1和Org2都要签名。否则ordering服务器将拒绝交易。
第一步由Org1 Admin签名,CLI容器是基于Org1 MSP资料启动的,可直接在CLI中使用signconfigtx工具,命令如下:
peer channel signconfigtx -f org3_update_in_envelope.pb
第二步切换到Org2 Admin身份,通过输出四个环境变量来实现,命令如下:
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/[email protected]/msp
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
同样也要执行如下命令:
peer channel signconfigtx -f org3_update_in_envelope.pb
注意:向orderering服务器申请的即将更新调用将会经历一系列签名、策略检验等动作,可以通过如下命令来观察:
docker logs -f orderer.example.com
现在可以发送更新命令:
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
出现以下显示表明更新成功:
2018-02-24 18:56:33.499 UTC [msp/identity] Sign -> DEBU 00f Sign: digest: 3207B24E40DE2FAB87A2E42BC004FEAA1E6FDCA42977CB78C64F05A88E556ABA
你也会看到配置交易的提交:
2018-02-24 18:56:33.499 UTC [channelCmd] update -> INFO 010 Successfully submitted channel update
通道更新成功会返回新的区块block 5,并通知到通道中的每个peer节点。blocks 0-2是初始通道配置,blocks 3和4是链码的初始化与调用,block 5则是包含org3的通道配置交易。
可以登录到peer0.org1.example.com查看日志:
docker logs -f peer0.org1.example.com
如果想检查内容,则按演示过程提取、解码新的配置区块。
七、配置选择策略
注意:
这部分主要描述当完成通道配置初始化后,当加入新的组织时选择策略的设置问题。这个例子缺省针对的是动态策略,该策略是对网络中所有的peer节点,内容在peer-base.yaml文件中。
最新加入的peer节点是基于创世纪块启动的,它不包含通新组织加入后的道配置更新信息。所以新的peer节点不能利用gossip协议,正如它们也不能验证来自于同组织提交的块,除非它们获得已将组织加入到通道的配置交易后。因此新加入的peer节点必须有下列的其中一个配置才能接收来自ordering服务器的区块:
1. 利用静态选举策略,将peer配置为一个组织的leader:
CORE_PEER_GOSSIP_USELEADERELECTION=false
CORE_PEER_GOSSIP_ORGLEADER=true
注意这个配置对加入通道的所有新peer节点必须相同
2. 利用动态选举策略,将peer节点配置为使用选举策略:
CORE_PEER_GOSSIP_USELEADERELECTION=true
CORE_PEER_GOSSIP_ORGLEADER=false
注意:
新加组织的peer节点不能构建成员视图,这个选项类似于静态配置,每个peer将自主声明为leader。等到更新后这个组织只有一个激活的leader。因此建议利用这一选项。
八、将Org3加入到通道
此时通道配置已更新到包含新组织Org3,这意味着该组织的peer节点可以加入到通道中去。
首先启动Org3组织的CLI:Org3-specific CLI。命令如下:
docker-compose -f docker-compose-org3.yaml up -d
这个新的组织文件配置用来连接初始网络。2个peer节点1个CLI容器和已存在的peer节点及ordering节点能解决问题了。进入org3-cli容器,命令如下:
docker exec -it Org3cli bash
输出2个重要环境变量: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
检查确认变量已设置:
echo $ORDERER_CA && echo $CHANNEL_NAME
现在发送请求给ordering服务器获取创世纪块。 利用如下命令获取返回块:
peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
以上将0参数传入表明获取第一个区块。如果没有0则将获得5个区块。
然而我们以顺流的方式开始我们的账本,而只能从0区块开始。通过以下命令让peer加入到通道:
peer channel join -b mychannel.block
输出TLS
和ADDRESS变量,将其它peer节点加入到通道:
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:7051
peer channel join -b mychannel.block
九、升级并调用链码
最后的任务是升级链码版本和更新包括org3的背书策略。
在Org3 CLI容器进行如下操作:
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
修改环境变量重复以上命令将org3的第二个peer节点装上链码。第二个不是必须的。你只需要将负责背书或与账本有接口的peer节点装上链码就可以了。 无需链码容器,peer节点仍执行验证逻辑并提交服务。
现在回到初始的CLI容器,在org1和org2上安装新版本链码。命令如下:
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
切换到peer0.org1:
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
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
再次安装 :
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
链码安装完毕,现在要实例化,这一过程将org3包含到背书策略之中。执行如下命令:
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')"
升级调用新增block 6区块至账本。切回到Org3 CLI容器进行query查询。
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
结果为: Query Result: 90
.
调用从a转移b10支付过程:
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"]}'
查询
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
结果为:Query Result: 80
十、总结
通道配置更新过程是复杂的。但每一步都有其严格的逻辑, 最后的阶段是构建protobuf二进制的delta交易对象,获取签名,完成通道策略的修改。
configtxlator、
jq、
peer channel命令为我们完成任务提供了很好的帮助。
转载自blog.csdn.net/taifei/article/details/82838635