HyperledgerFabric1.4 动态添加orderer,peer

在之前的场景中,山东银行和北京银行组建了一条联盟链并投入使用。现在有一家新的银行——河西银行慕名而来,准备加入这个跨行结算联盟链。  

按照平等共治的原则,河西银行希望和之前的银行一样引入两个组织四个节点,并且加入正在运行的通道testchannel

组织类型组织名称节点数量
ordererOrdererHexiBank2
peerHexiBank2
河西银行希望引入的组织和节点

排序组织和背书组织的添加过程并不一样,所以下面要分开讨论。原因在于排序节点的更改在系统通道(有必要的也会涉及应用通道),而背书节点的更改一般只涉及应用通道。另一个区别是,排序节点只允许逐个添加,而背书节点没有这个限制。

添加Orderer

要添加排序组织OrdererHexiBank,必须更新系统通道。 另外我们的新组织希望加入已有的应用通道testchannel, 那么也要更新这个应用通道。

下面以更新系统通道为例,说明如何向通道添加排序组织(和节点)。注意,因为ETCD-RAFT的限制,一次更改只能添加一个节点。

向系统通道添加orderer

生成证书

新组织的管理员写好配置文件使用cryptogen生成证书:

cd newOrg

../bin/cryptogen generate --config=crypto-config.yaml

上面的crypto-config.yaml可以是这样:

OrdererOrgs:
  - Name: OrdererHexiBank
    Domain: hexibank
    CA:
      Country: CN
      Province: Hexi
      Locality: Jixi
      StreetAddress: Jiefang
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer0
      - Hostname: orderer1
PeerOrgs:
  - Name: HexiBank
    Domain: hexibank
    CA:
      Country: CN
      Province: Hexi
      Locality: Jixi
      StreetAddress: Jiefang
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1

生成新组织的区块链配置

组织管理员需要和联盟内组织管理员协商制定组织规则,保存到configtx.yaml。相比最初创建联盟链,这次的configtx.yaml非常简短:

