Hyperledger Fabric 文档

2.3 Hyperledger Fabric - 核心概念 -

2019-12-05  本文已影响0人  furnace

核心概念 - 区块链网络

本主题将从概念上描述 Hyperledger Fabric 如何允许组织在形成区块链网络方面进行协作。如果你是架构师,管理员或开发人员,则可以使用本主题深入了解 Hyperledger Fabric 区块链网络中的主要结构和流程组件。本主题将使用一个易于管理的示例,介绍区块链网络中的所有主要组件。在理解了这个示例之后,你可以阅读文档中其他地方有关这些组件的更多详细信息,或者尝试 构建示例网络

阅读本主题并了解策略的概念之后,你将对组织为建立控制已部署的 Hyperledger Fabric 网络的策略而需要做出的决策有深入的了解。你还将了解组织如何使用声明性策略 (Hyperledger Fabric 的一项关键功能) 来管理网络演进。简而言之,你将了解 Hyperledger Fabric 的主要技术组件以及组织需要做出的决策。

1. 什么是区块链网络?

区块链网络是一种技术基础架构,可为应用程序提供帐本和智能合约 (链码) 服务。首先,智能合约用于生成交易,随后将交易分配到网络中的每个对端点,在该对端节点中,它们一成不变地记录在账本副本中。应用程序的用户可能是使用客户端应用程序或区块链网络管理员的最终用户。

在大多数情况下,多个组织会作为一个联盟聚集在一起以形成网络,并且它们的权限由最初配置网络时联盟所同意的一组策略确定。此外,网络策略会随着联盟组织的一致而随时间变化,这在我们讨论修改策略的概念时会发现。

2. 示例网络

在开始之前,让我们告诉你们我们的目标!这是代表示例网络最终状态的图表。

不必担心这看起来很复杂!在研究本主题时,我们将逐步构建网络,以便你了解组织 R1,R2,R3 和 R4 如何为网络贡献基础结构以帮助形成网络。该基础架构实现了区块链网络,并受组成网络的组织 (例如,可以添加新组织的组织) 所同意的策略的约束。你将发现应用程序如何使用由区块链网络提供的帐本和智能合约服务。

image

R1,R2,R3 和 R4 这四个组织共同决定并签署协议,他们将建立和利用 Hyperledger Fabric 网络。R4 已被指定为网络发起者 – 已被授予建立网络初始版本的权力。R4 无意在网络上执行业务交易。 R1 和 R2 以及 R2 和 R3 都需要在整个网络内进行隐私通信。组织 R1 有一个客户端应用程序,可以在通道 C1 内执行业务交易。组织 R2 有一个客户端应用程序,可以在通道 C1 和 C2 中完成类似的工作。组织 R3 有一个客户端应用程序,可以在通道 C2 上执行此操作。对端节点 P1 维护与 C1 关联的帐本 L1 的副本。对端节点 P2 维护与 C1 关联的帐本 L1 的副本和与 C2 关联的帐本 L2 的副本。对端节点 P3 维护与 C2 关联的帐本 L2 的副本。该网络根据网络配置 NC4 中指定的策略规则进行管理,该网络受组织 R1 和 R4 的控制。通道 C1 根据通道配置 CC1 中指定的策略规则进行管理,该通道受组织 R1 和 R2 的控制。通道 C2 根据通道配置 CC2 中指定的策略规则进行管理,该通道受组织 R2 和 R3 的控制。有一个交易排序服务 O4,它充当 N 的网络管理点,并使用系统通道。交易排序服务还支持应用程序通道 C1 和 C2,以便将交易进行排序到区块中并进行分发。四个组织中的每一个都有一个首选的证书颁发机构。

3. 创建网络

让我们从头开始,为网络建立基础:

image

启动交易排序器后便形成了网络。在我们的示例网络 N 中,包括单个节点 O4 的交易排序服务是根据网络配置 NC4 配置的,该网络配置向组织 R4 提供管理权限。在网络级别,证书颁发机构 CA4 用于将身份分配给 R4 组织的管理员和网络节点。

我们可以看到,定义网络 N 的第一件事 ,即交易排序服务 O4。将交易排序服务视为网络的初始管理点很有帮助。按照事先约定,O4 最初由组织 R4 中的管理员配置和启动,并托管在 R4 中。配置 NC4 包含描述网络管理功能的初始集合的策略。最初,将其设置为仅通过网络授予 R4 权限。我们将在后面看到这些将会改变,但是目前 R4 是网络的唯一成员。

3.1 证书颁发机构

你还可以看到证书颁发机构 CA4,它用于向管理员和网络节点颁发证书。 CA4 在我们的网络中起着关键作用,因为它分发 X.509 证书,该证书可用于将组件标识为属于组织 R4。由 CA 颁发的证书还可以用于签署交易,以表明组织认可交易结果 – 这是将其接受到帐本中的前提。让我们更详细地研究 CA 的这两个方面。

首先,区块链网络的不同组件使用证书将自己标识为来自特定组织。这就是为什么通常有不止一个 CA 支持一个区块链网络 – 不同的组织经常使用不同的 CA。我们将在网络中使用四个 CA,每个组织使用一个。确实,CA 非常重要,因此 Hyperledger Fabric 为你提供了一个内置的 CA (称为 Fabric-CA) 来帮助你前进,尽管在实践中,组织将选择使用自己的 CA。

