声明使用的版本
- 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"
}
}
}
}