自动探测网络信息

客户端要往 Fabric 网络中发送请求,首先需要知道网络的相关信息,如网络中成员、背书节点的地址、链码安装信息等。

在 Fabric v1.2.0 版本之前这些信息需要使用者来手动采集提供。这种方式下需要提前指定,容易出错,另外是当网络中信息变更后(如节点上下线)还需要再次更新。

为了解决这些问题,社区自 v1.2.0 版本开始在 Peer 节点上提供了 Discovery 服务,并编写了 discover 客户端工具(位于 discovery/cmd)。该工具可以访问 Peer 节点提供的 Discovery 服务,查询获取指定信息。

主要功能

discover 工具目前提供如下的查询功能:

  • 节点信息查询:使用 peers 子命令查询节点的身份、服务等信息;
  • 通道配置:使用 config 子命令查询通道的配置信息,包括成员组织、排序服务信息等;
  • 链码背书信息:使用 endorsers 子命令查询对某个链码可以进行背书的节点信息。

命令使用格式为 discover [全局参数] <子命令> [子命令参数列表]

全局参数

discover 支持的全局参数和相关说明如下:

  1. * --help:输出帮助信息;
  2. * --configFile=CONFIGFILE:指定从配置文件中载入参数配置,则无需从命令行指定参数;
  3. * --peerTLSCA=PEERTLSCA:指定校验 peer TLS CA 证书;
  4. * --tlsCert=TLSCERT:指定客户端使用的 TLS 证书(可选,当 Peer 校验客户端 TLS 时);
  5. * --tlsKey=TLSKEY:指定客户端使用的 TLS 私钥(可选,当 Peer 校验客户端 TLS 时);
  6. * --userKey=USERKEY:客户端签名私钥;
  7. * --userCert=USERCERT:客户端签名证书;
  8. * --MSP=MSP:指定客户端的 MSP ID

子命令

discover 目前支持四个子命令:peersconfigendorserssaveConfig,可以通过 help <子命令> 来查看各子命令的功能和使用方法。

peers 子命令

显示网络中的 Peer 节点信息,包括它们的 MSP Id、gRPC 服务监听地址和身份证书。

命令格式为 peers [参数列表],支持参数如下:

  1. * --server=SERVER:指定命令连接的 Peer 节点地址;
  2. * --channel=CHANNEL:指定查询某个特定通道内的节点信息。

例如,通过 peer0.org1.example.com 节点查询 businesschannel 通道内的 Peer 节点信息,可以执行如下命令:

  1. $ discover \
  2. --peerTLSCA tls/ca.crt \
  3. --userKey msp/keystore/f76cf3c92dac81103c82d5490c417ac0123c279f93213f65947d8cc69e11fbc5_sk \
  4. --userCert msp/signcerts/Admin\@org1.example.com-cert.pem \
  5. --MSP Org1MSP \
  6. --tlsCert tls/client.crt \
  7. --tlsKey tls/client.key \
  8. peers \
  9. --server peer0.org1.example.com:7051 \
  10. --channel businesschannel
  11. [
  12. {
  13. "MSPID": "Org2MSP",
  14. "Endpoint": "peer1.org2.example.com:7051",
  15. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...pVTw==\n-----END CERTIFICATE-----\n"
  16. },
  17. {
  18. "MSPID": "Org2MSP",
  19. "Endpoint": "peer0.org2.example.com:7051",
  20. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKT...cGaA=\n-----END CERTIFICATE-----\n"
  21. },
  22. {
  23. "MSPID": "Org1MSP",
  24. "Endpoint": "peer0.org1.example.com:7051",
  25. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...mgaA==\n-----END CERTIFICATE-----\n"
  26. },
  27. {
  28. "MSPID": "Org1MSP",
  29. "Endpoint": "peer1.org1.example.com:7051",
  30. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...UO+g==\n-----END CERTIFICATE-----\n"
  31. }
  32. ]

结果显示 businesschannel 通道内目前包括属于 2 个组织的 4 个 Peer 节点成员:

  • Org1MSP
    • peer0.org1.example.com
    • peer1.org1.example.com
  • Org2MSP
    • peer0.org2.example.com
    • peer1.org2.example.com

