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

     1  # Connection Profile
     2  
     3  **Audience**: Architects, application and smart contract developers
     4  
     5  A connection profile describes a set of components, including peers, orderers
     6  and certificate authorities in a Hyperledger Fabric blockchain network. It also
     7  contains channel and organization information relating to these components. A
     8  connection profile is primarily used by an application to configure a
     9  [gateway](./gateway.html) that handles all network interactions, allowing it
    10  to focus on business logic. A connection profile is normally created by an
    11  administrator who understands the network topology.
    12  
    13  In this topic, we're going to cover:
    14  
    15  * [Why connection profiles are important](#scenario)
    16  * [How applications use a connection profile](#usage)
    17  * [How to define a connection profile](#structure)
    18  
    19  ## Scenario
    20  
    21  A connection profile is used to configure a gateway. Gateways are important for
    22  [many reasons](./gateway.html), the primary being to simplify an application's
    23  interaction with a network channel.
    24  
    25  ![profile.scenario](./develop.diagram.30.png) *Two applications, issue and buy,
    26   use gateways 1&2 configured with connection profiles 1&2. Each profile
    27   describes a different subset of MagnetoCorp and DigiBank network components.
    28   Each connection profile must contain sufficient information for a gateway to
    29   interact with the network on behalf of the issue and buy applications. See the
    30   text for a detailed explanation.*
    31  
    32  A connection profile contains a description of a network view, expressed in a
    33  technical syntax, which can either be JSON or YAML. In this topic, we use the
    34  YAML representation, as it's easier for you to read. Static gateways need more
    35  information than dynamic gateways because the latter can use [service
    36  discovery](../discovery-overview.html) to dynamically augment the information in
    37  a connection profile.
    38  
    39  A connection profile should not be an exhaustive description of a network
    40  channel; it just needs to contain enough information sufficient for a gateway
    41  that's using it. In the network above, connection profile 1 needs to contain at
    42  least the endorsing organizations and peers for the `issue` transaction, as well
    43  as identifying the peers that will notify the gateway when the transaction has
    44  been committed to the ledger.
    45  
    46  It's easiest to think of a connection profile as describing a *view* of the
    47  network. It could be a comprehensive view, but that's unrealistic for a few
    48  reasons:
    49  
    50  * Peers, orderers, certificate authorities, channels, and organizations are
    51    added and removed according to demand.
    52  
    53  * Components can start and stop, or fail unexpectedly (e.g. power outage).
    54  
    55  * A gateway doesn't need a view of the whole network, only what's necessary to
    56    successfully handle transaction submission or event notification for example.
    57  
    58  * Service Discovery can augment the information in a connection profile.
    59    Specifically, dynamic gateways can be configured with minimal Fabric topology
    60    information; the rest can be discovered.
    61  
    62  A static connection profile is normally created by an administrator who
    63  understands the network topology in detail. That's because a static profile can
    64  contain quite a lot of information, and an administrator needs to capture this
    65  in the corresponding connection profile. In contrast, dynamic profiles minimize
    66  the amount of definition required and therefore can be a better choice for
    67  developers who want to get going quickly, or administrators who want to create a
    68  more responsive gateway. Connection profiles are created in either the YAML or
    69  JSON format using an editor of choice.
    70  
    71  ## Usage
    72  
    73  We'll see how to define a connection profile in a moment; let's first see how it
    74  is used by a sample MagnetoCorp `issue` application:
    75  
    76  ```javascript
    77  const yaml = require('js-yaml');
    78  const { Gateway } = require('fabric-network');
    79  
    80  const connectionProfile = yaml.safeLoad(fs.readFileSync('../gateway/paperNet.yaml', 'utf8'));
    81  
    82  const gateway = new Gateway();
    83  
    84  await gateway.connect(connectionProfile, connectionOptions);
    85  ```
    86  
    87  After loading some required classes, see how the `paperNet.yaml` gateway file is
    88  loaded from the file system, converted to a JSON object using the
    89  `yaml.safeLoad()` method, and used to configure a gateway using its `connect()`
    90  method.
    91  
    92  By configuring a gateway with this connection profile, the issue application is
    93  providing the gateway with the relevant network topology it should use to
    94  process transactions. That's because the connection profile contains sufficient
    95  information about the PaperNet channels, organizations, peers, orderers and CAs
    96  to ensure transactions can be successfully processed.
    97  
    98  It's good practice for a connection profile to define more than one peer for any
    99  given organization -- it prevents a single point of failure. This practice also
   100  applies to dynamic gateways; to provide more than one starting point for service
   101  discovery.
   102  
   103  A DigiBank `buy` application would typically configure its gateway with a
   104  similar connection profile, but with some important differences. Some elements
   105  will be the same, such as the channel; some elements will overlap, such as the
   106  endorsing peers. Other elements will be completely different, such as
   107  notification peers or certificate authorities for example.
   108  
   109  The `connectionOptions` passed to a gateway complement the connection profile.
   110  They allow an application to declare how it would like the gateway to use the
   111  connection profile. They are interpreted by the SDK to control interaction
   112  patterns with network components, for example to select which identity to
   113  connect with, or which peers to use for event notifications. Read
   114  [about](./connectionoptions.html) the list of available connection options and
   115  when to use them.
   116  
   117  ## Structure
   118  
   119  To help you understand the structure of a connection profile, we're going to
   120  step through an example for the network shown [above](#scenario). Its connection
   121  profile is based on the PaperNet commercial paper sample, and
   122  [stored](https://github.com/hyperledger/fabric-samples/blob/master/commercial-paper/organization/magnetocorp/gateway/networkConnection.yaml)
   123  in the GitHub repository. For convenience, we've reproduced it [below](#sample).
   124  You will find it helpful to display it in another browser window as you now read
   125  about it:
   126  
   127  * Line 9: `name: "papernet.magnetocorp.profile.sample"`
   128  
   129    This is the name of the connection profile. Try to use DNS style names; they
   130    are a very easy way to convey meaning.
   131  
   132  
   133  * Line 16: `x-type: "hlfv1"`
   134  
   135    Users can add their own `x-` properties that are "application-specific" --
   136    just like with HTTP headers. They are provided primarily for future use.
   137  
   138  
   139  * Line 20: `description: "Sample connection profile for documentation topic"`
   140  
   141    A short description of the connection profile. Try to make this helpful for
   142    the reader who might be seeing this for the first time!
   143  
   144  
   145  * Line 25: `version: "1.0"`
   146  
   147    The schema version for this connection profile.  Currently only version 1.0 is
   148    supported, and it is not envisioned that this schema will change frequently.
   149  
   150  
   151  * Line 32: `channels:`
   152  
   153    This is the first really important line. `channels:` identifies that what
   154    follows are *all* the channels that this connection profile describes. However,
   155    it is good practice to keep different channels in different connection
   156    profiles, especially if they are used independently of each other.
   157  
   158  
   159  * Line 36: `papernet:`
   160  
   161    Details of `papernet`, the first channel in this connection profile, will
   162    follow.
   163  
   164  
   165  * Line 41: `orderers:`
   166  
   167    Details of all the orderers for `papernet` follow. You can see in line 45 that
   168    the orderer for this channel is `orderer1.magnetocorp.example.com`. This is
   169    just a logical name; later in the connection profile (lines 134 - 147), there
   170    will be details of how to connect to this orderer. Notice that
   171    `orderer2.digibank.example.com` is not in this list; it makes sense that
   172    applications use their own organization's orderers, rather than those from a
   173    different organization.
   174  
   175  
   176  * Line 49: `peers:`
   177  
   178    Details of all the peers for `papernet` will follow.
   179  
   180    You can see three peers listed from MagnetoCorp:
   181    `peer1.magnetocorp.example.com`, `peer2.magnetocorp.example.com` and
   182    `peer3.magnetocorp.example.com`. It's not necessary to list all the peers in
   183    MagnetoCorp, as has been done here. You can see only one peer listed from
   184    DigiBank: `peer9.digibank.example.com`; including this peer starts to imply
   185    that the endorsement policy requires MagnetoCorp and DigiBank to endorse
   186    transactions, as we'll now confirm. It's good practice to have multiple peers
   187    to avoid single points of failure.
   188  
   189    Underneath each peer you can see four non-exclusive roles: **endorsingPeer**,
   190    **chaincodeQuery**, **ledgerQuery** and **eventSource**. See how `peer1` and
   191    `peer2` can perform all roles as they host `papercontract`. Contrast to
   192    `peer3`, which can only be used for notifications, or ledger queries that
   193    access the blockchain component of the ledger rather than the world state, and
   194    hence do not need to have smart contracts installed. Notice how `peer9` should
   195    not be used for anything other than endorsement, because those roles are
   196    better served by MagnetoCorp peers.
   197  
   198    Again, see how the peers are described according to their logical names and
   199    their roles. Later in the profile, we'll see the physical information for
   200    these peers.
   201  
   202  
   203  * Line 97: `organizations:`
   204  
   205    Details of all the organizations will follow, for all channels.  Note that
   206    these organizations are for all channels, even though `papernet` is currently
   207    the only one listed.  That's because organizations can be in multiple
   208    channels, and channels can have multiple organizations. Moreover, some
   209    application operations relate to organizations rather than channels. For
   210    example, an application can request notification from one or all peers within
   211    its organization, or all organizations within the network -- using [connection
   212    options](./connectoptions.html).  For this, there needs to be an organization
   213    to peer mapping, and this section provides it.
   214  
   215  * Line 101: `MagnetoCorp:`
   216  
   217    All peers that are considered part of MagnetoCorp are listed: `peer1`,
   218    `peer2` and `peer3`. Likewise for Certificate Authorities. Again, note the
   219    logical name usages, the same as the `channels:` section; physical information
   220    will follow later in the profile.
   221  
   222  
   223  * Line 121: `DigiBank:`
   224  
   225    Only `peer9` is listed as part of DigiBank, and no Certificate Authorities.
   226    That's because these other peers and the DigiBank CA are not relevant for
   227    users of this connection profile.
   228  
   229  
   230  * Line 134: `orderers:`
   231  
   232    The physical information for orderers is now listed. As this connection
   233    profile only mentioned one orderer for `papernet`, you see
   234    `orderer1.magnetocorp.example.com` details listed. These include its IP
   235    address and port, and gRPC options that can override the defaults used when
   236    communicating with the orderer, if necessary. As with `peers:`, for high
   237    availability, specifying more than one orderer is a good idea.
   238  
   239  
   240  * Line 152: `peers:`
   241  
   242    The physical information for all previous peers is now listed.  This
   243    connection profile has three peers for MagnetoCorp: `peer1`, `peer2`, and
   244    `peer3`; for DigiBank, a single peer `peer9` has its information listed. For
   245    each peer, as with orderers, their IP address and port is listed, together
   246    with gRPC options that can override the defaults used when communicating with
   247    a particular peer, if necessary.
   248  
   249  
   250  * Line 194: `certificateAuthorities:`
   251  
   252    The physical information for certificate authorities is now listed.  The
   253    connection profile has a single CA listed for MagnetoCorp, `ca1-magnetocorp`,
   254    and its physical information follows. As well as IP details, the registrar
   255    information allows this CA to be used for Certificate Signing Requests (CSR).
   256    These are used to request new certificates for locally generated
   257    public/private key pairs.
   258  
   259  Now you've understood a connection profile for MagnetoCorp, you might like to
   260  look at a
   261  [corresponding](https://github.com/hyperledger/fabric-samples/blob/master/commercial-paper/organization/magnetocorp/gateway/networkConnection.yaml)
   262  profile for DigiBank. Locate where the profile is the same as MagnetoCorp's, see
   263  where it's similar, and finally where it's different. Think about why these
   264  differences make sense for DigiBank applications.
   265  
   266  That's everything you need to know about connection profiles. In summary, a
   267  connection profile defines sufficient channels, organizations, peers, orderers
   268  and certificate authorities for an application to configure a gateway. The
   269  gateway allows the application to focus on business logic rather than the
   270  details of the network topology.
   271  
   272  ## Sample
   273  
   274  This file is reproduced inline from the GitHub commercial paper
   275  [sample](https://github.com/hyperledger/fabric-samples/blob/master/commercial-paper/organization/magnetocorp/gateway/networkConnection.yaml).
   276  
   277  ```yaml
   278  1: ---
   279  2: #
   280  3: # [Required]. A connection profile contains information about a set of network
   281  4: # components. It is typically used to configure gateway, allowing applications
   282  5: # interact with a network channel without worrying about the underlying
   283  6: # topology. A connection profile is normally created by an administrator who
   284  7: # understands this topology.
   285  8: #
   286  9: name: "papernet.magnetocorp.profile.sample"
   287  10: #
   288  11: # [Optional]. Analogous to HTTP, properties with an "x-" prefix are deemed
   289  12: # "application-specific", and ignored by the gateway. For example, property
   290  13: # "x-type" with value "hlfv1" was originally used to identify a connection
   291  14: # profile for Fabric 1.x rather than 0.x.
   292  15: #
   293  16: x-type: "hlfv1"
   294  17: #
   295  18: # [Required]. A short description of the connection profile
   296  19: #
   297  20: description: "Sample connection profile for documentation topic"
   298  21: #
   299  22: # [Required]. Connection profile schema version. Used by the gateway to
   300  23: # interpret these data.
   301  24: #
   302  25: version: "1.0"
   303  26: #
   304  27: # [Optional]. A logical description of each network channel; its peer and
   305  28: # orderer names and their roles within the channel. The physical details of
   306  29: # these components (e.g. peer IP addresses) will be specified later in the
   307  30: # profile; we focus first on the logical, and then the physical.
   308  31: #
   309  32: channels:
   310  33:   #
   311  34:   # [Optional]. papernet is the only channel in this connection profile
   312  35:   #
   313  36:   papernet:
   314  37:     #
   315  38:     # [Optional]. Channel orderers for PaperNet. Details of how to connect to
   316  39:     # them is specified later, under the physical "orderers:" section
   317  40:     #
   318  41:     orderers:
   319  42:     #
   320  43:     # [Required]. Orderer logical name
   321  44:     #
   322  45:       - orderer1.magnetocorp.example.com
   323  46:     #
   324  47:     # [Optional]. Peers and their roles
   325  48:     #
   326  49:     peers:
   327  50:     #
   328  51:     # [Required]. Peer logical name
   329  52:     #
   330  53:       peer1.magnetocorp.example.com:
   331  54:         #
   332  55:         # [Optional]. Is this an endorsing peer? (It must have chaincode
   333  56:         # installed.) Default: true
   334  57:         #
   335  58:         endorsingPeer: true
   336  59:         #
   337  60:         # [Optional]. Is this peer used for query? (It must have chaincode
   338  61:         # installed.) Default: true
   339  62:         #
   340  63:         chaincodeQuery: true
   341  64:         #
   342  65:         # [Optional]. Is this peer used for non-chaincode queries? All peers
   343  66:         # support these types of queries, which include queryBlock(),
   344  67:         # queryTransaction(), etc. Default: true
   345  68:         #
   346  69:         ledgerQuery: true
   347  70:         #
   348  71:         # [Optional]. Is this peer used as an event hub? All peers can produce
   349  72:         # events. Default: true
   350  73:         #
   351  74:         eventSource: true
   352  75:       #
   353  76:       peer2.magnetocorp.example.com:
   354  77:         endorsingPeer: true
   355  78:         chaincodeQuery: true
   356  79:         ledgerQuery: true
   357  80:         eventSource: true
   358  81:       #
   359  82:       peer3.magnetocorp.example.com:
   360  83:         endorsingPeer: false
   361  84:         chaincodeQuery: false
   362  85:         ledgerQuery: true
   363  86:         eventSource: true
   364  87:       #
   365  88:       peer9.digibank.example.com:
   366  89:         endorsingPeer: true
   367  90:         chaincodeQuery: false
   368  91:         ledgerQuery: false
   369  92:         eventSource: false
   370  93: #
   371  94: # [Required]. List of organizations for all channels. At least one organization
   372  95: # is required.
   373  96: #
   374  97: organizations:
   375  98:    #
   376  99:    # [Required]. Organizational information for MagnetoCorp
   377  100:   #
   378  101:   MagnetoCorp:
   379  102:     #
   380  103:     # [Required]. The MSPID used to identify MagnetoCorp
   381  104:     #
   382  105:     mspid: MagnetoCorpMSP
   383  106:     #
   384  107:     # [Required]. The MagnetoCorp peers
   385  108:     #
   386  109:     peers:
   387  110:       - peer1.magnetocorp.example.com
   388  111:       - peer2.magnetocorp.example.com
   389  112:       - peer3.magnetocorp.example.com
   390  113:     #
   391  114:     # [Optional]. Fabric-CA Certificate Authorities.
   392  115:     #
   393  116:     certificateAuthorities:
   394  117:       - ca-magnetocorp
   395  118:   #
   396  119:   # [Optional]. Organizational information for DigiBank
   397  120:   #
   398  121:   DigiBank:
   399  122:     #
   400  123:     # [Required]. The MSPID used to identify DigiBank
   401  124:     #
   402  125:     mspid: DigiBankMSP
   403  126:     #
   404  127:     # [Required]. The DigiBank peers
   405  128:     #
   406  129:     peers:
   407  130:       - peer9.digibank.example.com
   408  131: #
   409  132: # [Optional]. Orderer physical information, by orderer name
   410  133: #
   411  134: orderers:
   412  135:   #
   413  136:   # [Required]. Name of MagnetoCorp orderer
   414  137:   #
   415  138:   orderer1.magnetocorp.example.com:
   416  139:     #
   417  140:     # [Required]. This orderer's IP address
   418  141:     #
   419  142:     url: grpc://localhost:7050
   420  143:     #
   421  144:     # [Optional]. gRPC connection properties used for communication
   422  145:     #
   423  146:     grpcOptions:
   424  147:       ssl-target-name-override: orderer1.magnetocorp.example.com
   425  148: #
   426  149: # [Required]. Peer physical information, by peer name. At least one peer is
   427  150: # required.
   428  151: #
   429  152: peers:
   430  153:   #
   431  154:   # [Required]. First MagetoCorp peer physical properties
   432  155:   #
   433  156:   peer1.magnetocorp.example.com:
   434  157:     #
   435  158:     # [Required]. Peer's IP address
   436  159:     #
   437  160:     url: grpc://localhost:7151
   438  161:     #
   439  162:     # [Optional]. gRPC connection properties used for communication
   440  163:     #
   441  164:     grpcOptions:
   442  165:       ssl-target-name-override: peer1.magnetocorp.example.com
   443  166:       request-timeout: 120001
   444  167:   #
   445  168:   # [Optional]. Other MagnetoCorp peers
   446  169:   #
   447  170:   peer2.magnetocorp.example.com:
   448  171:     url: grpc://localhost:7251
   449  172:     grpcOptions:
   450  173:       ssl-target-name-override: peer2.magnetocorp.example.com
   451  174:       request-timeout: 120001
   452  175:   #
   453  176:   peer3.magnetocorp.example.com:
   454  177:     url: grpc://localhost:7351
   455  178:     grpcOptions:
   456  179:       ssl-target-name-override: peer3.magnetocorp.example.com
   457  180:       request-timeout: 120001
   458  181:   #
   459  182:   # [Required]. Digibank peer physical properties
   460  183:   #
   461  184:   peer9.digibank.example.com:
   462  185:     url: grpc://localhost:7951
   463  186:     grpcOptions:
   464  187:       ssl-target-name-override: peer9.digibank.example.com
   465  188:       request-timeout: 120001
   466  189: #
   467  190: # [Optional]. Fabric-CA Certificate Authority physical information, by name.
   468  191: # This information can be used to (e.g.) enroll new users. Communication is via
   469  192: # REST, hence options relate to HTTP rather than gRPC.
   470  193: #
   471  194: certificateAuthorities:
   472  195:   #
   473  196:   # [Required]. MagnetoCorp CA
   474  197:   #
   475  198:   ca1-magnetocorp:
   476  199:     #
   477  200:     # [Required]. CA IP address
   478  201:     #
   479  202:     url: http://localhost:7054
   480  203:     #
   481  204:     # [Optioanl]. HTTP connection properties used for communication
   482  205:     #
   483  206:     httpOptions:
   484  207:       verify: false
   485  208:     #
   486  209:     # [Optional]. Fabric-CA supports Certificate Signing Requests (CSRs). A
   487  210:     # registrar is needed to enroll new users.
   488  211:     #
   489  212:     registrar:
   490  213:       - enrollId: admin
   491  214:         enrollSecret: adminpw
   492  215:     #
   493  216:     # [Optional]. The name of the CA.
   494  217:     #
   495  218:     caName: ca-magnetocorp
   496  ```
   497  
   498  <!--- Licensed under Creative Commons Attribution 4.0 International License
   499  https://creativecommons.org/licenses/by/4.0/ -->