连接选项

受众:架构师、管理员、应用程序与智能合约开发者

连接选项(Connection option)用于与连接配置文件联合使用去精准地控制一个网关如何与网络交互。通过使用网关,允许一个应用开发专注于商业逻辑而不是网络拓扑。

本主题中,我们将涉及:

情景

连接选项指定网关行为的特定方面。网关对于一些原因是重要,其主要目的是允许应用程序去聚焦在业务逻辑和智能合约,同时管理与网络的一些组件的交互。

profile.scenario 连接控制行为的不同交互点。这些选项将会在本文中被充分说明

一个连接选项的例子可能是想说明:被 issue 程序使用的网关应该使用 Isabella 身份将交易提交到 papernet 网络中。另一个可能是网关应该等待来自 MagnetoCorp 的三个节点去确定一个交易被提交并返回控制。连接选项允许应用程序去指定与网络交互的网关的精准行为。如果没有网关,应用程序需要去很多的工作;网关节省了你的时间,让你的应用程序更加可读,不易出错。

用法

我们将马上描述应用程序可用的连接选项的全集;首先让我们看看他们如何被示例 MagnetoCorp issue 应用指定:

const userName = 'User1@org1.example.com';
const wallet = new FileSystemWallet('../identity/user/isabella/wallet');

const connectionOptions = {
  identity: userName,
  wallet: wallet,
  eventHandlerOptions: {
    commitTimeout: 100,
    strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
    }
  };

await gateway.connect(connectionProfile, connectionOptions);

看一下 identitywallet 选项是 connectionOptions 对象的简单属性。他们分别有 userName and wallet,他们较早的被设置在代码里。相比于这些属性,eventHandlerOptions 本身就是一个独立的对象。它有两个属性:commitTimeout: 100 (以秒为单位)和 strategy:EventStrategies.MSPID_SCOPE_ANYFORTX

看一下 connectionOptions 如何作为一个 connectionProfile 的补充被传递给网关的;网络被网络配置文件所标识,这些选项精确地指定了网关该如何与它交互。现在让我们看下可用选项。

选项

这里是可用选项的列表以及他们的作用。

一个钱包必须被指定;最重要的决定是钱包使用的类型,是文件系统、内存、HSM 还是数据库。

在我们的例子中,Isabella 的身份将会被不同的 MSP(2c2d)使用,用于确定他为来自 MagnetoCorp 的一员,并且在其中扮演着一个特殊的角色。这两个事实将相应地决定了他在资源上的许可。

一个用户的身份必须被指定。正如你所看到的,这个身份对于 Hyperledger Fabric 是一个有权限的网络的概念来说是基本的原则——所有的操作者有一个身份,包括应用程序、Peer 节点和排序节点,这些身份决定了他们在资源上的控制。你可以在成员身份服务话题中阅读更过关于这方面的概念。

注意:这个身份不同于用户身份。即使 clientTlsIdentity 对于安全通信来说很重要,但它并不像用户身份那样基础,因为它的范围没有超过确保网络的通信。

clientTlsIdentity 是可选项。建议你把它设置进生产环境中。你应该也使用不同的 clientTlsIdentity 用做 identity,因为这些身份有着非常不同的意义和生命周期。例如,如果 clientTIsIdentity 被破坏,那么你的 identity 也会被破坏;让他们保持分离会更加安全。

如果你确实指定了一个用户定义的事件处理器,她不会影响你的一个应用程序的逻辑;它是完全独立的。处理器被处理过程中的SDK调用;它决定了什么时候调用它,并且使用它的处理结果去选择哪个 Peer 节点用于事件通知。当SDK完成它的处理的时候,应用程序收到控制。

如果一个用户定义的事件处理器没有被指定,那么 EventStrategies的默认值将会被使用。

这个值会被 INITIALIIZE-WITH-DISCOVERY 的环境变量覆盖,其值可以被设置成 true 或者 false

通常,开发人员将为其网络组件(如 Peer 节点、排序节点 和 CA 节点)编写使用 docker 容器的应用程序,但是他们自己本身不会运行在 docker 容器内。这个就是为什么 true 是默认的,这生产环境中,应用程序很可能以网络组件相同的方式运行在 docker 中,因此不需要地址转换。在这种情况下,应用程序应该要不明确指定 false,要不使用环境变量来覆盖。

这个值会被 DISCOVERY-AS-LOCALHOST 环境变量覆盖,其值可以被设置成 true 或者 false

注意事项

当打算选择连接选项的时候,下面的事项列表是有帮助的。

然而,当组织内的 Peer 节点数量增加,等待所有 Peer 节点则没有必要,在这种情况下,使用一个可插拔的事件处理器能够提供更多有效果的策略。例如,在一个公式能够保持所有帐本同步的安全假设下,相同的 Peer 节点集合能够用于提交交易和监听通知。

一个好的方式是在一个配置文件中定义应用程序覆盖,此文件在配置与网关的连接的时候,会被应用程序读取。

因为服务发现选项 enabledasLocalHost 最容易被管理员频繁的覆盖,环境变量 INITIALIIZE-WITH-DISCOVERYDISCOVERY-AS-LOCALHOST 是因为方便而提供的。管理员应该在应用程序的生产环境中设置他们,其生产环境很可能是一个 docker 容器。