11、fabric node sdk1.4.8实现通道发现discovery service功能

声明使用的版本

  • fabric版本如下:1.4.8
  • node-sdk版本:1.4.8
  • node版本:v8.11.1
  • ubuntu版本:16.04

此部分完成的内容

使用node sdk完成fabric中的服务发现功能:
服务发现
服务发现命令行界面

在cli中可以使用命令可以调用服务发现功能,首先需要有一个配置文件conf.yaml,内容如下(具体内容需要按照自己的文件名以及文件夹修改):

version: 0
tlsconfig:
  certpath: ""
  keypath: ""
  peercacertpath: ./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/tls/ca.crt
  timeout: 0s
signerconfig:
  mspid: Org1MSP
  identitypath: ./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp/signcerts/Admin@org1.zeng.com-cert.pem
  keypath: ./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp/keystore/1508f32e9c8af9139ee1cf9434161ab6198aad8d27148e2ac5228d31bc7ea534_sk

在节点下实行如下

discover --configFile conf.yaml peers --channel mychannel --server peer0.org1.zeng.com:7051

终端显示如下内容

[
        {
                "MSPID": "Org2MSP",
                "LedgerHeight": 5,
                "Endpoint": "peer0.org2.zeng.com:7051",
                "Identity": "-----BEGIN CERTIFICATE-----\nMIICXzCCAgWgAwIBAgIUNynelqI8/G3rqfdCbcyJRNEFwLMwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDQxOTA4NDkwMFoXDTIyMDQxOTA4NTQwMFowLTENMAsG\nA1UECxMEcGVlcjEcMBoGA1UEAxMTcGVlcjAub3JnMi56ZW5nLmNvbTBZMBMGByqG\nSM49AgEGCCqGSM49AwEHA0IABJH4naCrRZjgPY/wpCEF4djkJYnaic4PWS0osKHF\nQJveMxwp2S5v3g+LDbrXFx0XOx7VQysmkvwK+jEaBHOsaLqjgccwgcQwDgYDVR0P\nAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOeYkaG8FnM6yggprU69\nd+N/I7PpMB8GA1UdIwQYMBaAFBw3rn44APw+R2uRkUGhsNveDEIpMGQGCCoDBAUG\nBwgBBFh7ImF0dHJzIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVu\ndElEIjoicGVlcjAub3JnMi56ZW5nLmNvbSIsImhmLlR5cGUiOiJwZWVyIn19MAoG\nCCqGSM49BAMCA0gAMEUCIQCZVK3IgI567McyKeitagcsF5a2u52JSsTNyNLr7EU5\nMgIgI3jNQwqUmMozPdc7w8ORrgFtHWAw7VmOIGLNJA06+I4=\n-----END CERTIFICATE-----\n",
                "Chaincodes": null
        },
        {
                "MSPID": "Org3MSP",
                "LedgerHeight": 5,
                "Endpoint": "peer0.org3.zeng.com:7051",
                "Identity": "-----BEGIN CERTIFICATE-----\nMIICXzCCAgWgAwIBAgIUd1YhnfUdbXMqRwOoL5gv48E/d5YwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDQxOTA4NDkwMFoXDTIyMDQxOTA4NTQwMFowLTENMAsG\nA1UECxMEcGVlcjEcMBoGA1UEAxMTcGVlcjAub3JnMy56ZW5nLmNvbTBZMBMGByqG\nSM49AgEGCCqGSM49AwEHA0IABJIUSZ159jhljmTDVE2e/0lxkffQb4QUH26YANVm\neKgfeYbQ4NM/f0C79ABXsKoEtfU3m7AuNRz8uPw7IZ4Y+lejgccwgcQwDgYDVR0P\nAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFH203bZ4SljEa6bhmGw/\nDxAoxAweMB8GA1UdIwQYMBaAFBw3rn44APw+R2uRkUGhsNveDEIpMGQGCCoDBAUG\nBwgBBFh7ImF0dHJzIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVu\ndElEIjoicGVlcjAub3JnMy56ZW5nLmNvbSIsImhmLlR5cGUiOiJwZWVyIn19MAoG\nCCqGSM49BAMCA0gAMEUCIQD/Ow8OuvaTIlTqgidUSODJYmnrR/e3OCpeMKpyAtjH\nWAIgZTDMb7hvvjxyE2dDIh3xJWna1qcWfgkaxDfO8D4bL80=\n-----END CERTIFICATE-----\n",
                "Chaincodes": null
        },
        {
                "MSPID": "Org1MSP",
                "LedgerHeight": 5,
                "Endpoint": "peer0.org1.zeng.com:7051",
                "Identity": "-----BEGIN CERTIFICATE-----\nMIICXjCCAgWgAwIBAgIURvE074QRL7fEkNf02S1gRQ/qCuQwCgYIKoZIzj0EAwIw\naDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK\nEwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt\nY2Etc2VydmVyMB4XDTIxMDQxOTA4NDgwMFoXDTIyMDQxOTA4NTMwMFowLTENMAsG\nA1UECxMEcGVlcjEcMBoGA1UEAxMTcGVlcjAub3JnMS56ZW5nLmNvbTBZMBMGByqG\nSM49AgEGCCqGSM49AwEHA0IABFc68Bmevo1fUYFYaC2lSv3wwyjthSAL6Up0uLGr\nMCD798vLoa7lAj5DH/mSVKloT7GwAtymCX/ayxgxLccCPMejgccwgcQwDgYDVR0P\nAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJf0+t6DZHqVq/npMS+Y\nTPCsQ2q/MB8GA1UdIwQYMBaAFBw3rn44APw+R2uRkUGhsNveDEIpMGQGCCoDBAUG\nBwgBBFh7ImF0dHJzIjp7ImhmLkFmZmlsaWF0aW9uIjoiIiwiaGYuRW5yb2xsbWVu\ndElEIjoicGVlcjAub3JnMS56ZW5nLmNvbSIsImhmLlR5cGUiOiJwZWVyIn19MAoG\nCCqGSM49BAMCA0cAMEQCIHsjQ43u8c+6KUD2H59fUQpr5F+fm/WER68qxwNWHkqs\nAiBktmuoMZ8Di1qcjTuPkcG2ko/49YkY6JUnoWgIxEJLFw==\n-----END CERTIFICATE-----\n",
                "Chaincodes": null
        }
]