证书到成员组织的映射是通过称为 成员资格服务提供程序 (Membership Services Provider, MSP) 的结构实现的。网络配置 NC4 使用命名的 MSP 来标识由 CA4 分配的证书的属性,该证书将证书持有者与组织 R4 相关联。然后,NC4 可以在策略中使用此 MSP 名称,以向 R4 的参与者授予对网络资源的特定权限。这种策略的一个示例是确定 R4 中可以将新成员组织添加到网络的管理员。我们不会在这些图表上显示 MSP,因为它们只会使它们混乱,但是它们非常重要。

其次,我们稍后将看到 CA 颁发的证书如何成为 交易 生成和验证过程的核心。具体来说,X.509 证书用于客户端应用程序 交易提案 和智能合约 交易响应 中以进行数字签名 交易。随后,托管分类帐副本的网络节点在接受交易到分类帐之前会验证交易签名是否有效。

让我们回顾一下示例区块链网络的基本结构。证书颁发机构 CA4 定义了一组用户访问的资源,即网络 N,该用户对网络 N 中资源的一组权限,如网络配置 NC4 中包含的策略所述。当我们配置并启动交易排序服务节点 O4 时,所有这些都变为现实。

4. 添加网络管理员

最初将 NC4 配置为仅允许 R4 用户通过网络进行管理。在下一个阶段,我们将允许组织 R1 用户管理网络。让我们看看网络如何发展:

image

组织 R4 更新网络配置,使组织 R1 也成为管理员。此后,R1 和 R4 在网络配置上享有同等的权利。

我们看到增加了一个新的组织 R1 作为管理员 - R1 和 R4 现在在网络上拥有平等的权利。我们还可以看到已添加了证书颁发机构 CA1 – 可用于识别 R1 组织中的用户。此后,R1 和 R4 的用户都可以管理网络。

尽管交易排序器节点 O4 在 R4 的基础结构上运行,但是 R1 对其拥有共享的管理权限,只要它可以获取网络访问权限即可。这意味着R1 或 R4 可以更新网络配置 NC4,以允许 R2 组织进行网络子集的操作。这样,即使 R4 正在运行交易排序服务,并且 R1 对其具有完全的管理权限,R2 仍具有创建新联盟的有限权限。

以最简单的形式,交易排序服务是网络中的单个节点,这就是你在示例中看到的内容。交易排序服务通常是多节点的,可以配置为在不同组织中具有不同的节点。例如,我们可以在 R4 中运行 O4 并将其连接到组织 R1 中单独的交易排序器节点 O2。这样,我们将拥有一个多节点,多组织的管理结构。

在本主题的稍后部分,我们将讨论交易排序服务,但现在,仅将交易排序服务视为一个管理点,即可为不同组织提供对网络的受控访问。

5. 定义联盟

尽管现在可以通过 R1 和 R4 管理网络,但是几乎没有什么可以完成的。我们需要做的第一件事是定义一个联盟。这个词的字面意思是“拥有共同命运的团体”,因此对于区块链网络中的一组组织来说是一个适当的选择。

让我们看看是如何定义联盟的:
[图片上传失败...(image-4fac71-1575546776088)]

网络管理员定义了一个联盟 X1,该联盟包含两个成员,组织 R1 和 R2。该联盟定义存储在网络配置 NC4 中,并将在网络开发的下一阶段使用。CA1 和 CA2 是这些组织各自的证书颁发机构。

由于 NC4 的配置方式,只有 R1 或 R4 可以创建新的联盟。该图显示了添加的新联盟 X1,该联盟将 R1 和 R2 定义为其组成组织。我们还可以看到已经添加了 CA2 以从 R2 识别用户。请注意,一个联盟可以有任意数量的组织成员 – 我们刚刚显示了两个,因为它是最简单的配置。

联盟为何重要?我们可以看到,一个联盟定义了网络中彼此共享交易需求的组织集合 - 在这种情况下为 R1 和 R2。如果组织有共同的目标,将它们组合在一起真的很有意义,而这正是正在发生的事情。

网络虽然由单个组织启动,但现在由更大的一组组织控制。我们可以以这种方式启动它,让 R1,R2 和 R4 拥有共享控制权,但是这种构建过程使它更易于理解。

现在,我们将使用联盟 X1 创建 Hyperledger Fabric 区块链中非常重要的部分 - 通道。

6. 为联盟创建通道

因此,让我们创建 Fabric 区块链网络的关键部分 - 一个通道。通道是主要的通信机制,联盟的成员可以通过该机制相互通信。网络中可以有多个通道,但现在,我们将从一个通道开始。

让我们看看如何将第一个通道添加到网络中:

[图片上传失败...(image-cc2b7d-1575546776088)]

使用联盟定义 X1 为 R1 和 R2 创建了通道 C1。通道由完全独立于网络配置的通道配置 CC1 控制。CC1 由对 C1 拥有同等权利的 R1 和 R2 管理。R4 在 CC1 中没有任何权利。

通道 C1 为联盟 X1 提供了私有的通信机制。我们可以看到通道 C1 已连接到交易排序服务 O4,但是没有附加任何内容。在网络开发的下一阶段,我们将连接客户端应用程序和对端节点等组件。但是在这一点上,通道代表着未来连接的潜力。

即使通道 C1 是网络 N 的一部分,也可以从中区分出来。还要注意,组织 R3 和 R4 不在此通道中 – 用于 R1 和 R2 之间的交易处理。在上一步中,我们了解了 R4 如何授予 R1 创建新联盟的权限。值得一提的是 R4 还允许 R1 创建通道!在此图中,可能是组织 R1 或 R4 创建了通道 C1。同样,请注意,一个通道可以连接任意数量的组织 - 我们已经展示了两个,因为它是最简单的配置。

