如何使用筏在正在运行的超级账本结构网络中添加新订购者?

时间:2019-08-20 10:28:55

标签: hyperledger-fabric hyperledger

我想向现有的运行中的网络中添加新的订购者。目前,我的网络如下:

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。

1 个答案:

答案 0 :(得分:5)

您可以按照以下步骤在RAFT共识协议设置中添加新的订购者。这是一个冗长的过程,因此我稍后还会添加脚本,但是现在您可以按照以下步骤操作。在这里,我使用结构样本中的first-network来通过5个订购者启动网络。

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

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

  3. 现在,我们首先将订购者添加到系统通道,然后在其具有系统通道的所有块时,将其移至应用程序通道所以请确保您做得正确。

  4. 使用docker exec -it cli bash进入cli容器,并使用有效的订购者信息进行引导,因为您需要 OrdererMSP 来注销此更改。

    < / li>

以下是一些需要用命令程序引导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容器中工作,因为我们将在此处使用 jq configtxlator 工具从将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. 将json格式的步骤6转换为阻止configtxlator proto_encode --input config.json --type common.Config --output config.pb

  2. 将JSON从步骤7转换为块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. 将增量更改回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. 启动一个与另一个订购者基本相同的新订购者容器,除了加密卷指向第2步中生成的新加密(可能还取决于您的设置的不同端口)。 最重要的是将此订购器与最新的配置块合并在一起,为此您必须获取配置块
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

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

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

启动订购器后,您可能会注意到此时已将其连接到木筏并且Steprequests成功,并且由于使用了相同的创世块,因此您的频道和块被阻止。尽管需要做的是使网络知道这个新订购者的地址。

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

  2. 将新添加的Raft节点的端点添加到系统通道的通道配置中,为此,您必须像我们之前所做的那样再次重复整个通道更新事务的整个过程(从5号到14号),唯一要做的就是在步骤7中执行以下操作:

打开json文件,查找“ OrdererAddresses” 部分,在该标题下应有另一个标签“ addresses” 。在该阵列中为新的订购者端点添加新的IP和PORT。将更改另存为modified_config.json,然后按照上述其余步骤进行操作。

一旦您的同龄人得到了这个新的阻止,他们现在就知道了新订购者的地址并可以与之联系。

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

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