开始实现这些功能

前置条件

由于撤销用户需要得到通道的配置,这些配置文件都是用的二进制格式,所以需要使用到configtxlator工具,所以先打开

configtxlator start

前面已经使用过的代码部分

/*
 * @Author: your name
 * @Date: 2021-03-28 10:40:59
 * @LastEditTime: 2021-04-23 22:45:02
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /fabric-samples-1.4.8/first-network/test-crytogen/msp/test.js
 */
/*
 * SPDX-License-Identifier: Apache-2.0
 */

'use strict';

const { FileSystemWallet, Gateway, X509WalletMixin } = require('fabric-network');
const Client = require('fabric-client');
const utils = require('fabric-client/lib/utils.js');
const fs = require('fs');
const path = require('path');
const util = require('util');
const userOpt = require('./userOpt');

const agent = require('superagent-promise')(require('superagent'), Promise);
const requester = require('request');
const TXLATOR = 'http://192.168.65.128:7059';

const {incHashString, getConfig, loadWallet} = require('./utils');
var log4js = require('log4js');
const { timeStamp } = require('console');
var getLogger = function(moduleName) {
	var logger = log4js.getLogger(moduleName);
	// logger.setLevel('DEBUG');
	logger.level = 'DEBUG';
	return logger;
};
const logger = getLogger('test');

具体操作

使用服务发现代码很见到,只需要用到通道里面的获取peer即可完成,前提是在启动peer的时候需要设置其Endpoint(全称应该是CORE_PEER_GOSSIP_EXTERNALENDPOINT)

使用到的相关代码如下

// channel发现服务
async function channleDiscovery(orgAdminName, channelName) {
	try {
		const ccpPath = path.resolve(__dirname, "connect-sdk.json");
		const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));
		const walletPath = path.join(process.cwd(), 'wallet');
		const wallet = new FileSystemWallet(walletPath);
		// Check to see if we've already enrolled the user.
		const userExists = await wallet.exists(orgAdminName);
		if (!userExists) {
			console.log(`An identity for the user ${orgAdminName} does not exist in the wallet`);
			console.log('Run the registerUser.js application before retrying');
			return;
		}
		// Create a new gateway for connecting to our peer node.
		const gateway = new Gateway();
		await gateway.connect(ccp, { wallet, identity: orgAdminName, discovery: { enabled: true, asLocalhost: false } });
		const network = await gateway.getNetwork(channelName);
		// console.log(network.getChannel())
		const currentChannel = network.getChannel()
		logger.info(currentChannel.getPeers()[1])
		// const client = gateway.getClient()
		// const currentChannel = client.getChannel(channelName)
		// logger.info(currentChannel.getChannelPeers())
		// logger.info(currentChannel.getOrderers())
	} catch (error) {
		logger.info(error)
	}
}

完成测试代码如下

channleDiscovery("admin1", "mychannel")

调用后可以看到显示内容如下