再次注意通道 C1 与网络配置 NC4 如何具有完全独立的配置 CC1。CC1 包含用于控制 R1 和 R2 在通道 C1 上的权限的策略 - 正如我们所看到的,R3 和 R4 在此通道上没有权限。如果 R3 和 R4 由 R1 或 R2 添加到通道配置 CC1 中的适当策略,则 R3 和 R4 只能与 C1 交互。一个示例是定义谁可以向通道添加新组织。特别要注意的是,R4 不能将自己添加到通道 C1 中 - 它必须并且只能由 R1 或 R2 授权。

为什么通道如此重要?通道之所以有用,是因为它们为联盟成员之间的私有通信和私有数据提供了一种机制。通道可在其他通道和网络中提供保密性。Hyperledger Fabric 在这方面非常强大,因为它允许组织共享基础结构并同时保持私有状态。这里没有矛盾 - 网络中的不同联盟将需要适当共享不同的信息和流程,而通道则提供了一种有效的机制来做到这一点。通道可有效共享基础架构,同时保持数据和通信的隐私。

我们还可以看到,一旦创建了一个通道,它实际上就是“脱离网络”。从此时到将来,只有在通道配置中明确指定的组织才能对其进行控制。同样,从此时开始对网络配置 NC4 的任何更新都不会直接影响通道配置 CC1。例如,如果联盟定义 X1 更改,它将不会影响通道 C1 的成员。通道之所以有用,是因为它们允许构成通道的组织之间进行隐私通信。此外,通道中的数据与网络的其余部分 (包括其他通道) 完全隔离。

顺便说一句,还有一个特殊的系统通道,供交易排序服务使用。它的行为与常规通道完全相同,因此有时会称为应用程序通道。通常,我们无需担心该通道,但稍后在 本主题 中我们将对此进行更多讨论。

7. 对端节点和账本

现在开始使用该通道将区块链网络和组织组件连接在一起。在网络开发的下一阶段,我们可以看到我们的网络 N 刚刚获得了两个新组件,即对端节点 P1 和帐本实例 L1。

[图片上传失败...(image-de8a46-1575546776088)]

对端节点 P1 已加入通道 C1。P1 物理上存放帐本 L1 的副本。P1 和 O4 可以使用通道 C1 相互通信。

对端节点是托管区块链帐本副本的网络组件!最后,我们开始看到一些可识别的区块链组件!P1 在网络中的目的纯粹是托管帐本 L1 的副本,以供其他人访问。我们可以认为 L1 物理上托管在 P1 上,但逻辑上托管在通道 C1 上。当我们向通道添加更多对端节点时,我们会更清楚地看到这个想法。

P1 配置的关键部分是 CA1 发出的 X.509 身份,该身份将 P1 与组织 R1 相关联。一旦 P1 启动,它就可以使用交易排序器 O4 加入通道 C1。O4 收到此加入请求后,会使用通道配置 CC1 来确定 P1 在此通道上的权限。例如,CC1 确定 P1 是否可以向帐本 L1 读取和/或写入信息。

请注意,对端节点是如何由拥有它们的组织加入通道的,尽管我们仅添加了一个对端节点,但我们将看到网络中多个通道上如何有多个对端节点。稍后我们将看到对端节点可以扮演不同的角色。

8. 应用程序和智能合约链码

现在,通道 C1 上有一个帐本,我们可以开始连接客户端应用程序,以使用帐本的主要对象 (对端节点) 提供的某些服务!

请注意网络的增长方式:

[图片上传失败...(image-e3c111-1575546776088)]

智能合约 S5 已安装到 P1 上。组织 R1 中的客户端应用程序 A1 可以使用 S5 通过对端节点 P1 访问帐本。A1,P1 和 O4 都加入了通道 C1,即它们都可以利用该通道提供的通信设施。

在网络开发的下一阶段,我们可以看到客户端应用程序 A1 可以使用通道 C1 连接到特定的网络资源 – 在这种情况下,A1 可以同时连接到对端节点 P1 和交易排序器节点 O4。再次,查看通道如何在网络和组织组件之间进行通信。就像对端节点和交易排序器一样,客户端应用程序将具有将其与组织关联的身份。在我们的示例中,客户端应用程序 A1 与组织 R1 关联,尽管它在 Fabric 区块链网络之外,但仍通过通道 C1 连接到它。

现在看来,A1 可以直接通过 P1 访问帐本 L1,但实际上,所有访问都是通过称为智能合约链码 S5 的特殊程序进行管理的。将 S5 定义为帐本的所有常见访问模式,S5 提供了一套明确定义的方式,可以查询或更新帐本 L1。简而言之,客户应用程序 A1 必须通过智能合约 S5 才能到达帐本 L1!

可以由每个组织中的应用程序开发人员创建智能合约链码,以实施联盟成员共享的业务流程。智能合约用于帮助生成交易,随后可以将交易分配到网络中的每个节点。我们稍后再讨论这个想法,当网络更大时,将更容易理解。现在,需要了解的重要一点是,到此为止,必须在智能合约上执行两次操作。它必须已安装,然后实例化。

8.1 安装智能合约

开发了智能合约 S5 之后,组织 R1 中的管理员必须将其安装到对端节点 P1 上。这是一个简单的操作,发生之后,P1 完全了解 S5。具体来说,P1 可以看到 S5 的实现逻辑 - 它用于访问帐本 L1 的程序代码。我们将其与仅描述 S5 的输入和输出而不考虑其实现的 S5 接口进行对比。

