github.com/kaituanwang/hyperledger@v2.0.1+incompatible/docs/source/developapps/connectionoptions.md (about)

     1  # Connection Options
     2  
     3  **Audience**: Architects, administrators, application and smart contract
     4  developers
     5  
     6  Connection options are used in conjunction with a connection profile to control
     7  *precisely* how a gateway interacts with a network. Using a gateway allows an
     8  application to focus on business logic rather than network topology.
     9  
    10  In this topic, we're going to cover:
    11  
    12  * [Why connection options are important](#scenario)
    13  * [How an application uses connection options](#usage)
    14  * [What each connection option does](#options)
    15  * [When to use a particular connection option](#considerations)
    16  
    17  ## Scenario
    18  
    19  A connection option specifies a particular aspect of a gateway's behaviour.
    20  Gateways are important for [many reasons](./gateway.html), the primary being to
    21  allow an application to focus on business logic and smart contracts, while it
    22  manages interactions with the many components of a network.
    23  
    24  ![profile.scenario](./develop.diagram.35.png) *The different interaction points
    25  where connection options control behaviour. These options are explained fully in
    26  the text.*
    27  
    28  One example of a connection option might be to specify that the gateway used by
    29  the `issue` application should use identity `Isabella` to submit transactions to
    30  the `papernet` network. Another might be that a gateway should wait for all
    31  three nodes from MagnetoCorp to confirm a transaction has been committed
    32  returning control. Connection options allow applications to specify the precise
    33  behaviour of a gateway's interaction with the network. Without a gateway,
    34  applications need to do a lot more work; gateways save you time, make your
    35  application more readable, and less error prone.
    36  
    37  ## Usage
    38  
    39  We'll describe the [full set](#options) of connection options available to an
    40  application in a moment; let's first see how they are specified by the
    41  sample MagnetoCorp `issue` application:
    42  
    43  ```javascript
    44  const userName = 'User1@org1.example.com';
    45  const wallet = new FileSystemWallet('../identity/user/isabella/wallet');
    46  
    47  const connectionOptions = {
    48    identity: userName,
    49    wallet: wallet,
    50    eventHandlerOptions: {
    51      commitTimeout: 100,
    52      strategy: EventStrategies.MSPID_SCOPE_ANYFORTX
    53      }
    54    };
    55  
    56  await gateway.connect(connectionProfile, connectionOptions);
    57  ```
    58  
    59  See how the `identity` and `wallet` options are simple properties of the
    60  `connectionOptions` object. They have values `userName` and `wallet`
    61  respectively, which were set earlier in the code. Contrast these options with
    62  the `eventHandlerOptions` option which is an object in its own right. It has
    63  two properties: `commitTimeout: 100` (measured in seconds) and `strategy:
    64  EventStrategies.MSPID_SCOPE_ANYFORTX`.
    65  
    66  See how `connectionOptions` is passed to a gateway as a complement to
    67  `connectionProfile`; the network is identified by the connection profile and
    68  the options specify precisely how the gateway should interact with it. Let's now
    69  look at the available options.
    70  
    71  ## Options
    72  
    73  Here's a list of the available options and what they do.
    74  
    75  * `wallet` identifies the wallet that will be used by the gateway on behalf of
    76    the application. See interaction **1**; the wallet is specified by the
    77    application, but it's actually the gateway that retrieves identities from it.
    78  
    79    A wallet must be specified; the most important decision is the
    80    [type](./wallet.html#type) of wallet to use, whether that's file system,
    81    in-memory, HSM or database.
    82  
    83  
    84  * `identity` is the user identity that the application will use from `wallet`.
    85    See interaction **2a**; the user identity is specified by the application and
    86    represents the user of the application, Isabella, **2b**. The identity is
    87    actually retrieved by the gateway.
    88  
    89    In our example, Isabella's identity will be used by different MSPs (**2c**,
    90    **2d**) to identify her as being from MagnetoCorp, and having a particular
    91    role within it. These two facts will correspondingly determine her permission
    92    over resources, such as being able to read and write the ledger, for example.
    93  
    94    A user identity must be specified. As you can see, this identity is
    95    fundamental to the idea that Hyperledger Fabric is a *permissioned* network --
    96    all actors have an identity, including applications, peers and orderers, which
    97    determines their control over resources. You can read more about this idea in the membership services [topic](../membership/membership.html).
    98  
    99  
   100  * `clientTlsIdentity` is the identity that is retrieved from a wallet (**3a**)
   101    and used for secure communications (**3b**) between the gateway and different
   102    channel components, such as peers and orderers.
   103  
   104    Note that this identity is different to the user identity.  Even though
   105    `clientTlsIdentity` is important for secure communications, it is not as
   106    foundational as the user identity because its scope does not extend beyond
   107    secure network communications.
   108  
   109    `clientTlsIdentity` is optional. You are advised to set it in production
   110    environments. You should always use a different `clientTlsIdentity` to
   111    `identity` because these identities have very different meanings and
   112    lifecycles. For example, if your `clientTlsIdentity` was compromised, then so
   113    would your `identity`; it's more secure to keep them separate.
   114  
   115  
   116  * `eventHandlerOptions.commitTimeout` is optional. It specifies, in seconds, the
   117      maximum amount of time the gateway should wait for a transaction to be
   118      committed by any peer (**4a**) before returning control to the application.
   119      The set of peers to use for notification is determined by the
   120      `eventHandlerOptions.strategy` option. If a commitTimeout is not
   121      specified, the gateway will use a timeout of 300 seconds.
   122  
   123  
   124  * `eventHandlerOptions.strategy` is optional. It identifies the set of peers
   125      that a gateway should use to listen for notification that a transaction has
   126      been committed. For example, whether to listen for a single peer, or all
   127      peers, from its organization. It can take one of the following values:
   128  
   129    * `EventStrategies.MSPID_SCOPE_ANYFORTX` Listen for **any** peer within the
   130      user's organization. In our example, see interaction points **4b**; any of
   131      peer 1, peer 2 or peer 3 from MagnetoCorp can notify the gateway.
   132  
   133    * `EventStrategies.MSPID_SCOPE_ALLFORTX` **This is the default value**. Listen
   134       for **all** peers within the user's organization. In our example peer, see
   135       interaction point **4b**. All peers from MagnetoCorp must all have notified
   136       the gateway; peer 1, peer 2 and peer 3. Peers are only counted if they are
   137       known/discovered and available; peers that are stopped or have failed are
   138       not included.
   139  
   140    * `EventStrategies.NETWORK_SCOPE_ANYFORTX` Listen for **any** peer within the
   141      entire network channel. In our example, see interaction points **4b** and
   142      **4c**; any of peer 1-3 from MagnetoCorp or peer 7-9 of DigiBank can notify
   143      the gateway.
   144  
   145    * `EventStrategies.NETWORK_SCOPE_ALLFORTX` Listen for **all** peers within the
   146      entire network channel. In our example, see interaction points **4b** and
   147      **4c**. All peers from MagnetoCorp and DigiBank must notify the gateway;
   148      peers 1-3 and peers 7-9. Peers are only counted if they are known/discovered
   149      and available; peers that are stopped or have failed are not included.
   150  
   151    * <`PluginEventHandlerFunction`> The name of a user-defined event handler.
   152      This allows a user to define their own logic for event handling. See how to
   153      [define](https://hyperledger.github.io/fabric-sdk-node/master/tutorial-transaction-commit-events.html)
   154      a plugin event handler, and examine a [sample
   155      handler](https://github.com/hyperledger/fabric-sdk-node/blob/master/test/integration/network-e2e/sample-transaction-event-handler.js).
   156  
   157      A user-defined event handler is only necessary if you have very specific
   158      event handling requirements; in general, one of the built-in event
   159      strategies will be sufficient. An example of a user-defined event handler
   160      might be to wait for more than half the peers in an organization to confirm
   161      a transaction has been committed.
   162  
   163      If you do specify a user-defined event handler, it does not affect your
   164      application logic; it is quite separate from it. The handler is called by
   165      the SDK during processing; it decides when to call it, and uses its results
   166      to select which peers to use for event notification. The application
   167      receives control when the SDK has finished its processing.
   168  
   169      If a user-defined event handler is not specified then the default values for
   170      `EventStrategies` are used.
   171  
   172  
   173  * `discovery.enabled` is optional and has possible values `true` or `false`. The
   174    default is `true`. It determines whether the gateway uses [service
   175    discovery](../discovery-overview.html) to augment the network topology
   176    specified in the connection profile. See interaction point **6**; peer's
   177    gossip information used by the gateway.
   178  
   179    This value will be overridden by the `INITIALIIZE-WITH-DISCOVERY` environment
   180    variable, which can be set to `true` or `false`.
   181  
   182  
   183  * `discovery.asLocalhost` is optional and has possible values `true` or `false`.
   184    The default is `true`. It determines whether IP addresses found during service
   185    discovery are translated from the docker network to the local host.
   186  
   187    Typically developers will write applications that use docker containers for
   188    their network components such as peers, orderers and CAs, but that do not run
   189    in docker containers themselves. This is why `true` is the default; in
   190    production environments, applications will likely run in docker containers in
   191    the same manner as network components and therefore address translation is not
   192    required. In this case, applications should either explicitly specify `false`
   193    or use the environment variable override.
   194  
   195    This value will be overridden by the `DISCOVERY-AS-LOCALHOST` environment
   196    variable, which can be set to `true` or `false`.
   197  
   198  ## Considerations
   199  
   200  The following list of considerations is helpful when deciding how to choose
   201  connection options.
   202  
   203  * `eventHandlerOptions.commitTimeout` and `eventHandlerOptions.strategy` work
   204    together. For example, `commitTimeout: 100` and `strategy:
   205    EventStrategies.MSPID_SCOPE_ANYFORTX` means that the gateway will wait for up
   206    to 100 seconds for *any* peer to confirm a transaction has been committed. In
   207    contrast, specifying `strategy:  EventStrategies.NETWORK_SCOPE_ALLFORTX` means
   208    that the gateway will wait up to 100 seconds for *all* peers in *all*
   209    organizations.
   210  
   211  
   212  * The default value of `eventHandlerOptions.strategy:
   213    EventStrategies.MSPID_SCOPE_ALLFORTX` will wait for all peers in the
   214    application's organization to commit the transaction. This is a good default
   215    because applications can be sure that all their peers have an up-to-date copy
   216    of the ledger, minimizing concurrency
   217    issues <!-- Add a link with more information explaining this topic-->
   218  
   219    However, as the number of peers in an organization grows, it becomes a little
   220    unnecessary to wait for all peers, in which case using a pluggable event
   221    handler can provide a more efficient strategy. For example the same set of
   222    peers could be used to submit transactions and listen for notifications, on
   223    the safe assumption that consensus will keep all ledgers synchronized.
   224  
   225  
   226  * Service discovery requires `clientTlsIdentity` to be set. That's because the
   227    peers exchanging information with an application need to be confident that
   228    they are exchanging information with entities they trust. If
   229    `clientTlsIdentity` is not set, then `discovery` will not be obeyed,
   230    regardless of whether or not it is set.
   231  
   232  
   233  * Although applications can set connection options when they connect to the
   234    gateway, it can be necessary for these options to be overridden by an
   235    administrator. That's because options relate to network interactions, which
   236    can vary over time. For example, an administrator trying to understand the
   237    effect of using service discovery on network performance.
   238  
   239    A good approach is to define application overrides in a configuration file
   240    which is read by the application when it configures its connection to the
   241    gateway.
   242  
   243    Because the discovery options `enabled` and `asLocalHost` are most frequently
   244    required to be overridden by administrators, the environment variables
   245    `INITIALIIZE-WITH-DISCOVERY` and `DISCOVERY-AS-LOCALHOST` are provided for
   246    convenience. The administrator should set these in the production runtime
   247    environment of the application, which will most likely be a docker container.
   248  
   249  <!--- Licensed under Creative Commons Attribution 4.0 International License
   250  https://creativecommons.org/licenses/by/4.0/ -->