Organizations:
    - &OrdererHexiBank
        Name: OrdererHexiBankMSP
        ID: OrdererHexiBankMSP
        MSPDir: crypto-config/ordererOrganizations/hexibank/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('OrdererHexiBankMSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('OrdererHexiBankMSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('OrdererHexiBankMSP.admin')"
    - &HexiBank
        Name: HexiBankMSP
        ID: HexiBankMSP
        MSPDir: crypto-config/peerOrganizations/hexibank/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('HexiBankMSP.admin', 'HexiBankMSP.peer', 'HexiBankMSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('HexiBankMSP.admin', 'HexiBankMSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('HexiBankMSP.admin')"
        AnchorPeers:
            - Host: peer0.hexibank
              Port: 9060

生成包含更新信息的交易块

这一步的过程非常繁琐. 简单来说, 需要联盟链管理员从链上获取最新”配置区块”,向其添加新组织信息得到”目的配置区块”, 然后使用工具计算两者差异得到”更新数据”,最后向更新数据添加交易头信息得到”包含更新信息的交易块”.

首先,根据新组织的配置文件生成通用的json文件,方便后面使用:

../bin/configtxgen -printOrg OrdererHexiBankMSP > ../channel-artifacts/ordererhexibank.json #使用新组织的confnigtx.yaml

后联盟内管理员拉取最新配置区块到本地:

docker exec -it cli-sdb-peer0 bash

#拉取系统通道需要OrdererShandongBankMSP管理员权限
export CORE_PEER_LOCALMSPID=OrdererShandongBankMSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/shandongbank/users/Admin@shandongbank/msp/
#此处没有指定区块序号,而是用config自动获取最新配置区块
#-c使用的通道名称是系统通道的名字sys-channel,这是联盟链创建时指定的。
peer channel fetch config ./channel-artifacts/config.block -o orderer0.shandongbank:7080 -c sys-channel --tls --cafile $(pwd)/crypto/ordererOrganizations/shandongbank/orderers/orderer0.shandongbank/msp/tlscacerts/tlsca.shandongbank-cert.pem
exit 

现在需要将配置区块转为json形式以方便编辑:

 ../bin/configtxlator proto_decode --input config.block --type common.Block | jq .data.data[0].payload.data.config > config.json

现在开始将之前生成的ordererhexibank.json等信息添加到config.json中。  

  • -config.json > channel_group > groups> Orderer> groups和 config.json > channel_group > groups > Application > groups 中可以看到联盟内已有的两个 orderer组织 OrdererBeijingBank和 OrdererShandongBank,管理员要做的就是添加一条键为 OrdererHexiBank,值为 ordererhexibank.json中内容的记录。这样就把Orderer组织加入到了配置。    
  • config.json>channel_group>groups>Orderer>values>ConsensusType>value>metadata>consenters中定义了raft共识节点,也就是orderer,管理员可以参照已经存在的节点记录添加新节点的记录,其中的client_tls_cert和server_tls_cert一般是节点证书路径下的tls/server.crt的base64编码。  
  • config.json>channel_group>values>OrdererAddresses>value>addresses添加一条相应的orderer节点记录。再次强调下,管理员可能想相同时添加两个orderer节点,但是这会导致配置更新失败,因为etcd-raft决定了一次只能添加一个节点.

编辑完成后,将文件另存为m_config.json, 以区别于原来的config.json。 然后将这两个json转回protobuf 格式:

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

现在将两者对比,得到变更部分:

../bin/configtxlator compute_update --channel_id sys-channel --original config.pb --updated m_config.pb --output ordererhexibank_update.pb

然后将变更部分的pb文件转为json形式,并添加交易头信息:

../bin/configtxlator proto_decode --input ordererhexibank_update.pb --type common.ConfigUpdate > ordererhexibank_update.json
#添加交易头
echo '{"payload":{"header":{"channel_header":{"channel_id":"sys-channel", "type":2}},"data":{"config_update":'$(cat ordererhexibank_update.json)'}}}' | jq . > ordererhexibank_update_envelope.json

最后将交易json转为protobuf格式, 也就是我们想要的”包含更新信息的交易块”:

../bin/configtxlator proto_encode --input ordererhexibank_update_envelope.json --type common.Envelope > ordererhexibank_update_envelope.pb

执行更新操作

向通道添加组织的最后一步是由联盟管理员更新配置到联盟链。具体来说, 由联盟内的大部分组织的管理员执行对交易块执行签名操作,最后由其中一个管理员执行更新操作. 由于更新操作实际上包含了签名动作,所以实际上最后一个管理员只需执行更新操作。

docker exec -it cli-sdb-peer0 bash
#系统通道的更改需使用OrdererMSP的管理员身份执行签名操作
export CORE_PEER_LOCALMSPID=OrdererShandongBankMSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/shandongbank/users/Admin@shandongbank/msp/
peer channel signconfigtx -f channel-artifacts/ordererhexibank_update_envelope.pb
exit

docker exec -it cli-bjb-peer0 bash 
#系统通道的更改需使用OrdererMSP的管理员身份执行更新操作
export CORE_PEER_LOCALMSPID=OrdererBeijingBankMSP
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/beijingbank/users/Admin@beijingbank/msp/
#ordererhexibank_update_envelope.pb应该是上个组织签名后的文件
peer channel update -f channel-artifacts/ordererhexibank_update_envelope.pb -c sys-channel -o orderer0.beijingbank:8080 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/beijingbank/orderers/orderer0.beijingbank/msp/tlscacerts/tlsca.beijingbank-cert.pem
exit

至此,已经成功向系统通道添加了一个排序组织OrdererHexiBankMSP,以及一个节点。启动这个节点,等待一段时间,即可看到这个节点被纳入到raft集群中。下一步管理员需要将另一个orderer节点添加到系统通道(不再演示)。完成后,即完成了系统通道的更新.

向应用通道添加orderer

要想将这个组织纳入到正在运行的应用通道,管理员需要按上面的步骤将该组织的orderer节点添加到业务通道。唯一的区别是把系统通道的名称(这里是sys-channel)更改为待更新的应用通道名称(如本例中的testchannel)。

添加peer组织

添加背书组织的整体流程与排序节点非常类似,差别是,这个过程中联盟管理员只需添加背书组织,完成后新组织的管理员可以自行启动peer并加入通道。  

首先,生成新组织HexiBank的配置信息:

../bin/configtxgen -printOrg HexiBankMSP > ../channel-artifacts/hexibank.json

然后拉取应用通道的配置区块:

docker exec -it cli-sdb-peer0 bash
#此处没有指定区块序号,而是用config自动获取最新配置区块
#-c使用的是应用通道的名字testchannel。
peer channel fetch config ./channel-artifacts/config.block -o orderer0.shandongbank:7080 -c testchannel --tls --cafile $(pwd)/crypto/ordererOrganizations/shandongbank/orderers/orderer0.shandongbank/msp/tlscacerts/tlsca.shandongbank-cert.pem
exit 

将配置区块转为json格式:

cd channel-artifacts
../bin/configtxlator proto_decode --input config.block --type common.Block | jq .data.data[0].payload.data.config > config.json

将新组织的配置信息新增到json中,路径为config.json>channel_group>groups>Application>groups。

jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"HexiBankMSP":.[1]}}}}}' config.json hexibank.json > m_config.json

将两个json转回protobuf格式:

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

然后计算差异得到更新配置:

../bin/configtxlator compute_update --channel_id testchannel --original config.pb --updated m_config.pb --output hexibank_update.pb

向更新配置中添加交易头信息:

../bin/configtxlator proto_decode --input hexibank_update.pb --type common.ConfigUpdate > hexibank_update.json
#添加交易头
echo '{"payload":{"header":{"channel_header":{"channel_id":"testchannel", "type":2}},"data":{"config_update":'$(cat hexibank_update.json)'}}}' | jq . > hexibank_update_envelope.json
#转为更新区块格式
../bin/configtxlator proto_encode --input hexibank_update_envelope.json --type common.Envelope > hexibank_update_envelope.pb

最后,已有联盟内的两个组织管理员需要执行更新操作,依然是一方签名,然后有另一方更新:

docker exec -it cli-sdb-peer0 bash
peer channel signconfigtx -f channel-artifacts/hexibank_update_envelope.pb
exit

docker exec -it cli-bjb-peer0 bash 
#hexibank_update_envelope.pb应该是上个组织签名后的文件
peer channel update -f channel-artifacts/hexibank_update_envelope.pb -c testchannel -o orderer0.beijingbank:8080 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/beijingbank/orderers/orderer0.beijingbank/msp/tlscacerts/tlsca.beijingbank-cert.pem
exit

至此,应用通道testchannel已经允许使用HexiBankMSP的peer节点加入了。新组织管理员只需要拉取0号区块并加入通道即可。


4 1 投票
文章评分
订阅评论
提醒
guest

1 评论
最旧
最新 最多投票
内联反馈
查看所有评论
tiger
tiger
1 年 前

很有启发

1
0
希望看到您的想法,请您发表评论x