当组织在一个通道中有多个对端节点时,它可以选择在其上安装智能合约的对端节点。它不需要在每个对端节点上安装智能合约。

8.2 实例化智能合约

但是,仅仅因为 P1 已经安装了 S5,连接到通道 C1 的其他组件却没有意识到,它必须首先在通道 C1 上实例化。在我们的示例中,它只有一个对端节点 P1,组织 R1 中的管理员必须使用 P1 在通道 C1 上实例化 S5。实例化之后,通道 C1 上的每个组件都知道 S5 的存在。在我们的示例中,这意味着 S5 现在可以由客户端应用程序 A1 调用!

请注意,尽管通道上的每个组件现在都可以访问 S5,但它们无法看到其程序逻辑。对于已安装它的那些节点,它仍然是私有的,在我们的示例中,这意味着 P1。从概念上讲,这意味着实例化的是智能合约接口,与已安装的智能合约实现相反。加强这个想法,安装智能合约显示了我们如何将其物理托管在对端节点,而实例化智能合约则显示了我们如何将其视为逻辑上由通道托管。

8.3 背书策略

实例化阶段提供的最重要附加信息是 背书策略。它描述了哪些组织必须批准交易,其他组织才能将其接受到其账本副本上。在我们的示例网络中,只有 R1 或 R2 背书交易,才能将交易接受到帐本 L1 上。

实例化的行为将背书策略放置在通道配置 CC1 中。它使通道的任何成员都可以访问它。你可以在 交易流主题 中阅读有关背书策略的更多信息。

8.4 调用智能合约

一旦将智能合约安装在对端节点上并在通道上实例化,即可由客户端应用程序 调用。客户端应用程序通过向智能合约背书策略指定的组织所拥有的对端节点发送交易提案来完成此任务。交易提案用作智能合约的输入,智能合约使用它来生成背书的交易响应,该响应由对端节点返回到客户端应用程序。

这些交易响应与交易提案打包在一起,形成一个完全背书的交易,可以分发到整个网络。稍后,我们将对其进行更详细的介绍。现在,足以了解应用程序如何调用智能合约以生成背书的交易。

在网络开发的这一阶段,我们可以看到组织 R1 正在完全参与网络。它的应用程序 - 从 A1 开始 - 可以通过智能合约 S5 访问帐本 L1,以生成将由 R1 背书的交易,因此由于它们符合背书策略而被接受到帐本中。

9. 网络完成

回想一下,我们的目标是为 X1 联盟 (组织 R1 和 R2) 创建一个通道。网络开发的下一阶段将看到组织 R2 将其基础结构添加到网络中。

让我们看看网络是如何发展的:

image

通过增加组织 R2 的基础结构,网络得到了发展。具体来说,R2 添加了对端节点 P2,该对端节点托管账本 L1 的副本和链码 S5。 P2 也与应用程序 A2 一样加入了通道 C1。A2 和 P2 使用来自 CA2 的证书进行标识。所有这些意味着应用程序 A1 和 A2 都可以使用对端节点 P1 或 P2 在 C1 上调用 S5。

我们可以看到组织 R2 在通道 C1 上添加了一个对端节点 P2。P2 还托管帐本 L1 和智能合约 S5 的副本。我们可以看到 R2 还添加了可以通过通道 C1 连接到网络的客户端应用程序 A2。为此,组织 R2 中的管理员已创建对端节点 P2,并将其加入通道 C1,方法与 R1 中的管理员相同。

我们已经建立了第一个可操作的网络!在网络开发的现阶段,我们拥有一个通道,组织 R1 和 R2 可以彼此完全进行交易。具体来说,这意味着应用程序 A1 和 A2 可以使用智能合约 S5 和账本 L1 在通道 C1 上生成交易。

9.1 生成和接受交易

与始终承载帐本副本的对端节点相反,我们看到有两种不同的对端节点:那些拥有智能合约的和那些没有智能合约的。在我们的网络中,每个对端节点都承载智能合约的副本,但是在较大的网络中,将有更多的对端节点不承载智能合约的副本。对端节点只能在安装了智能合约的情况下运行它,但是通过连接到通道,它可以知道智能合约的接口。

你不应该将没有安装智能合约的对端节点视为劣等节点。具有智能合约的对端节点更具有特殊的能力 - 能够产生交易。注意,所有对端节点都可以验证并随后接受或拒绝交易到其账本 L1 的副本上。但是,只有安装了智能合约的对端节点才能参与交易背书的过程,这对生成有效交易至关重要。

我们在本主题中无需担心如何生成,分发和接受交易的确切细节,足以了解我们拥有一个区块链网络,组织 R1 和 R2 可以将这些信息和流程共享为账本捕获的交易。在其他主题中,我们将学到更多有关交易,账本,智能合约的信息。

9.2 对端节点的类型

在 Hyperledger Fabric 中,尽管所有对端节点都相同,但是它们可以根据网络的配置方式承担多个角色。现在,我们对典型的网络拓扑有了足够的了解,可以描述这些角色。

这是对端节点的两种主要类型。对端节点可以采用其他两个角色:

注意,一个对端节点可以同时是一个提交对端节点,背书对端节点,领导对端节点和锚点对端节点!仅锚点对端节点是可选的 – 出于所有实际目的,总会有一个领导对端节点,至少一个背书 对端节点和至少一个提交对端节点。

9.3 安装而不实例化

