hyperledger-fabric - 如何使用 raft 在正在运行的超级账本结构网络中添加新的订购者?
问题描述
我想在我现有的正在运行的网络中添加一个新的订购者。目前我的网络如下:
码头工人ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
998b93eb81c6 hyperledger/fabric-tools:latest "/bin/bash" About a minute ago Up About a minute cli
87bada2d914b hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:8050->7050/tcp orderer2.example.com
5907f35bb5b4 hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:8750->7050/tcp orderer6.example.com
7876e35f2fb9 hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:10050->7050/tcp orderer4.example.com
fba3185ec9c6 hyperledger/fabric-peer:latest "peer node start" About a minute ago Up About a minute 0.0.0.0:7051->7051/tcp peer0.org1.example.com
8b5e4348f04c hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:9050->7050/tcp orderer3.example.com
a5cffb73ceca hyperledger/fabric-couchdb "tini -- /docker-ent…" About a minute ago Up About a minute 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp couchdb0
6be4405ec45b hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:11050->7050/tcp orderer5.example.com
790c9aa84911 hyperledger/fabric-orderer:latest "orderer" About a minute ago Up About a minute 0.0.0.0:8055->7050/tc
我尝试在 etcdraft 文件中添加排序器,但它不起作用。我在这里使用 First-network。
解决方案
您可以按照以下步骤在您的 RAFT 共识协议设置中添加新的排序者。这是一个漫长的过程,所以我稍后还会添加一个脚本,但现在您可以按照这些步骤操作。在这里,我使用织物样本中的 first-network 来启动具有 5 个订购者的网络。
首先在 OrdererOrgs 下的 crypto-config 中: Specs:为您的 orderer 创建一个新的主机名(使用与您的其他相同的域和名称)。
然后,运行命令
cryptogen extend --config=./crypto-config.yaml
注意:“扩展”部分,以便它生成您需要的内容,而不是重新生成所有内容。现在首先我们将 orderer 添加到系统通道,然后当它具有系统通道的所有块时,我们会将其移动到应用程序通道,因此请确保您正确执行此操作。
通过使用并使用活动的订购者信息引导它进入您的 cli 容器,
docker exec -it cli bash
因为您需要OrdererMSP来签署此更改。
以下是使用 orderer 引导 cli 所需的一些环境变量:
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
CORE_PEER_ADDRESS=orderer.example.com:7050
CORE_PEER_LOCALMSPID=OrdererMSP
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
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
CHANNEL_NAME=[system-channel-name]
接下来是确保所有二进制文件都在 cli 容器中工作,因为我们将在此处使用jq和configtxlator工具将块从 protobuf 转换为 json 并返回
获取最新的配置块:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
转换为 json 并修剪标题:
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json
打开 json 文件查找"ConsensusType"部分,在该标题下应该有另一个标签"consenters"。现在您必须在上面创建的最新订购者的这一部分中添加新的 TLS 证书。但是这里的证书是 Base64 编码的形式,所以首先你必须寻找你的 tlscert 然后你必须在base64中转换,然后将它插入到这个部分。
就我而言,tls 证书在这里:
crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
现在将其添加到上面给出的部分中,就像提到其他部分一样:
{
"client_tls_cert": "xxxxxxxxxxxx",
"host": "new_orderer.example.com",
"port": 7050,
"server_tls_cert": "xxxxxxxxxxxx"
}
添加 base64 编码的证书而不是上面给出的 xxxxxxxx 并将更改保存为modified_config.json
将json表单第6步转换为block
configtxlator proto_encode --input config.json --type common.Config --output config.pb
将步骤 7 中的 json 转换为块
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
计算第 8 步和第 9 步中块之间的增量:
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output orderer_update.pb
将 delta 改回 json:
configtxlator proto_decode --input orderer_update.pb --type common.ConfigUpdate | jq . > orderer_update.json
现在,我们有一个解码的更新文件——orderer_update.json——我们需要将它包装在一个信封消息中。此步骤将返回我们之前剥离的标头字段。我们将此文件命名为:orderer_update_in_envelope.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"$CHANNEL_NAME", "type":2}},"data":{"config_update":'$(cat orderer_update.json)'}}}' | jq . > orderer_update_in_envelope.json
- 现在我们将它转换回 Fabric 所需的完全成熟的 protobuf 格式。我们将最终更新对象命名为 orderer_update_in_envelope.pb
configtxlator proto_encode --input orderer_update_in_envelope.json --type common.Envelope --output orderer_update_in_envelope.pb
- 由于您的 cli 已经作为活动订购者进行引导,您只需提交它,因为提交方会为您提供免费签名,并且它是您唯一需要的:
peer channel update -f orderer_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
通过检查获取的配置块是否包含(即将)添加节点的证书,确保将添加的节点是系统通道的一部分。
- 启动一个新的 orderer 容器,该容器与另一个 orderer 基本相同,除了加密卷指向步骤 2 中生成的新加密(可能取决于您的设置不同的端口)。最重要的是将此排序器与最新的配置块合并,为此您必须获取配置块:
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
然后,将此配置块移动到 channel-artifacts 文件夹,并在 orderer 的 docker-compose 文件中添加此env 变量的路径:
ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
启动您的 orderer 后,您可能会注意到此时它已连接到 raft 并且 Steprequests 成功并且拥有您的通道和块,因为它使用相同的创世块。但是需要做的是让网络知道这个新订购者的地址。
等待 Raft 节点从现有节点复制其证书已添加到的所有通道的块。完成此步骤后,节点开始为通道提供服务。
将新添加的 Raft 节点的端点添加到系统通道的通道配置中,为此您必须再次重复通道更新事务的整个过程,就像我们之前从(5 日到 14 日)所做的那样,您唯一需要做的就是做不同的是在第 7 步中你必须这样做:
打开 json 文件查找"OrdererAddresses"部分,在该标题下应该有另一个标签"addresses"。为该数组中的新订购者端点添加新 IP 和 PORT。将更改保存为 modified_config.json,然后按照上面的方法进行其余操作。
一旦你的同伴得到这个新区块,他们现在就知道新排序者的地址并且可以联系它。
- 现在您必须通过将其添加到应用程序通道来重复所有步骤,为此只需在您的 docker 环境变量中更改它:
CHANNEL_NAME=[application-channel-name]
您必须将相同的 tls 证书添加到同意者部分,然后在复制应用程序通道的块后,您可以在地址部分添加订购者的端点,然后它将开始反映您将对应用程序通道所做的所有最新更改.
推荐阅读
- android - 全屏意图未启动活动,但确实在 android 10 上显示通知
- selenium-webdriver - 在黄瓜中为具有多个场景的特征文件编写步骤定义
- import - 如何使用 Xcode 11 在 UTI 部分配置 .app 文件?
- linux - 仅当行/文本不存在时才执行脚本
- python - boto3中的download_file和download_fileobj之间的区别?
- php - 将数组存储为 JSON 时,为什么从角色数组中删除项目会中断?
- javafx-8 - 调整大小时,TableView,TableColumns 从右边缘消失
- django - 在表单中使用 CheckboxSelectMultiple,该表单使用来自与使用 ForeignKey 的用户相关的 DB 的输入
- clojure - 在 Clojure 中访问嵌套映射值的方法?
- c# - Asp.Net Core 2.2 UseUrls 被忽略