mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
- Made it possible to deploy the app (both the client and fabric backend) to a location other than localhost - Made it possible to work with a backend over grpc instead of always assuming grpcs - Made the list of target peers for instantiate and invoke calls to be optional - Enabled target networks to be controlled by an env variable Change-Id: Ie394cf7e8f6ed47d970d4be992f2f6a0394fff7f Signed-off-by: Jim Zhang <jzhang@us.ibm.com>
277 lines
10 KiB
JavaScript
277 lines
10 KiB
JavaScript
/**
|
|
* Copyright 2017 IBM All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
var path = require('path');
|
|
var fs = require('fs');
|
|
var util = require('util');
|
|
var hfc = require('fabric-client');
|
|
var Peer = require('fabric-client/lib/Peer.js');
|
|
var EventHub = require('fabric-client/lib/EventHub.js');
|
|
var config = require('../config.json');
|
|
var helper = require('./helper.js');
|
|
var logger = helper.getLogger('Query');
|
|
|
|
var queryChaincode = function(peer, channelName, chaincodeName, args, fcn, username, org) {
|
|
var channel = helper.getChannelForOrg(org);
|
|
var client = helper.getClientForOrg(org);
|
|
var target = buildTarget(peer, org);
|
|
return helper.getRegisteredUsers(username, org).then((user) => {
|
|
tx_id = client.newTransactionID();
|
|
// send query
|
|
var request = {
|
|
chaincodeId: chaincodeName,
|
|
txId: tx_id,
|
|
fcn: fcn,
|
|
args: args
|
|
};
|
|
return channel.queryByChaincode(request, target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter \''+username+'\'');
|
|
return 'Failed to get submitter \''+username+'\'. Error: ' + err.stack ? err.stack :
|
|
err;
|
|
}).then((response_payloads) => {
|
|
if (response_payloads) {
|
|
for (let i = 0; i < response_payloads.length; i++) {
|
|
logger.info(args[0]+' now has ' + response_payloads[i].toString('utf8') +
|
|
' after the move');
|
|
return args[0]+' now has ' + response_payloads[i].toString('utf8') +
|
|
' after the move';
|
|
}
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to end to end test with error:' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to end to end test with error:' + err.stack ? err.stack :
|
|
err;
|
|
});
|
|
};
|
|
var getBlockByNumber = function(peer, blockNumber, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
|
|
return helper.getRegisteredUsers(username, org).then((member) => {
|
|
return channel.queryBlock(parseInt(blockNumber), target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((response_payloads) => {
|
|
if (response_payloads) {
|
|
//logger.debug(response_payloads);
|
|
logger.debug(response_payloads);
|
|
return response_payloads; //response_payloads.data.data[0].buffer;
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
var getTransactionByID = function(peer, trxnID, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
|
|
return helper.getRegisteredUsers(username, org).then((member) => {
|
|
return channel.queryTransaction(trxnID, target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((response_payloads) => {
|
|
if (response_payloads) {
|
|
logger.debug(response_payloads);
|
|
return response_payloads;
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
var getBlockByHash = function(peer, hash, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
|
|
return helper.getRegisteredUsers(username, org).then((member) => {
|
|
return channel.queryBlockByHash(Buffer.from(hash), target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((response_payloads) => {
|
|
if (response_payloads) {
|
|
logger.debug(response_payloads);
|
|
return response_payloads;
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
var getChainInfo = function(peer, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
|
|
return helper.getRegisteredUsers(username, org).then((member) => {
|
|
return channel.queryInfo(target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((blockchainInfo) => {
|
|
if (blockchainInfo) {
|
|
// FIXME: Save this for testing 'getBlockByHash' ?
|
|
logger.debug('===========================================');
|
|
logger.debug(blockchainInfo.currentBlockHash);
|
|
logger.debug('===========================================');
|
|
//logger.debug(blockchainInfo);
|
|
return blockchainInfo;
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
//getInstalledChaincodes
|
|
var getInstalledChaincodes = function(peer, type, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
var client = helper.getClientForOrg(org);
|
|
|
|
return helper.getOrgAdmin(org).then((member) => {
|
|
if (type === 'installed') {
|
|
return client.queryInstalledChaincodes(target);
|
|
} else {
|
|
return channel.queryInstantiatedChaincodes(target);
|
|
}
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((response) => {
|
|
if (response) {
|
|
if (type === 'installed') {
|
|
logger.debug('<<< Installed Chaincodes >>>');
|
|
} else {
|
|
logger.debug('<<< Instantiated Chaincodes >>>');
|
|
}
|
|
var details = [];
|
|
for (let i = 0; i < response.chaincodes.length; i++) {
|
|
logger.debug('name: ' + response.chaincodes[i].name + ', version: ' +
|
|
response.chaincodes[i].version + ', path: ' + response.chaincodes[i].path
|
|
);
|
|
details.push('name: ' + response.chaincodes[i].name + ', version: ' +
|
|
response.chaincodes[i].version + ', path: ' + response.chaincodes[i].path
|
|
);
|
|
}
|
|
return details;
|
|
} else {
|
|
logger.error('response is null');
|
|
return 'response is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
var getChannels = function(peer, username, org) {
|
|
var target = buildTarget(peer, org);
|
|
var channel = helper.getChannelForOrg(org);
|
|
var client = helper.getClientForOrg(org);
|
|
|
|
return helper.getRegisteredUsers(username, org).then((member) => {
|
|
//channel.setPrimaryPeer(targets[0]);
|
|
return client.queryChannels(target);
|
|
}, (err) => {
|
|
logger.info('Failed to get submitter "' + username + '"');
|
|
return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
|
|
err.stack : err;
|
|
}).then((response) => {
|
|
if (response) {
|
|
logger.debug('<<< channels >>>');
|
|
var channelNames = [];
|
|
for (let i = 0; i < response.channels.length; i++) {
|
|
channelNames.push('channel id: ' + response.channels[i].channel_id);
|
|
}
|
|
logger.debug(channelNames);
|
|
return response;
|
|
} else {
|
|
logger.error('response_payloads is null');
|
|
return 'response_payloads is null';
|
|
}
|
|
}, (err) => {
|
|
logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
|
|
err);
|
|
return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
|
|
}).catch((err) => {
|
|
logger.error('Failed to query with error:' + err.stack ? err.stack : err);
|
|
return 'Failed to query with error:' + err.stack ? err.stack : err;
|
|
});
|
|
};
|
|
|
|
function buildTarget(peer, org) {
|
|
var target = null;
|
|
if (typeof peer !== 'undefined') {
|
|
let targets = helper.newPeers([peer], org);
|
|
if (targets && targets.length > 0) target = targets[0];
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
exports.queryChaincode = queryChaincode;
|
|
exports.getBlockByNumber = getBlockByNumber;
|
|
exports.getTransactionByID = getTransactionByID;
|
|
exports.getBlockByHash = getBlockByHash;
|
|
exports.getChainInfo = getChainInfo;
|
|
exports.getInstalledChaincodes = getInstalledChaincodes;
|
|
exports.getChannels = getChannels;
|