【问题标题】:How to add a new orderer in a running hyperledger fabric network using raft?如何使用 raft 在正在运行的超级账本结构网络中添加新的订购者?
【发布时间】:2019-12-25 13:15:16
【问题描述】:

我想在我现有的正在运行的网络中添加一个新的订购者。目前我的网络如下:

docker 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。

【问题讨论】:

    标签: hyperledger-fabric hyperledger


    【解决方案1】:

    您可以按照以下步骤在您的 RAFT 共识协议设置中添加新的排序者。这是一个漫长的过程,所以我稍后还会添加一个脚本,但现在你可以按照这些步骤操作。在这里,我使用织物样本中的 first-network 来启动具有 5 个订购者的网络。

    1. 首先在 OrdererOrgs 下的 crypto-config 中:规格:为您的订购者创建一个新主机名(使用与您的其他人相同的域名和名称)。

    2. 然后,运行命令cryptogen extend --config=./crypto-config.yaml 注意:'extend' 部分会生成您需要的内容,而不是重新生成所有内容。

    3. 现在首先我们将 orderer 添加到 系统通道,然后当它拥有系统通道的所有块时,我们会将其移动到 应用程序通道所以请确保你做得正确。

    4. 使用 docker exec -it cli bash 进入您的 cli 容器并使用有效的订购者信息引导它,因为您需要 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]
    
    1. 接下来要确保所有二进制文件都在 cli 容器中运行,因为我们将在此处使用 jqconfigtxlator 工具将块从protobuf 到 json 并返回

    2. 获取最新的配置块:peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

    3. 转换为 json 并修剪标头:configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json

    4. 打开 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

    1. 从步骤 6 转换 json 以阻止 configtxlator proto_encode --input config.json --type common.Config --output config.pb

    2. 将步骤 7 中的 json 转换为阻止 configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

    3. 计算第 8 步和第 9 步中块之间的增量:configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output orderer_update.pb

    4. 将 delta 改回 json:configtxlator proto_decode --input orderer_update.pb --type common.ConfigUpdate | jq . > orderer_update.json

    5. 现在,我们有一个解码的更新文件 - 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
    
    1. 现在我们将把它转换回 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
    
    1. 由于您的 cli 已作为活动订购者进行引导,您只需提交即可,因为提交方会为您提供免费签名,并且您只需要它:
    peer channel update -f orderer_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA
    

    通过检查获取的配置块是否包含(即将)添加节点的证书,确保将添加的节点是系统通道的一部分。

    1. 启动一个新的 orderer 容器,该容器与另一个 orderer 基本相同,除了加密卷指向步骤 2 中生成的新加密(根据您的设置,可能还有不同的端口)。 最重要的是将此排序器与最新的配置块合并,为此您必须获取配置块
    peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA
    

    然后,将此配置块移动到 channel-artifacts 文件夹,并将此 env 变量 的路径添加到 orderer 的 docker-compose 文件中:

    ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
    

    在启动你的 orderer 之后,你可能会注意到此时它已连接到 raft 并且 Steprequests 成功并且拥有你的频道和区块,因为它使用相同的创世区块。不过需要做的是让网络知道这个新订购者的地址。

    1. 等待 Raft 节点为已添加其证书的所有通道从现有节点复制块。此步骤完成后,节点开始为通道服务。

    2. 将新添加的 Raft 节点的端点添加到系统通道的通道配置中,为此您必须再次重复我们之前所做的通道更新事务的整个过程从(5 日到 14 日),您唯一需要做的不同是在第 7 步中您必须这样做:

    打开 json 文件查找 "OrdererAddresses" 部分,在该标题下应该有另一个标签 "addresses"。为该数组中的新订购者端点添加新 IP 和 PORT。将更改保存为 modified_config.json,然后按照上面的方法进行其余操作。

    一旦你的同伴获得了这个新区块,他们现在就知道新排序者的地址并且可以联系它了。

    1. 现在您必须重复所有步骤,将其添加到应用程序通道,为此只需在 docker 环境变量中更改:
    CHANNEL_NAME=[application-channel-name]
    

    您必须将相同的 tls 证书添加到 consenters 部分,然后在复制应用程序通道的块后,您可以在 addresses 部分添加订购者的端点,然后然后它将开始反映您将对应用程序渠道所做的所有最新更改。

    【讨论】:

    • 嘿 trinayan,一切似乎都正常,但应用程序通道更新出现了一些错误,因为每当我尝试调用通道的链代码时,新订购者都无法访问它。我认为问题在于我的新 RAFT 订购者无法检测到它属于应用程序通道。
    • 好的,让我看看。我会尽快回复您。
    • 很好的详细解释。但是在尝试更新系统通道时出现错误。步骤 14. 错误:得到意外状态:BAD_REQUEST -- 将配置更新应用到现有通道“byfn-sys-channel”时出错:授权更新错误:验证 DeltaSet 时出错:[Value] /Channel/OrdererAddresses 的策略不满足:隐式策略评估失败 - 满足 0 个子策略,但此策略需要满足 1 个“管理员”子策略
    • @Trinayan 如何使用节点sdk获取系统通道?必须有一些命令才能使用 SDK 实现相同的功能。很好的解释:)
    • @AdarshaJha 你可能像我一样用“第一个创世区块”开始了你的新订购者。当您执行第 15 步时,问题将得到解决。
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多