fabric-samples/balance-transfer/app/query.js
Jim Zhang 79cb041124 [FAB-5303] Further balance-transfer code optimization
- 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>
2017-07-26 18:00:05 +00:00

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;