From 79cb041124880f6346b33b952dfd644c02ef3ede Mon Sep 17 00:00:00 2001 From: Jim Zhang Date: Tue, 18 Jul 2017 15:21:52 -0400 Subject: [PATCH] [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 --- balance-transfer/README.md | 9 +- balance-transfer/app.js | 19 +-- balance-transfer/app/helper.js | 123 +++++++----------- balance-transfer/app/install-chaincode.js | 2 +- balance-transfer/app/instantiate-chaincode.js | 13 +- balance-transfer/app/invoke-transaction.js | 19 ++- balance-transfer/app/join-channel.js | 23 +--- balance-transfer/app/network-config-aws.json | 55 ++++++++ balance-transfer/app/network-config.json | 48 +++---- balance-transfer/app/query.js | 2 +- balance-transfer/config.js | 14 ++ balance-transfer/config.json | 5 +- balance-transfer/package.json | 9 +- balance-transfer/testAPIs.sh | 10 +- 14 files changed, 190 insertions(+), 161 deletions(-) create mode 100644 balance-transfer/app/network-config-aws.json create mode 100644 balance-transfer/config.js diff --git a/balance-transfer/README.md b/balance-transfer/README.md index 05fe0c288..f11424527 100644 --- a/balance-transfer/README.md +++ b/balance-transfer/README.md @@ -117,7 +117,7 @@ curl -s -X POST \ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051","localhost:7056"] + "peers": ["peer1","peer2"] }' ``` ### Install chaincode @@ -128,7 +128,7 @@ curl -s -X POST \ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051","localhost:7056"], + "peers": ["peer1","peer2"], "chaincodeName":"mycc", "chaincodePath":"github.com/example_cc", "chaincodeVersion":"v0" @@ -143,10 +143,8 @@ curl -s -X POST \ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051"], "chaincodeName":"mycc", "chaincodeVersion":"v0", - "fcn":"init", "args":["a","100","b","200"] }' ``` @@ -159,7 +157,6 @@ curl -s -X POST \ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051", "localhost:7056"], "fcn":"move", "args":["a","b","10"] }' @@ -232,7 +229,7 @@ curl -s -X GET \ ### Network configuration considerations -You have the ability to change configuration parameters by editing the network-config.json file. +You have the ability to change configuration parameters by either directly editing the network-config.json file or provide an additional file for an alternative target network. The app uses an optional environment variable "TARGET_NETWORK" to control the configuration files to use. For example, if you deployed the target network on Amazon Web Services EC2, you can add a file "network-config-aws.json", and set the "TARGET_NETWORK" environment to 'aws'. The app will pick up the settings inside the "network-config-aws.json" file. #### IP Address** and PORT information diff --git a/balance-transfer/app.js b/balance-transfer/app.js index a214eab6e..db936b8a1 100644 --- a/balance-transfer/app.js +++ b/balance-transfer/app.js @@ -27,7 +27,10 @@ var expressJWT = require('express-jwt'); var jwt = require('jsonwebtoken'); var bearerToken = require('express-bearer-token'); var cors = require('cors'); -var config = require('./config.json'); + +require('./config.js'); +var hfc = require('fabric-client'); + var helper = require('./app/helper.js'); var channels = require('./app/create-channel.js'); var join = require('./app/join-channel.js'); @@ -35,8 +38,8 @@ var install = require('./app/install-chaincode.js'); var instantiate = require('./app/instantiate-chaincode.js'); var invoke = require('./app/invoke-transaction.js'); var query = require('./app/query.js'); -var host = process.env.HOST || config.host; -var port = process.env.PORT || config.port; +var host = process.env.HOST || hfc.getConfigSetting('host'); +var port = process.env.PORT || hfc.getConfigSetting('port'); /////////////////////////////////////////////////////////////////////////////// //////////////////////////////// SET CONFIGURATONS //////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -118,7 +121,7 @@ app.post('/users', function(req, res) { return; } var token = jwt.sign({ - exp: Math.floor(Date.now() / 1000) + parseInt(config.jwt_expiretime), + exp: Math.floor(Date.now() / 1000) + parseInt(hfc.getConfigSetting('jwt_expiretime')), username: username, orgName: orgName }, app.get('secret')); @@ -235,10 +238,6 @@ app.post('/channels/:channelName/chaincodes', function(req, res) { res.json(getErrorMessage('\'channelName\'')); return; } - if (!fcn) { - res.json(getErrorMessage('\'fcn\'')); - return; - } if (!args) { res.json(getErrorMessage('\'args\'')); return; @@ -260,10 +259,6 @@ app.post('/channels/:channelName/chaincodes/:chaincodeName', function(req, res) logger.debug('chaincodeName : ' + chaincodeName); logger.debug('fcn : ' + fcn); logger.debug('args : ' + args); - if (!peers || peers.length == 0) { - res.json(getErrorMessage('\'peers\'')); - return; - } if (!chaincodeName) { res.json(getErrorMessage('\'chaincodeName\'')); return; diff --git a/balance-transfer/app/helper.js b/balance-transfer/app/helper.js index 5cda95a9f..8a227f747 100644 --- a/balance-transfer/app/helper.js +++ b/balance-transfer/app/helper.js @@ -24,10 +24,8 @@ var fs = require('fs-extra'); var User = require('fabric-client/lib/User.js'); var crypto = require('crypto'); var copService = require('fabric-ca-client'); -var config = require('../config.json'); var hfc = require('fabric-client'); -hfc.addConfigFile(path.join(__dirname, 'network-config.json')); hfc.setLogger(logger); var ORGS = hfc.getConfigSetting('network-config'); @@ -44,7 +42,7 @@ for (let key in ORGS) { cryptoSuite.setCryptoKeyStore(hfc.newCryptoKeyStore({path: getKeyStoreForOrg(ORGS[key].name)})); client.setCryptoSuite(cryptoSuite); - let channel = client.newChannel(config.channelName); + let channel = client.newChannel(hfc.getConfigSetting('channelName')); channel.addOrderer(newOrderer(client)); clients[key] = client; @@ -58,19 +56,18 @@ for (let key in ORGS) { } function setupPeers(channel, org, client) { - for (let key in ORGS[org]) { - if (key.indexOf('peer') === 0) { - let data = fs.readFileSync(path.join(__dirname, ORGS[org][key]['tls_cacerts'])); - let peer = client.newPeer( - ORGS[org][key].requests, - { - pem: Buffer.from(data).toString(), - 'ssl-target-name-override': ORGS[org][key]['server-hostname'] - } - ); - - channel.addPeer(peer); - } + for (let key in ORGS[org].peers) { + let data = fs.readFileSync(path.join(__dirname, ORGS[org].peers[key]['tls_cacerts'])); + let peer = client.newPeer( + ORGS[org].peers[key].requests, + { + pem: Buffer.from(data).toString(), + 'ssl-target-name-override': ORGS[org].peers[key]['server-hostname'] + } + ); + peer.setName(key); + + channel.addPeer(peer); } } @@ -78,7 +75,7 @@ function newOrderer(client) { var caRootsPath = ORGS.orderer.tls_cacerts; let data = fs.readFileSync(path.join(__dirname, caRootsPath)); let caroots = Buffer.from(data).toString(); - return client.newOrderer(config.orderer, { + return client.newOrderer(ORGS.orderer.url, { 'pem': caroots, 'ssl-target-name-override': ORGS.orderer['server-hostname'] }); @@ -100,60 +97,36 @@ function getOrgName(org) { } function getKeyStoreForOrg(org) { - return config.keyValueStore + '_' + org; + return hfc.getConfigSetting('keyValueStore') + '_' + org; } -function newRemotes(urls, forPeers, userOrg) { - var targets = []; - // find the peer that match the urls - outer: - for (let index in urls) { - let peerUrl = urls[index]; - - let found = false; - for (let key in ORGS) { - if (key.indexOf('org') === 0) { - // if looking for event hubs, an app can only connect to - // event hubs in its own org - if (!forPeers && key !== userOrg) { - continue; - } - - let org = ORGS[key]; - let client = getClientForOrg(key); - - for (let prop in org) { - if (prop.indexOf('peer') === 0) { - if (org[prop]['requests'].indexOf(peerUrl) >= 0) { - // found a peer matching the subject url - if (forPeers) { - let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts'])); - targets.push(client.newPeer('grpcs://' + peerUrl, { - pem: Buffer.from(data).toString(), - 'ssl-target-name-override': org[prop]['server-hostname'] - })); - - continue outer; - } else { - let eh = client.newEventHub(); - let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts'])); - eh.setPeerAddr(org[prop]['events'], { - pem: Buffer.from(data).toString(), - 'ssl-target-name-override': org[prop]['server-hostname'] - }); - targets.push(eh); - - continue outer; - } - } - } - } +function newRemotes(names, forPeers, userOrg) { + let client = getClientForOrg(userOrg); + + let targets = []; + // find the peer that match the names + for (let idx in names) { + let peerName = names[idx]; + if (ORGS[userOrg].peers[peerName]) { + // found a peer matching the name + let data = fs.readFileSync(path.join(__dirname, ORGS[userOrg].peers[peerName]['tls_cacerts'])); + let grpcOpts = { + pem: Buffer.from(data).toString(), + 'ssl-target-name-override': ORGS[userOrg].peers[peerName]['server-hostname'] + }; + + if (forPeers) { + targets.push(client.newPeer(ORGS[userOrg].peers[peerName].requests, grpcOpts)); + } else { + let eh = client.newEventHub(); + eh.setPeerAddr(ORGS[userOrg].peers[peerName].events, grpcOpts); + targets.push(eh); } } + } - if (!found) { - logger.error(util.format('Failed to find a peer matching the url %s', peerUrl)); - } + if (targets.length === 0) { + logger.error(util.format('Failed to find peers matching the names %s', names)); } return targets; @@ -170,12 +143,12 @@ var getClientForOrg = function(org) { return clients[org]; }; -var newPeers = function(urls) { - return newRemotes(urls, true); +var newPeers = function(names, org) { + return newRemotes(names, true, org); }; -var newEventHubs = function(urls, org) { - return newRemotes(urls, false, org); +var newEventHubs = function(names, org) { + return newRemotes(names, false, org); }; var getMspID = function(org) { @@ -184,7 +157,7 @@ var getMspID = function(org) { }; var getAdminUser = function(userOrg) { - var users = config.users; + var users = hfc.getConfigSetting('admins'); var username = users[0].username; var password = users[0].secret; var member; @@ -325,7 +298,7 @@ var getOrgAdmin = function(userOrg) { }; var setupChaincodeDeploy = function() { - process.env.GOPATH = path.join(__dirname, config.GOPATH); + process.env.GOPATH = path.join(__dirname, hfc.getConfigSetting('CC_SRC_PATH')); }; var getLogger = function(moduleName) { @@ -334,11 +307,6 @@ var getLogger = function(moduleName) { return logger; }; -var getPeerAddressByName = function(org, peer) { - var address = ORGS[org][peer].requests; - return address.split('grpcs://')[1]; -}; - exports.getChannelForOrg = getChannelForOrg; exports.getClientForOrg = getClientForOrg; exports.getLogger = getLogger; @@ -347,6 +315,5 @@ exports.getMspID = getMspID; exports.ORGS = ORGS; exports.newPeers = newPeers; exports.newEventHubs = newEventHubs; -exports.getPeerAddressByName = getPeerAddressByName; exports.getRegisteredUsers = getRegisteredUsers; exports.getOrgAdmin = getOrgAdmin; diff --git a/balance-transfer/app/install-chaincode.js b/balance-transfer/app/install-chaincode.js index fc408d77c..6f72b6d79 100644 --- a/balance-transfer/app/install-chaincode.js +++ b/balance-transfer/app/install-chaincode.js @@ -32,7 +32,7 @@ var installChaincode = function(peers, chaincodeName, chaincodePath, return helper.getOrgAdmin(org).then((user) => { var request = { - targets: helper.newPeers(peers), + targets: helper.newPeers(peers, org), chaincodePath: chaincodePath, chaincodeId: chaincodeName, chaincodeVersion: chaincodeVersion diff --git a/balance-transfer/app/instantiate-chaincode.js b/balance-transfer/app/instantiate-chaincode.js index 312eb6b60..decedbfc2 100644 --- a/balance-transfer/app/instantiate-chaincode.js +++ b/balance-transfer/app/instantiate-chaincode.js @@ -20,10 +20,8 @@ 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('instantiate-chaincode'); -hfc.addConfigFile(path.join(__dirname, 'network-config.json')); var ORGS = hfc.getConfigSetting('network-config'); var tx_id = null; var eh = null; @@ -49,10 +47,13 @@ var instantiateChaincode = function(channelName, chaincodeName, chaincodeVersion var request = { chaincodeId: chaincodeName, chaincodeVersion: chaincodeVersion, - fcn: functionName, args: args, txId: tx_id }; + + if (functionName) + request.fcn = functionName; + return channel.sendInstantiateProposal(request); }, (err) => { logger.error('Failed to initialize the channel'); @@ -88,12 +89,12 @@ var instantiateChaincode = function(channelName, chaincodeName, chaincodeVersion var deployId = tx_id.getTransactionID(); eh = client.newEventHub(); - let data = fs.readFileSync(path.join(__dirname, ORGS[org]['peer1'][ + let data = fs.readFileSync(path.join(__dirname, ORGS[org].peers['peer1'][ 'tls_cacerts' ])); - eh.setPeerAddr(ORGS[org]['peer1']['events'], { + eh.setPeerAddr(ORGS[org].peers['peer1']['events'], { pem: Buffer.from(data).toString(), - 'ssl-target-name-override': ORGS[org]['peer1']['server-hostname'] + 'ssl-target-name-override': ORGS[org].peers['peer1']['server-hostname'] }); eh.connect(); diff --git a/balance-transfer/app/invoke-transaction.js b/balance-transfer/app/invoke-transaction.js index 540980838..2a63d7fb9 100644 --- a/balance-transfer/app/invoke-transaction.js +++ b/balance-transfer/app/invoke-transaction.js @@ -19,18 +19,16 @@ var fs = require('fs'); var util = require('util'); var hfc = require('fabric-client'); var Peer = require('fabric-client/lib/Peer.js'); -var config = require('../config.json'); var helper = require('./helper.js'); var logger = helper.getLogger('invoke-chaincode'); var EventHub = require('fabric-client/lib/EventHub.js'); -hfc.addConfigFile(path.join(__dirname, 'network-config.json')); var ORGS = hfc.getConfigSetting('network-config'); -var invokeChaincode = function(peersUrls, channelName, chaincodeName, fcn, args, username, org) { +var invokeChaincode = function(peerNames, channelName, chaincodeName, fcn, args, username, org) { logger.debug(util.format('\n============ invoke transaction on organization %s ============\n', org)); var client = helper.getClientForOrg(org); var channel = helper.getChannelForOrg(org); - var targets = helper.newPeers(peersUrls); + var targets = (peerNames) ? helper.newPeers(peerNames, org) : undefined; var tx_id = null; return helper.getRegisteredUsers(username, org).then((user) => { @@ -38,13 +36,16 @@ var invokeChaincode = function(peersUrls, channelName, chaincodeName, fcn, args, logger.debug(util.format('Sending transaction "%j"', tx_id)); // send proposal to endorser var request = { - targets: targets, chaincodeId: chaincodeName, fcn: fcn, args: args, chainId: channelName, txId: tx_id }; + + if (targets) + request.targets = targets; + return channel.sendTransactionProposal(request); }, (err) => { logger.error('Failed to enroll user \'' + username + '\'. ' + err); @@ -80,7 +81,13 @@ var invokeChaincode = function(peersUrls, channelName, chaincodeName, fcn, args, var transactionID = tx_id.getTransactionID(); var eventPromises = []; - var eventhubs = helper.newEventHubs(peersUrls, org); + if (!peerNames) { + peerNames = channel.getPeers().map(function(peer) { + return peer.getName(); + }); + } + + var eventhubs = helper.newEventHubs(peerNames, org); for (let key in eventhubs) { let eh = eventhubs[key]; eh.connect(); diff --git a/balance-transfer/app/join-channel.js b/balance-transfer/app/join-channel.js index cb86a8e4a..5e174c9ae 100644 --- a/balance-transfer/app/join-channel.js +++ b/balance-transfer/app/join-channel.js @@ -67,27 +67,16 @@ var joinChannel = function(channelName, peers, username, org) { }).then((genesis_block) => { tx_id = client.newTransactionID(); var request = { - targets: helper.newPeers(peers), + targets: helper.newPeers(peers, org), txId: tx_id, block: genesis_block }; - for (let key in ORGS[org]) { - if (ORGS[org].hasOwnProperty(key)) { - if (key.indexOf('peer') === 0) { - let data = fs.readFileSync(path.join(__dirname, ORGS[org][key][ - 'tls_cacerts' - ])); - let eh = client.newEventHub(); - eh.setPeerAddr(ORGS[org][key].events, { - pem: Buffer.from(data).toString(), - 'ssl-target-name-override': ORGS[org][key]['server-hostname'] - }); - eh.connect(); - eventhubs.push(eh); - allEventhubs.push(eh); - } - } + eventhubs = helper.newEventHubs(peers, org); + for (let key in eventhubs) { + let eh = eventhubs[key]; + eh.connect(); + allEventhubs.push(eh); } var eventPromises = []; diff --git a/balance-transfer/app/network-config-aws.json b/balance-transfer/app/network-config-aws.json new file mode 100644 index 000000000..310cfbe97 --- /dev/null +++ b/balance-transfer/app/network-config-aws.json @@ -0,0 +1,55 @@ +{ + "network-config": { + "orderer": { + "url": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7050", + "server-hostname": "orderer.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt" + }, + "org1": { + "name": "peerOrg1", + "mspid": "Org1MSP", + "ca": "https://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7054", + "peers": { + "peer1": { + "requests": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7051", + "events": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7053", + "server-hostname": "peer0.org1.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" + }, + "peer2": { + "requests": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7056", + "events": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:7058", + "server-hostname": "peer1.org1.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt" + } + }, + "admin": { + "key": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore", + "cert": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts" + } + }, + "org2": { + "name": "peerOrg2", + "mspid": "Org2MSP", + "ca": "https://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:8054", + "peers": { + "peer1": { + "requests": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:8051", + "events": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:8053", + "server-hostname": "peer0.org2.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" + }, + "peer2": { + "requests": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:8056", + "events": "grpc://ec2-13-59-99-140.us-east-2.compute.amazonaws.com:8058", + "server-hostname": "peer1.org2.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt" + } + }, + "admin": { + "key": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore", + "cert": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts" + } + } + } +} diff --git a/balance-transfer/app/network-config.json b/balance-transfer/app/network-config.json index b305d20a8..80289fa78 100644 --- a/balance-transfer/app/network-config.json +++ b/balance-transfer/app/network-config.json @@ -9,17 +9,19 @@ "name": "peerOrg1", "mspid": "Org1MSP", "ca": "https://localhost:7054", - "peer1": { - "requests": "grpcs://localhost:7051", - "events": "grpcs://localhost:7053", - "server-hostname": "peer0.org1.example.com", - "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" - }, - "peer2": { - "requests": "grpcs://localhost:7056", - "events": "grpcs://localhost:7058", - "server-hostname": "peer1.org1.example.com", - "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt" + "peers": { + "peer1": { + "requests": "grpcs://localhost:7051", + "events": "grpcs://localhost:7053", + "server-hostname": "peer0.org1.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" + }, + "peer2": { + "requests": "grpcs://localhost:7056", + "events": "grpcs://localhost:7058", + "server-hostname": "peer1.org1.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt" + } }, "admin": { "key": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore", @@ -30,17 +32,19 @@ "name": "peerOrg2", "mspid": "Org2MSP", "ca": "https://localhost:8054", - "peer1": { - "requests": "grpcs://localhost:8051", - "events": "grpcs://localhost:8053", - "server-hostname": "peer0.org2.example.com", - "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" - }, - "peer2": { - "requests": "grpcs://localhost:8056", - "events": "grpcs://localhost:8058", - "server-hostname": "peer1.org2.example.com", - "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt" + "peers": { + "peer1": { + "requests": "grpcs://localhost:8051", + "events": "grpcs://localhost:8053", + "server-hostname": "peer0.org2.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" + }, + "peer2": { + "requests": "grpcs://localhost:8056", + "events": "grpcs://localhost:8058", + "server-hostname": "peer1.org2.example.com", + "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt" + } }, "admin": { "key": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore", diff --git a/balance-transfer/app/query.js b/balance-transfer/app/query.js index ddf2eddfd..ef8676b16 100644 --- a/balance-transfer/app/query.js +++ b/balance-transfer/app/query.js @@ -261,7 +261,7 @@ var getChannels = function(peer, username, org) { function buildTarget(peer, org) { var target = null; if (typeof peer !== 'undefined') { - let targets = helper.newPeers([helper.getPeerAddressByName(org, peer)]); + let targets = helper.newPeers([peer], org); if (targets && targets.length > 0) target = targets[0]; } diff --git a/balance-transfer/config.js b/balance-transfer/config.js new file mode 100644 index 000000000..3ff928f7f --- /dev/null +++ b/balance-transfer/config.js @@ -0,0 +1,14 @@ +var util = require('util'); +var path = require('path'); +var hfc = require('fabric-client'); + +var file = 'network-config%s.json'; + +var env = process.env.TARGET_NETWORK; +if (env) + file = util.format(file, '-' + env); +else + file = util.format(file, ''); + +hfc.addConfigFile(path.join(__dirname, 'app', file)); +hfc.addConfigFile(path.join(__dirname, 'config.json')); \ No newline at end of file diff --git a/balance-transfer/config.json b/balance-transfer/config.json index e490a04fe..d2fe9c0bb 100644 --- a/balance-transfer/config.json +++ b/balance-transfer/config.json @@ -3,11 +3,10 @@ "port":"4000", "jwt_expiretime": "36000", "channelName":"mychannel", - "GOPATH":"../artifacts", + "CC_SRC_PATH":"../artifacts", "keyValueStore":"/tmp/fabric-client-kvs", "eventWaitTime":"30000", - "orderer":"grpcs://localhost:7050", - "users":[ + "admins":[ { "username":"admin", "secret":"adminpw" diff --git a/balance-transfer/package.json b/balance-transfer/package.json index 555cfc34d..f95a80bef 100644 --- a/balance-transfer/package.json +++ b/balance-transfer/package.json @@ -2,15 +2,18 @@ "name": "balance-transfer", "version": "1.0.0", "description": "A balance-transfer example node program to demonstrate using node.js SDK APIs", - "main": "app/app.js", + "main": "app.js", + "scripts": { + "start": "node app.js" + }, "keywords": [ "fabric-client sample app", "balance-transfer node sample", "v1.0 fabric nodesdk sample" ], "engines": { - "node": ">=6.9.5", - "npm": ">=3.10.10" + "node": ">=6.9.5 <7.0", + "npm": ">=3.10.10 <4.0" }, "license": "Apache-2.0", "dependencies": { diff --git a/balance-transfer/testAPIs.sh b/balance-transfer/testAPIs.sh index 918c6e448..ab0d7eb8b 100755 --- a/balance-transfer/testAPIs.sh +++ b/balance-transfer/testAPIs.sh @@ -56,7 +56,7 @@ curl -s -X POST \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051","localhost:7056"] + "peers": ["peer1","peer2"] }' echo echo @@ -68,7 +68,7 @@ curl -s -X POST \ -H "authorization: Bearer $ORG2_TOKEN" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:8051","localhost:8056"] + "peers": ["peer1","peer2"] }' echo echo @@ -80,7 +80,7 @@ curl -s -X POST \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051","localhost:7056"], + "peers": ["peer1", "peer2"], "chaincodeName":"mycc", "chaincodePath":"github.com/example_cc", "chaincodeVersion":"v0" @@ -96,7 +96,7 @@ curl -s -X POST \ -H "authorization: Bearer $ORG2_TOKEN" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:8051","localhost:8056"], + "peers": ["peer1","peer2"], "chaincodeName":"mycc", "chaincodePath":"github.com/example_cc", "chaincodeVersion":"v0" @@ -113,7 +113,6 @@ curl -s -X POST \ -d '{ "chaincodeName":"mycc", "chaincodeVersion":"v0", - "fcn":"init", "args":["a","100","b","200"] }' echo @@ -126,7 +125,6 @@ TRX_ID=$(curl -s -X POST \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ - "peers": ["localhost:7051", "localhost:8051"], "fcn":"move", "args":["a","b","10"] }')