config 子命令

显示网络中的通道配置信息,包括各个组织的 MSP 信息和排序节点信息。

命令格式为 config [<参数>],支持参数如下:

  1. * --server=SERVER:指定命令连接的 Peer 节点地址;
  2. * --channel=CHANNEL:指定查询某个特定通道内的配置信息。

例如,通过 peer0.org1.example.com 节点查询 businesschannel 通道内的配置信息,可以执行如下命令:

  1. $ discover \
  2. --peerTLSCA tls/ca.crt \
  3. --userKey msp/keystore/f76cf3c92dac81103c82d5490c417ac0123c279f93213f65947d8cc69e11fbc5_sk \
  4. --userCert msp/signcerts/Admin\@org1.example.com-cert.pem \
  5. --MSP Org1MSP \
  6. --tlsCert tls/client.crt \
  7. --tlsKey tls/client.key \
  8. config \
  9. --server peer0.org1.example.com:7051 \
  10. --channel businesschannel
  11. {
  12. "msps": {
  13. "OrdererMSP": {
  14. "name": "OrdererMSP",
  15. "root_certs": [
  16. "LS0tLS...tLQo="
  17. ],
  18. "admins": [
  19. "LS0tLS...LS0K"
  20. ],
  21. "crypto_config": {
  22. "signature_hash_family": "SHA2",
  23. "identity_identifier_hash_function": "SHA256"
  24. },
  25. "tls_root_certs": [
  26. "LS0tLS...0tCg=="
  27. ]
  28. },
  29. "Org1MSP": {
  30. "name": "Org1MSP",
  31. "root_certs": [
  32. "LS0tLS...0tCg=="
  33. ],
  34. "admins": [
  35. "LS0tLS...LS0K"
  36. ],
  37. "crypto_config": {
  38. "signature_hash_family": "SHA2",
  39. "identity_identifier_hash_function": "SHA256"
  40. },
  41. "tls_root_certs": [
  42. "LS0tLS...LS0K"
  43. ],
  44. "fabric_node_ous": {
  45. "enable": true,
  46. "client_ou_identifier": {
  47. "certificate": "LS0tLS...0tCg==",
  48. "organizational_unit_identifier": "client"
  49. },
  50. "peer_ou_identifier": {
  51. "certificate": "LS0tLS...0tCg==",
  52. "organizational_unit_identifier": "peer"
  53. }
  54. }
  55. },
  56. "Org2MSP": {
  57. "name": "Org2MSP",
  58. "root_certs": [
  59. "LS0tLS...LS0K"
  60. ],
  61. "admins": [
  62. "LS0tLS...0tCg=="
  63. ],
  64. "crypto_config": {
  65. "signature_hash_family": "SHA2",
  66. "identity_identifier_hash_function": "SHA256"
  67. },
  68. "tls_root_certs": [
  69. "LS0tLS...LS0K"
  70. ],
  71. "fabric_node_ous": {
  72. "enable": true,
  73. "client_ou_identifier": {
  74. "certificate": "LS0tLS...LS0K",
  75. "organizational_unit_identifier": "client"
  76. },
  77. "peer_ou_identifier": {
  78. "certificate": "LS0tLS...LS0K",
  79. "organizational_unit_identifier": "peer"
  80. }
  81. }
  82. }
  83. },
  84. "orderers": {
  85. "OrdererMSP": {
  86. "endpoint": [
  87. {
  88. "host": "orderer.example.com",
  89. "port": 7050
  90. }
  91. ]
  92. }
  93. }
  94. }

结果将显示通道内的各个 MSP 的信息和排序服务信息。

endorsers 子命令

显示网络中的背书节点信息,包括它们的 MSP Id、账本高度、服务地址和身份证书等。

命令格式为 endorsers [参数列表],支持参数如下:

  1. * --server=SERVER:指定命令连接的 Peer 节点地址;
  2. * --channel=CHANNEL:指定查询某个特定通道内的节点信息;
  3. * --chaincode=CHAINCODE:指定链码名称列表;
  4. * --collection=CC:C1,C2...:指定链码中集合信息。

