Hyperledger Fabric Raft 排序服务

What is ordering?

公有链比如以太坊和比特币等,任何节点都可以参与共识过程,在该过程中,交易被排序并打包成块。这些系统依赖于概率一致性算法(或最终一致性算法),该算法最终可以确保账本的一致性(有很高的概率),但是仍然容易受到“分叉”的影响,因为网络中的不同参与者具有不同的账本。

Hyperledger Fabric 的工作原理有所不同。它具有一个称为“ orderer”的节点 (也称为“ordering node”)来执行此交易排序,该节点与其他 orderer 一起构成 ordering service。由于Fabric的设计依赖于确定性共识算法( deterministic consensus algorithms ),因此可以保证对等方验证的任何块都是最终的和正确的。保证了账本无法像在许多其他分布式和无许可的区块链网络中那样分叉。

除了提高确定性之外,将链码执行与交易排序分开可以使 Fabric 在性能和可伸缩性方面具有优势,消除了在同一节点执行和排序时可能出现的瓶颈。

Orderer nodes and channel configuration

除其排序的功能外,orderer 还维护一个列表,允许哪些创建通道。该组织列表称为“consortium”,该列表本身保留在“orderer system channel”的配置中。默认情况下,此列表及其所处的 channel 只能由 orderer admin 编辑。请注意,ordering service 可能会保留其中几个列表。

Orderer 还对通道实施基本的访问控制,从而限制了可以向其读取和写入数据以及可以对其进行配置的人员。有权修改通道配置的人员应受相关管理员在创建联盟或通道时设置的策略的约束。有关配置的交易由 orderer 处理,因为 orderer 需要知道当前的策略集才能执行其访问控制。在这种情况下,orderer 将处理配置更新,以确保请求者具有适当的管理权限。orderer 针对现有配置验证更新请求,生成新的配置事务,并将其打包到一个块中,该块被发送到通道上的所有节点。然后,节点处理配置事务,验证订购者批准的修改确实确实满足了通道中定义的策略。

Setting up an ordering node

大致而言,涉及以下步骤:

  • 创建订购节点所属的组织(如果尚未创建)
  • 配置您的节点(使用orderer.yaml)
  • 为排序系统通道创建创世块
  • 启动 orderer

Create an organization definition

像节点一样,所有 orderer 都属于一个组织,所以我们要首先创建一个组织。该组织由 MSP 定义,该定义由认证机构(CA)创建。
有关创建 CA 以及使用 CA 创建用户和 MSP 的内容,请查看Fabric CA 用户指南

Configure your node

orderer 的配置是通过一个名为 orderer.yamlyaml 文件处理的。FABRIC_CFG_PATH 环境变量用于指向您已配置的 orderer.yaml 文件,该文件将在文件系统上提取一系列文件和证书。

我们看一下一个 orderer.yaml 样例。特别注意一些值:

  • LocalMSPID – 这是排序组织的 CA 生成的 MSP 的名称。列出的排序组织管理员位置。
  • LocalMSPDir – 在这里可以找到 orderer 所需的加密材料。
  • TLS enabled, Enabled: false – 在此处指定是否要启用 TLS。如果将此值设置为 true,则必须指定相关 TLS 证书的位置。对于 Raft 节点是必需的。
  • BootstrapFile – 这是您将为此排序服务生成的创世块的名称
  • BootstrapMethod – 给出引导程序块的方法。目前,该方法只能是 file, 在 file 中指定了 BootstrapFile中的文件。 如果要将此节点部署为群集的一部分(例如,作为Raft 节点群集的一部分),请注意ClusterConsensus部分。

如果您计划部署基于Kafka的订购服务,则需要完成Kafka部分。

Generate the genesis block of the orderer

新创建的通道的第一个块称为“创世区块”。如果在创建新网络的过程中创建了创世区块(换句话说,如果正在创建的 orderer 不会加入现有的 orderer 集群),则该创世区块将是orderer system channel的第一个区块,orderer system channel由订购者管理员管理,其中包括允许创建渠道的组织的列表。订购者系统通道的创世块很特殊:必须先创建它并将其包含在节点的配置中,然后才能启动节点。

要了解如何使用configtxgen工具创建创世块,请查看通道配置

Bootstrap the ordering node

当你拥有 order 镜像,创建了MSP,配置了orderer.yaml,并创建了创世区块之后,您就可以使用类似于以下命令的命令来启动:

docker-compose -f docker-compose-cli.yaml up -d --no-deps orderer.example.com
//
Options:
    -d   Detached mode: Run containers in the background
    --no-deps Don't start linked services

用 orderer 的地址替换 orderer.example.com

Raft

Configuration

虽然必须将每个 Raft 节点都添加到 system channel ,但是不需要将节点添加到每个应用程序通道。此外,您可以动态地从通道中删除和添加节点,而不会影响其他节点。

Raft 节点使用 TLS 固定来相互鉴定,为了模拟 Raft 节点,攻击者需要获取其 TLS 证书的私钥。所以,如果没有有效的 TLS 配置,则无法运行 Raft 节点。

一个 raft 集群配置:

  • Local Configuration:控制节点特定的方面,例如 TLS 通信,复制行为和文件存储。
  • Channel Configuration :定义相应通道的 Raft 群集的成员资格,以及协议特定的参数,例如心跳频率,领导者超时等。

回想一下,每个通道都有自己的运行 Raft 协议的实例。因此,必须通过将其 Raft 节点的服务器和客户端 TLS 证书(PEM格式)添加到通道配置中,以在其所属的每个通道的配置中引用该Raft节点。这样可以确保当其他节点接收到来自其的消息时,它们可以安全地确认发送该消息的节点的身份。

下面是 configtx.yaml 的部分,显示了通道中的三个 Raft 节点(也称为“ consenters”):

 Consenters:
      - Host: raft0.example.com
        Port: 7050
        ClientTLSCert: path/to/ClientTLSCert0
        ServerTLSCert: path/to/ServerTLSCert0
      - Host: raft1.example.com
        Port: 7050
        ClientTLSCert: path/to/ClientTLSCert1
        ServerTLSCert: path/to/ServerTLSCert1
      - Host: raft2.example.com
        Port: 7050
        ClientTLSCert: path/to/ClientTLSCert2
        ServerTLSCert: path/to/ServerTLSCert2

注意:orderer 将在系统渠道及其加入的任何应用程序渠道中被列为同意者。
具体请参考链接

猜你喜欢

转载自blog.csdn.net/TBBetter/article/details/105878418