与组织 R1 类似,组织 R2 必须将智能合约 S5 安装到其对等节点 P2 上。这很明显 – 如果应用程序 A1 或 A2 希望在对端节点 P2 上使用 S5 来生成事务,则必须首先存在它,安装是发生这种情况的机制。此时,对端节点 P2 具有智能合约和帐本的物理副本,像 P1 一样,它可以在其帐本 L1 的副本上生成并接受交易。

但是,与组织 R1 相比,组织 R2 不需要在通道 C1 上实例化智能合约 S5。这是因为组织 R1 已在通道上实例化了 S5。实例化只需要发生一次。随后加入该通道的任何对端节点都知道智能合约 S5 可用于该通道。这一事实反映了这样一个事实,即账本 L1 和智能合约实际上以物理方式存在于对端节点上,并且以逻辑方式存在于通道上。R2 只是将 L1 和 S5 的另一个物理实例添加到网络。

在我们的网络中,我们可以看到通道 C1 连接了两个客户端应用程序,两个对端节点和一个交易排序服务。由于只有一个通道,因此只有一个逻辑帐本可以与这些组件进行交互。对端节点 P1 和 P2 具有帐本 L1 的相同副本。智能合约 S5 的副本通常将使用相同的编程语言完全相同地实现,但如果不同,则它们在语义上必须等效。

我们可以看到,将对端节点小心地添加到网络可以帮助支持增加的吞吐量,稳定性和弹性。例如,网络中更多的对端节点将允许更多的应用程序连接到它,如果计划内或计划外的停机,组织中的多个对端节将提供额外的弹性。

这一切都意味着可以配置支持各种操作目标的复杂拓扑 – 网络可以达到的规模没有理论上的限制。此外,单个组织内的对端节点有效地发现并彼此通信的技术机制 (gossip 协议) 将容纳大量对端节点,以支持此类拓扑。

仔细使用网络和通道策略可以使大型网络得到良好管理。组织可以自由地将对端节点添加到网络,只要它们符合网络约定的策略即可。网络和通道策略在自治和控制之间建立了平衡,这是去中心化网络的特征。

10. 简化示意图

现在,我们将简化用于表示示例区块链网络的示意图。随着网络规模的扩大,最初用于帮助我们了解通道的线路将变得很繁琐。想象一下,如果添加另一个对端节点或客户端应用程序或另一个通道,图将变得多么复杂?

这就是我们将在一分钟内要做的事情,因此在我们这样做之前,让我们简化示意图。这是到目前为止我们开发的网络的简化表示:

image

该图显示了与网络 N 中的通道 C1 有关的事实,如下所示:客户端应用程序 A1 和 A2 可以使用通道 C1 与对端节点 P1 和 P2 以及交易排序器 O4 进行通信。对端节点 P1 和 P2 可以使用通道 C1 的通信服务。交易排序服务 O4 可以利用通道 C1 的通信服务。通道配置 CC1 适用于通道 C1。

请注意,通过用连接点替换通道线来简化网络图,显示为蓝色圆圈,其中包括通道号。没有信息丢失。此表示形式更具伸缩性,因为它消除了交叉线。这使我们可以更清楚地表示更大的网络。我们通过专注于组件和通道之间的连接点,而不是通道本身来实现了这种简化。

11. 添加另一个联盟

在网络开发的下一阶段,我们介绍组织 R3。我们将为组织 R2 和 R3 提供一个独立的应用程序通道,使他们可以彼此进行交易。该应用程序通道将与先前定义的通道完全分开,因此 R2 和 R3 交易可以保持私有。

让我们回到网络层级,为 R2 和 R3 定义一个新的联盟 X2:

image

组织 R1 或 R4 的网络管理员添加了新的联盟定义 X2,其中包括组织 R2 和 R3。这将用于为 X2 定义一个新通道。

请注意,网络现在定义了两个联盟:组织 R1 和 R2 使用 X1,组织 R2 和 R3 使用 X2。引入了联盟 X2,以便能够为 R2 和 R3 创建新的通道。

只有在网络配置策略 NC4 中明确标识为具有适当权限的组织才能创建新通道,即 R1 或 R4。这是策略的示例,该策略将可以在网络级别管理资源的组织与可以在通道级别管理资源的组织区分开来。看到这些策略在起作用,有助于我们理解为什么 Hyperledger Fabric 具有复杂的分层策略结构。

实际上,联盟定义 X2 已添加到网络配置 NC4 中。我们将在文档的其他地方讨论此操作的确切机制。

12. 添加新的通道

现在,使用这个新的联盟定义 X2 创建一个新通道 C2。为了帮助你进一步了解更简单的通道符号,我们使用了两种视觉样式 - 通道 C1 用蓝色圆形端点表示,而通道 C2 用红色连接线表示:

image

使用联盟定义 X2 为 R2 和 R3 创建了一个新的通道 C2。该通道具有完全独立于网络配置 NC4 和通道配置 CC1 的通道配置 CC2。通道 C2 由 R2 和 R3 管理,它们具有 CC2 中策略定义的对 C2 相同的权限。R1 和 R4 在 CC2 中均未定义任何权限。

通道 C2 为联盟 X2 提供了专用的通信机制。同样,请注意组织是以联盟形式组织起来的,以及构成通道。通道配置 CC2 现在包含管理通道资源的策略,并通过通道 C2 向组织 R2 和 R3 分配管理权限。它仅由 R2 和 R3 管理,R1 和 R4 在通道 C2 中没有权限。例如,随后可以更新通道配置 CC2 以添加组织来支持网络增长,但这只能由 R2 或 R3 完成。