[2021-04-24T10:01:16.512] [INFO] test - ChannelPeer {
  _mspid: 'Org2MSP',
  _channel: 
   Channel {
     _name: 'mychannel',
     _channel_peers: 
      Map {
        'peer0.org1.zeng.com' => [Object],
        'peer0.org2.zeng.com:7051' => [Circular],
        'peer0.org3.zeng.com:7051' => [Object] },
     _anchor_peers: [],
     _orderers: Map { 'orderer.zeng.com:7050' => [Object] },
     _kafka_brokers: [],
     _clientContext: 
      Client {
        _cryptoSuite: [Object],
        _clientConfigMspid: null,
        _stateStore: [Object],
        _userContext: [Object],
        _network_config: [Object],
        _msps: Map {},
        _devMode: false,
        _adminSigningIdentity: null,
        _tls_mutual: [Object],
        _organizations: Map {},
        _certificateAuthorities: Map {},
        _channels: [Object],
        _connection_options: {} },
     _msp_manager: MSPManager { _msps: [Object] },
     _discovery_interests: Map {},
     _discovery_results: 
      { msps: [Object],
        orderers: [Object],
        peers_by_org: [Object],
        endorsement_plans: [],
        timestamp: 1619229676510 },
     _last_discover_timestamp: 1619229676510,
     _use_discovery: true,
     _as_localhost: false,
     _endorsement_handler: DiscoveryEndorsementHandler { _channel: [Circular] },
     _commit_handler: BasicCommitHandler { _channel: [Circular] },
     _last_refresh_request: { target: [Object], discover: true, asLocalhost: false } },
  _name: 'peer0.org2.zeng.com:7051',
  _peer: 
   Peer {
     _options: 
      { 'grpc.max_receive_message_length': -1,
        'grpc.max_send_message_length': -1,
        'grpc.keepalive_time_ms': 120000,
        'grpc.http2.min_time_between_pings_ms': 120000,
        'grpc.keepalive_timeout_ms': 20000,
        'grpc.http2.max_pings_without_data': 0,
        'grpc.keepalive_permit_without_calls': 1,
        name: 'peer0.org2.zeng.com:7051',
        'grpc.ssl_target_name_override': 'peer0.org2.zeng.com',
        'grpc.default_authority': 'peer0.org2.zeng.com' },
     useWaitForReady: false,
     clientCert: undefined,
     _url: 'grpcs://peer0.org2.zeng.com:7051',
     _endpoint: 
      Endpoint {
        protocol: 'grpcs',
        creds: ChannelCredentials {},
        addr: 'peer0.org2.zeng.com:7051' },
     _name: 'peer0.org2.zeng.com:7051',
     _request_timeout: 45000,
     _grpc_wait_for_ready_timeout: 3000,
     _endorserClient: 
      ServiceClient {
        '$interceptors': [],
        '$interceptor_providers': [],
        '$callInvocationTransformer': undefined,
        '$channel': Channel {} },
     _discoveryClient: 
      ServiceClient {
        '$interceptors': [],
        '$interceptor_providers': [],
        '$callInvocationTransformer': undefined,
        '$channel': Channel {} } },
  _roles: {} }

本文用到的json配置文件

因为我们只需要链接admin1对应的org1,然后getNetwork提交到org1对应的peer中,所以这个时候sdk.json就很简单了

{
    "name": "Network",
    "version": "1.0",
    "channels": {
        "mychannel": {
            "orderers": [
                "orderer.zeng.com"
            ],
            "peers": {
                "peer0.org1.zeng.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true,
                    "discover": true
                }
            }
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.zeng.com"
            ],
            "certificateAuthorities": [
                "ca-name"
            ],
			"tlsCACerts": {
                "path": "./crypto-config/peerOrganizations/org1.zeng.com/msp/tlscacerts/tlsca.org1.zeng.com-cert.pem"
            },
            "adminPrivateKey": {
                "path": "./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp/keystore/1508f32e9c8af9139ee1cf9434161ab6198aad8d27148e2ac5228d31bc7ea534_sk"
            },
            "signedCert": {
                "path": "./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp/signcerts/Admin@org1.zeng.com-cert.pem"
            }
        }
    },
    "peers": {
        "peer0.org1.zeng.com": {
            "url": "grpcs://peer0.org1.zeng.com:7051",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org1.zeng.com",
                "grpc.keepalive_time_ms": 600000
            },
            "tlsCACerts": {
                "path": "./crypto-config/peerOrganizations/org1.zeng.com/peers/peer0.org1.zeng.com/msp/tlscacerts/tlsca.org1.zeng.com-cert.pem"
            },
            "peerOrgTlsCaCrt": {
                "path": "./crypto-config/peerOrganizations/org1.zeng.com/peers/peer0.org1.zeng.com/tls/ca.crt"
            },
            "peerOrgClientKey": {
                    "path": "./crypto-config/peerOrganizations/org1.zeng.com/peers/peer0.org1.zeng.com/tls/server.key"
            },
            "peerOrgClientCert": {
                    "path": "./crypto-config/peerOrganizations/org1.zeng.com/peers/peer0.org1.zeng.com/tls/server.crt"
            }
        }
    }
  }

参考网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值