例如,查询可以对链码 marblesp 的 collectionMarbles 集合进行背书的节点,可以执行如下命令:

  1. $ discover \
  2. --peerTLSCA tls/ca.crt \
  3. --userKey msp/keystore/f76cf3c92dac81103c82d5490c417ac0123c279f93213f65947d8cc69e11fbc5_sk \
  4. --userCert msp/signcerts/Admin\@org1.example.com-cert.pem \
  5. --MSP Org1MSP \
  6. --tlsCert tls/client.crt \
  7. --tlsKey tls/client.key \
  8. endorsers \
  9. --server peer0.org1.example.com:7051 \
  10. --channel businesschannel \
  11. --chaincode marblesp \
  12. --collection=marblesp:collectionMarbles
  13. [
  14. {
  15. "Chaincode": "marblesp",
  16. "EndorsersByGroups": {
  17. "G0": [
  18. {
  19. "MSPID": "Org1MSP",
  20. "LedgerHeight": 10,
  21. "Endpoint": "peer1.org1.example.com:7051",
  22. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...UO+g==\n-----END CERTIFICATE-----\n"
  23. },
  24. {
  25. "MSPID": "Org1MSP",
  26. "LedgerHeight": 10,
  27. "Endpoint": "peer0.org1.example.com:7051",
  28. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...mgaA==\n-----END CERTIFICATE-----\n"
  29. }
  30. ],
  31. "G1": [
  32. {
  33. "MSPID": "Org2MSP",
  34. "LedgerHeight": 10,
  35. "Endpoint": "peer0.org2.example.com:7051",
  36. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKT...cGaA=\n-----END CERTIFICATE-----\n"
  37. },
  38. {
  39. "MSPID": "Org2MSP",
  40. "LedgerHeight": 10,
  41. "Endpoint": "peer1.org2.example.com:7051",
  42. "Identity": "-----BEGIN CERTIFICATE-----\nMIICKD...pVTw==\n-----END CERTIFICATE-----\n"
  43. }
  44. ]
  45. },
  46. "Layouts": [
  47. {
  48. "quantities_by_group": {
  49. "G0": 1
  50. }
  51. },
  52. {
  53. "quantities_by_group": {
  54. "G1": 1
  55. }
  56. }
  57. ]
  58. }
  59. ]

结果将按组展示符合要求的背书节点的信息。

saveConfig 子命令

该命令并不与 Peer 节点打交道,它将通过参数指定的变量信息保存为本地文件。这样用户在执行后续命令时候可以指定该文件,而无需再指定各个参数值。

需要通过 --configFile=CONFIGFILE 来指定所存放的参数信息文件路径。

例如,保存指定的参数信息到本地的 discover_config.yaml 文件,可以执行如下命令:

  1. $ discover \
  2. --peerTLSCA tls/ca.crt \
  3. --userKey msp/keystore/f76cf3c92dac81103c82d5490c417ac0123c279f93213f65947d8cc69e11fbc5_sk \
  4. --userCert msp/signcerts/Admin\@org1.example.com-cert.pem \
  5. --MSP Org1MSP \
  6. --tlsCert tls/client.crt \
  7. --tlsKey tls/client.key \
  8. --configFile discover_config.yaml \
  9. saveConfig

命令执行完成后,查看本地的 discover_config.yaml 文件内容如下:

  1. version: 0
  2. tlsconfig:
  3. certpath: /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/client.crt
  4. keypath: /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/client.key
  5. peercacertpath: /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/ca.crt
  6. timeout: 0s
  7. signerconfig:
  8. mspid: Org1MSP
  9. identitypath: /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem
  10. keypath: /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/f76cf3c92dac81103c82d5490c417ac0123c279f93213f65947d8cc69e11fbc5_sk

有了这个参数文件,当再使用同样的参数时就无需手动指定,直接使用 --configFile discover_config.yaml 即可。

当然,用户也可以手动编写参数文件,但直接使用 saveConfig 命令自动生成将更加方便、高效。