请注意,通道配置 CC1 和 CC2 如何保持彼此完全独立,并与网络配置 NC4 完全独立。再次,我们看到了 Hyperledger Fabric 网络的去中心化性质,创建通道 C2 后,组织 R2 和 R3 会独立于其他网络元素来管理它。通道策略始终保持彼此独立,并且只能由有权在通道中这样做的组织进行更改。

随着网络和通道的发展,网络和通道的配置也将随之发展。有一个过程可以通过受控的方式完成此过程 - 涉及配置交易,这些交易捕获对这些配置的更改。每次配置更改都会产生一个新的配置区块交易,在 本主题的后面,我们将看到如何验证和接受这些区块以分别创建更新的网络和通道配置。

12.1 网络和通道配置

在整个示例网络中,我们看到了网络和通道配置的重要性。这些配置很重要,因为它们封装了网络成员同意的策略,这些策略为控制对网络资源的访问提供了共享引用。网络和通道配置还包含有关网络和通道组成的事实,例如联盟名称及其组织。

例如,当首先使用交易排序服务节点 O4 形成网络时,其行为由网络配置 NC4 控制。NC4 的初始配置仅包含允许组织 R4 管理网络资源的策略。随后将 NC4 更新为还允许 R1 管理网络资源。进行此更改后,组织 R1 或 R4 中连接到 O4 的任何管理员都将具有网络管理权限,因为这是 NC4 网络配置中允许的策略。在内部,交易排序服务中的每个节点都会记录网络配置中的每个通道,以便在网络级别上记录每个创建的通道。

这意味着尽管交易排序服务节点 O4 是创建联盟 X1 和 X2 以及通道 C1 和 C2 的参与者,但网络的智能包含在 O4 遵循的网络配置 NC4中。只要 O4 表现良好,并且在处理网络资源时正确执行 NC4 中定义的策略,我们的网络就会按照所有组织的同意行事。在许多方面,NC4 比 O4 更重要,因为它最终控制了网络访问。

相同的原则适用于有关对端节点的通道配置。在我们的网络中,P1 和 P2 同样是好的参与者。当对端节点 P1 和 P2 与客户端应用程序 A1 或 A2 交互时,它们每个都使用在通道配置 CC1 中定义的策略来控制对通道 C1 资源的访问。

例如,如果 A1 要访问对端节点 P1 或 P2 上的智能合约链码 S5,则每个对端节点都使用其 CC1 副本确定 A1 可以执行的操作。例如,可以根据 CC1 中定义的策略允许 A1 从账本 L1 读取或写入数据。稍后我们将在通道及其通道配置 CC2 中看到针对参与者的相同模式。再次,我们可以看到,尽管对端节点和应用程序是网络中的关键角色,但它们在通道中的行为更多地由通道配置策略决定,而不是其他任何因素。

最后,了解物理上如何实现网络和通道配置将很有帮助。我们可以看到网络和通道配置在逻辑上是唯一的 - 只有一个网络配置,只有一个通道配置。这个很重要,访问网络或通道的每个组件都必须对授予不同组织的权限有共同的了解。

即使从逻辑上讲只有一个配置,但实际上它被构成网络或通道的每个节点复制并保持一致。例如,在我们的网络中,对端节点 P1 和 P2 都具有通道配置 CC1 的副本,而到网络完全完成时,对端节点 P2 和 P3 都将具有通道配置 CC2 的副本。类似地,交易排序服务节点 O4 具有网络配置的副本,但是在 多节点配置 中,每个交易排序服务节点将具有其自己的网络配置副本。

使用用于用户交易 (但用于配置交易) 的相同区块链技术,可以使网络和通道配置保持一致。要更改网络或通道配置,管理员必须提交配置交易以更改网络或通道配置。必须由适当策略中确定负责配置更改的组织签名。这项策略称为 mod_policy,我们将在 后面讨论

的确,交易排序服务节点运行着一个微型区块链,通过我们前面提到的系统通道连接。使用系统通道交易排序服务节点可以分发网络配置交易。这些交易用于在每个交易排序服务节点上合作维护网络配置的一致副本。以类似的方式,应用程序通道中的对端节点可以分发通道配置交易。同样,这些交易用于在每个对端节点上维护通道配置的一致副本。

通过在物理上分布在逻辑上唯一的对象之间的这种平衡是 Hyperledger Fabric 中的常见模式。例如,逻辑上单一的对象 (如网络配置) 实际上是在一组交易排序服务节点之间进行物理复制的。我们还会在通道配置,帐本以及某种程度上将智能合约安装在多个位置,但它们的接口逻辑上存在于通道级别的情况下看到它。你会在 Hyperledger Fabric 中一次又一次地看到这种模式,这种模式使 Hyperledger Fabric 既去中心化又可管理。

13. 添加另一个对端节点

现在,组织 R3 可以完全参与通道 C2 了,让我们将其基础结构组件添加到渠道中。我们不会一次添加一个组件,而是一次添加一个对端节点,其帐本的本地副本,智能合约和客户端应用程序!

让我们看一下添加了组织 R3 组件的网络:

image

该图显示了与网络 N 中的通道 C1 和 C2 有关的事实,如下所示:客户端应用程序 A1 和 A2 可以使用通道 C1 与对端节点 P1 和 P2 进行通信,以及交易排序服务 O4。客户应用程序 A3 可以使用通道 C2 与对端节点 P3 和交易排序服务 O4 进行通信。交易排序服务 O4 可以利用通道 C1 和 C2 的通信服务。通道配置 CC1 适用于通道 C1,CC2 适用于通道 C2。

