应用程序开发 - 应用程序设计元素 - 连接选项
连接选项与连接配置文件一起使用,以精确控制网关与网络的交互方式。使用网关可以使应用程序专注于业务逻辑,而不是网络拓扑。
在本主题中,我们将介绍:
- 为什么连接选项很重要
- 应用程序如何使用连接选项
- 每个连接选项的作用
- 何时使用特定的连接选项
1. 场景
连接选项指定网关行为的特定方面。网关之所以重要,其原因有很多,首要原因是允许应用程序专注于业务逻辑和智能合约,同时管理与网络中许多组件的交互。
image连接选项控制行为的不同交互点。这些选项在本文中进行了详细说明。
连接选项的一个示例可能是指定 issue
应用程序使用的网关应使用身份 Isabella 来向 papernet
网络提交交易。另一个可能是网关应等待 MagnetoCorp 的所有三个对端节点来确认已提交交易以返回控制。连接选项允许应用程序指定网关与网络交互的精确行为。没有网关,应用程序需要做更多的工作。网关可以节省你的时间,使你的应用程序更具可读性,并且不易出错。
2. 使用
稍后我们将介绍应用程序可用的 全套连接选项;我们首先来看一下示例 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);
了解 identity
和 wallet
选项如何是 connectionOptions 对象的简单属性。它们分别具有值 userName
和 wallet
,这是在代码的前面设置的。将这些选项与 eventHandlerOptions 选项进行比较,后者本身就是一个对象。它具有两个属性:commitTimeout : 100
(以秒为单位) 和 strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
。
了解如何将 connectionOptions 作为 connectionProfile 的补充传递到网关。网络由连接配置文件标识,选项精确指定网关应如何与之交互。现在让我们看看可用的选项。
3. 选项
以下是可用选项及其作用的列表。
-
wallet
标识网关将代表应用程序使用的钱包。见 互动 1;钱包是由应用程序指定的,但实际上是从中检索身份的网关。必须指定一个钱包;最重要的决定是要使用的钱包 类型,是文件系统,内存,HSM 还是数据库。
-
identity
是应用程序将从钱包中使用的用户身份。见相互作用 2a。用户身份由应用程序指定,代表应用程序的用户 Isabella,2b。身份实际上是由网关检索的。在我们的示例中,不同 MSP (2c, 2d) 将使用 Isabella 的身份来标识她来自 MagnetoCorp,并在其中扮演特定角色。这两个事实将相应地确定她对资源的许可,例如能够读取和写入帐本。
必须指定用户身份。如你所见,此身份对于 Hyperledger Fabric 是一个准入制的网络这一观念至关重要 - 所有参与者都具有一个身份,包括应用程序,对端节点和交易排序器,这些身份决定了他们对资源的控制。你可以在 MSP 主题 中阅读有关此想法的更多信息。
-
clientTlsIdentity
是从钱包 (3a) 检索并用于网关和不同通道组件 (例如对端节点和交易排序器) 之间的安全通信 (3b) 的身份。请注意,此身份不同于用户身份。尽管 clientTlsIdentity 对于安全通信很重要,但它不如用户身份那么基础,因为它的范围不会超出安全网络通信的范围。
clientTlsIdentity
是可选的。建议你在生产环境中进行设置。你应该始终使用其他clientTlsIdentity
来标识,因为这些标识具有不同的含义和生命周期。例如,如果你的clientTlsIdentity
受到威胁,那么你的身份也会受到威胁;将它们分开可以更安全。 -
eventHandlerOptions.commitTimeout
是可选的。它以秒为单位指定在将控制权返回给应用程序之前,网关应等待任何对端节点 (4a) 提交交易的最长时间。用于通知的对端节点集由eventHandlerOptions.strategy
选项确定。如果未指定 commitTimeout,则网关将使用 300 秒的超时。 -
eventHandlerOptions.strategy
是可选的。它标识网关应用于侦听交易已提交的通知的对端节点的集合。例如,是侦听组织中的单个对端节点还是所有对端节点。它可以采用以下值之一:-
EventStrategies.MSPID_SCOPE_ANYFORTX
侦听用户组织内的任何对端节点。在我们的示例中,请参见交互点 4b。MagnetoCorp 的 peer 1,peer 2 或 peer 3 中的任何一个都可以通知网关。 -
EventStrategies.MSPID_SCOPE_ALLFORTX
这是默认值。聆听用户组织内的所有对端节点。在我们的对端节点示例中,请参见交互点 4b。MagnetoCorp 的所有对端节点都必须已通知网关。peer 1,peer 2 和 peer 3。仅当对端节点是已知/发现且可用时,才对对端节点进行计数;不包括已停止或已失败的对端节点。 -
EventStrategies.NETWORK_SCOPE_ANYFORTX
侦听整个网络通道中的任何对端节点。在我们的示例中,请参见交互点 4b 和 4c。 MagnetoCorp 的 peer 1-3 或 DigiBank 的 peer 7-9 中的任何一个都可以通知网关。 -
EventStrategies.NETWORK_SCOPE_ALLFORTX
侦听整个网络通道中的所有对端节点。在我们的示例中,请参见交互点 4b 和 4c。 MagnetoCorp 和 DigiBank 的所有对端节点都必须通知网关;peer 1-3 和 peer 7-9。仅当已知/发现并可用时,才统计对端节点;不包括已停止或已失败的对端节点。 -
<PluginEventHandlerFunction>
用户定义的事件处理程序的名称。这允许用户定义自己的事件处理逻辑。了解如何 定义 插件事件处理程序,并检查 示例处理程序。仅当你有非常特定的事件处理要求时,才需要用户定义的事件处理程序。通常,内置事件策略之一就足够了。用户定义的事件处理程序的一个示例可能是等待组织中超过一半的对端节点来确认交易已提交。
如果确实指定了用户定义的事件处理程序,则它不会影响你的应用程序逻辑。它与此完全不同。 SDK 在处理过程中会调用处理程序;它决定何时调用它,并使用其结果选择要用于事件通知的对端节点。 SDK 完成处理后,应用程序将收到控制权。
如果未指定用户定义的事件处理程序,则使用
EventStrategies
的默认值。
-
-
discovery.enabled
是可选的,可能的值为 true 或 false。默认值为 true。它确定网关是否使用服务发现来扩展连接配置文件中指定的网络拓扑。参见交互点 6;网关使用的对端节点 gossip 信息。此值将被
INITIALIIZE-WITH-DISCOVERY
环境变量覆盖,该变量可以设置为 true 或 false。 -
discovery.asLocalhost
是可选的,可能的值为 true 或 false。默认值为 true。它确定是否将在服务发现期间找到的 IP 地址从 docker 网络转换为本地主机。通常,开发人员会编写使用 docker 容器作为其网络组件 (例如对端节点,交易排序器和 CA) 的应用程序,但这些应用程序本身不会在 docker 容器中运行。这就是默认值为 true 的原因。在生产环境中,应用程序可能会以与网络组件相同的方式在docker 容器中运行,因此不需要地址转换。在这种情况下,应用程序应显式指定 false 或使用环境变量替代。
此值将被
DISCOVERY-AS-LOCALHOST
环境变量覆盖,该变量可以设置为 true 或 false。
4. 注意事项
下面的注意事项列表在决定如何选择连接选项时会很有帮助。
-
eventHandlerOptions.commitTimeout
和eventHandlerOptions.strategy
一起工作。例如,commitTimeout: 100
和strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
意味着网关将等待长达 100 秒的时间,以便任何对端节点确认交易已提交。相反,指定strategy: EventStrategies.NETWORK_SCOPE_ALLFORTX
意味着网关将对所有组织中的所有对端节点最多等待 100 秒。 -
eventHandlerOptions.strategy
的默认值:EventStrategies.MSPID_SCOPE_ALLFORTX
将等待应用程序组织中的所有对端节点提交交易。这是一个很好的默认设置,因为应用程序可以确保其所有对端节点都拥有账本的最新副本,从而最大程度地减少了并发 问题。但是,随着组织中对端节点数目的增加,等待所有对端节点变得有点不必要,在这种情况下,使用可插入事件处理程序可以提供更有效的策略。例如,在共识将使所有帐本保持同步的安全假设下,可以使用相同的一组对端节点来提交交易和侦听通知。
-
服务发现需要设置
clientTlsIdentity
。这是因为与应用程序交换信息的对端节点必须确信他们正在与自己信任的对端节点交换信息。如果未设置clientTlsIdentity
,则无论是否设置,都将不遵循发现。 -
尽管应用程序可以在连接到网关时设置连接选项,但是管理员可能需要覆盖这些选项。这是因为选项与网络交互有关,而交互可能随时间而变化。例如,管理员试图了解使用服务发现对网络性能的影响。
一种好的方法是在配置文件中定义应用程序替代,当应用程序配置其与网关的连接时,该配置文件将由应用程序读取。
由于管理员最经常需要覆盖启用发现功能和 asLocalHost,因此为了方便起见,提供了环境变量
INITIALIIZE-WITH-DISCOVERY
和DISCOVERY-AS-LOCALHOST
。管理员应在应用程序的生产运行时环境中设置这些设置,该环境很可能是 docker 容器。
Reference
- Docs » Developing Applications » Application design elements » Connection Options, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/connectionoptions.html
- Docs » Developing Applications » Application design elements » Wallet, https://hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/wallet.html#type
- Docs » Key Concepts » Membership, https://hyperledger-fabric.readthedocs.io/en/release-1.4/membership/membership.html
- Docs » Architecture Reference » Architecture Origins, https://hyperledger-fabric.readthedocs.io/en/release-1.4/arch-deep-dive.html#the-endorsing-peer-simulates-a-transaction-and-produces-an-endorsement-signature
项目源代码
项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp
网友评论