首先,请注意,由于对端节点 P3 连接到通道 C2,因此它对使用通道 C1 的那些对端节点具有不同的帐本 L2。帐本 L2 有效地限定在通道 C2 上。帐本 L1 是完全独立的,它的作用域是通道 C1。这是有道理的 – 通道 C2 的目的是在联盟 X2 的成员之间提供隐私通信,而帐本 L2 是其交易的私有存储。

以类似的方式,安装在对端节点 P3 上并实例化在通道 C2 上的智能合约 S6 用于提供对账本 L2 的受控访问。应用程序 A3 现在可以使用通道 C2 调用由智能合约 S6 提供的服务,以生成可以接受到网络中账本 L2 的每个副本上的交易。

此时,我们有了一个网络,其中定义了两个完全独立的通道。这些通道为组织之间的相互交易提供了独立管理的设施。同样,这是工作中的分权,我们在控制和自治之间取得平衡。这是通过将策略应用到受不同组织控制并影响不同组织的通道来实现的。

14. 将一个对端节点加入到多个通道

在网络开发的最后阶段,让我们把重点放回到组织 R2。我们可以利用 R2 是 X1 和 X2 联盟成员的事实,将 R2 加入多个通道。

[图片上传失败...(image-712d77-1575546776088)]

该图显示了与网络 N 中的通道 C1 和 C2 有关的事实,如下所示:客户端应用程序 A1 可以使用通道 C1 与对端节点 P1 和 P2 进行通信,以及交易排序服务 O4。客户端应用程序 A2 可以使用通道 C1 与对端节点 P1 和 P2 进行通信,并使用通道 C2 与对端节点 P2 和 P3 进行通信以及交易排序服务 O4。客户端应用程序 A3 可以使用通道 C2 与对端节点 P3 和 P2 以及交易排序服务 O4 进行通信。交易排序服务 O4 可以利用通道 C1 和 C2 的通信服务。通道配置 CC1 适用于通道 C1,CC2 适用于通道 C2。

我们可以看到 R2 是网络中的一个特殊组织,因为它是两个应用程序通道中唯一的组织!它能够与通道 C1 上的组织 R1 进行交易,同时它还可以与其他通道 C2 上的组织 R3 进行交易。

请注意,对端节点 P2 如何为通道 C1 安装了智能合约 S5,并为通道 C2 安装了智能合约 S6。对端节点 P2 通过不同账本的不同智能合约同时是两个通道的正式成员。

这是一个非常强大的概念 - 通道既提供了组织分离的机制,又提供了组织之间协作的机制。一直以来,此基础结构是由一组独立的组织提供并在它们之间共享的。

同样重要的是要注意,对端节点 P2 的行为受其进行交易的通道的控制非常不同。具体来说,通道配置 CC1 中包含的策略规定了 P2 在通道 C1 中进行交易时可用于的操作,而通道配置 CC2 中的策略则控制了 P2 在通道 C2 中的行为。

同样,这是理想的 – R2 和 R1 同意了通道 C1 的规则,而 R2 和 R3 同意了通道 C2 的规则。这些规则是在各自的通道策略中捕获的 - 通道中的每个组件都可以并且必须使用它们来强制执行正确的行为,这已经达成共识。

同样,我们可以看到客户端应用程序 A2 现在能够在通道 C1 和 C2 上进行交易。同样,它也将由适当通道配置中的策略控制。顺便说一句,请注意客户端应用程序 A2 和对端节点 P2 正在使用混合的可视词汇表 - 线路和连接。你可以看到它们是等效的。它们是相似的图示。

14.1 交易排序服务

细心的读者可能会注意到交易排序服务节点似乎是一个集中式组件。它最初用于创建网络,并连接到网络中的每个通道。即使我们在控制交易排序器的网络配置策略 NC4 中添加了 R1 和 R4,该节点仍在 R4 的基础架构上运行。在去中心化的世界里,这看起来是错误的!

不用担心我们的示例网络显示了最简单的交易排序服务配置,以帮助你了解网络管理点的概念。实际上,交易排序服务本身也可以完全去中心!前面我们提到过,交易排序服务可能由不同组织拥有的许多单个节点组成,因此让我们看看如何在示例网络中完成该工作。

让我们看一个更现实的交易排序服务节点配置:

image

多个组织的交易排序服务。交易排序服务包括交易排序服务节点 O1 和 O4。 O1 由组织 R1 提供,节点 O4 由组织 R4 提供。网络配置 NC4 为组织 R1 和 R4 的参与者定义了网络资源权限。

我们可以看到,该订购服务已完全去中心化 – 在组织 R1 中运行,在组织 R4 中运行。网络配置策略 NC4 允许 R1 和 R4 在网络资源上享有同等的权利。来自组织 R1 和 R4 的客户端应用程序和对端节点可以通过连接到节点 O1 或节点 O4 来管理网络资源,因为这两个节点的行为方式相同,如网络配置 NC4 中的策略所定义。实际上,来自特定组织的参与者往往会使用其上级组织提供的基础架构,但是并非总是如此。

14.2 去中心化交易分发

交易排序服务不仅是网络的管理点,而且还提供了另一个关键功能 – 它是交易的分发点。交易排序服务是一个组件,它从应用程序中收集已背书的交易并将其排序到交易区块中,然后将其分发到通道中的每个对端节点。在这些提交对端节点的每个对端节点,记录交易 (有效或无效),并适当更新其本地帐本副本。

请注意,交易排序服务节点 O4 在通道 C1 上的作用与在网络 N 上的作用是非常不同的。在通道级别进行操作时,O4 的作用是在通道 C1 内收集交易并分配区块。它根据通道配置 CC1 中定义的策略执行此操作。相反,在网络级别执行操作时,O4 的作用是根据网络配置 NC4 中定义的策略为网络资源提供管理点。再次注意,这些角色是如何分别由通道和网络配置中的不同策略定义的。这应该向你增强 Hyperledger Fabric 中基于声明策略的配置的重要性。策略既定义了联盟的每个成员,又用于控制联盟的每个成员的行为。

我们可以看到,交易排序服务与 Hyperledger Fabric 中的其他组件一样,是完全去中心化的组件。无论是充当网络管理点,还是充当通道中的块分配器,都可以根据需要在网络中的多个组织中分布其节点。

14.3 改变策略

在整个示例网络的探索过程中,我们已经了解了控制系统中参与者行为的策略的重要性。我们仅讨论了一些可用的策略,但是可以声明性地定义许多策略来控制行为的各个方面。这些单独的策略在文档的其他地方进行了讨论。

最重要的是,Hyperledger Fabric 提供了独特而强大的策略,允许网络和通道管理员自行管理策略更改!基本的哲学思想是,无论是在组织内部还是组织之间发生的变化,还是由外部监管机构施加的变化,变化都是一个常数。例如,新组织可以加入通道,或者现有组织的权限可以增加或减少。让我们研究一下 Hyperledger Fabric 中更改策略的实施方式。

他们的主要理解点是,策略更改由策略本身内的策略管理。修改策略 (简称 mod_policy) 是管理更改的网络或通道配置中的一流策略。让我们举两个简单的例子,说明我们如何使用 mod_policy 来管理网络中的更改!

第一个示例是最初建立网络时的情况。此时,仅组织 R4 被允许管理网络。实际上,这是通过使 R4 成为网络配置 NC4 中定义的唯一拥有网络资源许可的组织来实现的。此外,NC4 的 mod_policy 仅提及组织 R4 – 仅允许 R4 更改此配置。

然后,我们对网络 N 进行了演进,以允许组织 R1 来管理网络。 R4 通过将 R1 添加到用于通道创建和联盟创建的策略中来做到这一点。由于此更改,R1 能够定义联盟 X1 和 X2,并创建通道 C1 和 C2。 R1 对网络配置中的通道和联盟策略具有同等的管理权限。

但是,R4 可以通过网络配置为 R1 提供更多的权限! R4 可以将 R1 添加到 mod_policy 中,以便 R1 也能够管理网络策略的更改。

第二个权限比第一个权限强大得多,因为 R1 现在可以完全控制网络配置 NC4!这意味着 R1 原则上可以从网络中删除 R4 的管理权限。实际上,R4 将配置 mod_policy,以便 R4 也需要批准更改,或者 mod_policy 中的所有组织都必须批准更改。有足够的灵活性可以使 mod_policy 复杂到可以支持所需的任何更改过程。

这是在工作的 mod_policy,它使基本配置可以优雅地演变为复杂的配置。在所有相关组织的同意下,这种情况一直存在。 mod_policy 的行为类似于网络或通道配置中的其他所有策略,它定义了一组允许更改mod_policy 本身的组织。

在本小节中,我们仅涉及到策略和 mod_policy 的作用。在策略主题中将对它进行更详细的讨论,但现在让我们回到完成的网络中!

15. 完整的网络

让我们使用一致的图示来回顾一下我们的网络。我们使用更紧凑的图示对其进行了稍微的重组,因为它可以更好地适应更大的拓扑:

[图片上传失败...(image-858e1-1575546776088)]

在此图中,我们看到 Fabric 区块链网络由两个应用程序通道和一个交易排序通道组成。组织 R1 和 R4 负责交易排序通道,组织 R1 和 R2 负责蓝色应用程序通道,而组织 R2 和 R3 负责红色应用程序通道。客户端应用程序 A1 是组织 R1 的组件,而 CA1 是其证书颁发机构。请注意,组织 R2 的对端节点 P2 可以使用蓝色和红色应用程序通道的通信设施。每个应用程序通道都有自己的通道配置,在这种情况下为 CC1 和 CC2。系统通道的通道配置是网络配置 NC4 的一部分。

我们的概念之旅已结束,以构建示例 Hyperledger Fabric 区块链网络。我们创建了一个具有两个通道和三个对端节点,四个智能合约和一个交易排序服务的四个组织的网络。它由四个证书颁发机构支持。它为三个客户端应用程序提供帐本和智能合约服务,他们可以通过两个通道与之交互。花一点时间浏览图中的网络详细信息,然后随时阅读本主题以增强你的知识,或者转到更详细的主题。

16. 网络组件摘要

以下是我们讨论过的网络组件的简要摘要:

17. 网络汇总

在本主题中,我们已经看到了不同的组织如何共享其基础架构以提供集成的 Hyperledger Fabric 区块链网络。我们已经看到了如何将集体基础结构组织成提供独立管理的私有通信机制的通道。我们已经了解了如何通过使用来自各自证书颁发机构的证书来将诸如客户端应用程序,管理员,对端节点和交易排序器之类的参与者识别为来自不同组织。反过来,我们已经看到了定义这些组织参与者对网络和通道资源所拥有的同意许可的政策的重要性。

Reference

项目源代码

项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp

Contributor

  1. Windstamp, https://github.com/windstamp
上一篇下一篇

猜你喜欢

热点阅读