Skip to content

Commit 79cb041

Browse files
committed
[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>
1 parent d9e2d5c commit 79cb041

14 files changed

+190
-161
lines changed

balance-transfer/README.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ curl -s -X POST \
117117
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
118118
-H "content-type: application/json" \
119119
-d '{
120-
"peers": ["localhost:7051","localhost:7056"]
120+
"peers": ["peer1","peer2"]
121121
}'
122122
```
123123
### Install chaincode
@@ -128,7 +128,7 @@ curl -s -X POST \
128128
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
129129
-H "content-type: application/json" \
130130
-d '{
131-
"peers": ["localhost:7051","localhost:7056"],
131+
"peers": ["peer1","peer2"],
132132
"chaincodeName":"mycc",
133133
"chaincodePath":"github.com/example_cc",
134134
"chaincodeVersion":"v0"
@@ -143,10 +143,8 @@ curl -s -X POST \
143143
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
144144
-H "content-type: application/json" \
145145
-d '{
146-
"peers": ["localhost:7051"],
147146
"chaincodeName":"mycc",
148147
"chaincodeVersion":"v0",
149-
"fcn":"init",
150148
"args":["a","100","b","200"]
151149
}'
152150
```
@@ -159,7 +157,6 @@ curl -s -X POST \
159157
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
160158
-H "content-type: application/json" \
161159
-d '{
162-
"peers": ["localhost:7051", "localhost:7056"],
163160
"fcn":"move",
164161
"args":["a","b","10"]
165162
}'
@@ -232,7 +229,7 @@ curl -s -X GET \
232229

233230
### Network configuration considerations
234231

235-
You have the ability to change configuration parameters by editing the network-config.json file.
232+
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.
236233

237234
#### IP Address** and PORT information
238235

balance-transfer/app.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,19 @@ var expressJWT = require('express-jwt');
2727
var jwt = require('jsonwebtoken');
2828
var bearerToken = require('express-bearer-token');
2929
var cors = require('cors');
30-
var config = require('./config.json');
30+
31+
require('./config.js');
32+
var hfc = require('fabric-client');
33+
3134
var helper = require('./app/helper.js');
3235
var channels = require('./app/create-channel.js');
3336
var join = require('./app/join-channel.js');
3437
var install = require('./app/install-chaincode.js');
3538
var instantiate = require('./app/instantiate-chaincode.js');
3639
var invoke = require('./app/invoke-transaction.js');
3740
var query = require('./app/query.js');
38-
var host = process.env.HOST || config.host;
39-
var port = process.env.PORT || config.port;
41+
var host = process.env.HOST || hfc.getConfigSetting('host');
42+
var port = process.env.PORT || hfc.getConfigSetting('port');
4043
///////////////////////////////////////////////////////////////////////////////
4144
//////////////////////////////// SET CONFIGURATONS ////////////////////////////
4245
///////////////////////////////////////////////////////////////////////////////
@@ -118,7 +121,7 @@ app.post('/users', function(req, res) {
118121
return;
119122
}
120123
var token = jwt.sign({
121-
exp: Math.floor(Date.now() / 1000) + parseInt(config.jwt_expiretime),
124+
exp: Math.floor(Date.now() / 1000) + parseInt(hfc.getConfigSetting('jwt_expiretime')),
122125
username: username,
123126
orgName: orgName
124127
}, app.get('secret'));
@@ -235,10 +238,6 @@ app.post('/channels/:channelName/chaincodes', function(req, res) {
235238
res.json(getErrorMessage('\'channelName\''));
236239
return;
237240
}
238-
if (!fcn) {
239-
res.json(getErrorMessage('\'fcn\''));
240-
return;
241-
}
242241
if (!args) {
243242
res.json(getErrorMessage('\'args\''));
244243
return;
@@ -260,10 +259,6 @@ app.post('/channels/:channelName/chaincodes/:chaincodeName', function(req, res)
260259
logger.debug('chaincodeName : ' + chaincodeName);
261260
logger.debug('fcn : ' + fcn);
262261
logger.debug('args : ' + args);
263-
if (!peers || peers.length == 0) {
264-
res.json(getErrorMessage('\'peers\''));
265-
return;
266-
}
267262
if (!chaincodeName) {
268263
res.json(getErrorMessage('\'chaincodeName\''));
269264
return;

balance-transfer/app/helper.js

Lines changed: 45 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@ var fs = require('fs-extra');
2424
var User = require('fabric-client/lib/User.js');
2525
var crypto = require('crypto');
2626
var copService = require('fabric-ca-client');
27-
var config = require('../config.json');
2827

2928
var hfc = require('fabric-client');
30-
hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
3129
hfc.setLogger(logger);
3230
var ORGS = hfc.getConfigSetting('network-config');
3331

@@ -44,7 +42,7 @@ for (let key in ORGS) {
4442
cryptoSuite.setCryptoKeyStore(hfc.newCryptoKeyStore({path: getKeyStoreForOrg(ORGS[key].name)}));
4543
client.setCryptoSuite(cryptoSuite);
4644

47-
let channel = client.newChannel(config.channelName);
45+
let channel = client.newChannel(hfc.getConfigSetting('channelName'));
4846
channel.addOrderer(newOrderer(client));
4947

5048
clients[key] = client;
@@ -58,27 +56,26 @@ for (let key in ORGS) {
5856
}
5957

6058
function setupPeers(channel, org, client) {
61-
for (let key in ORGS[org]) {
62-
if (key.indexOf('peer') === 0) {
63-
let data = fs.readFileSync(path.join(__dirname, ORGS[org][key]['tls_cacerts']));
64-
let peer = client.newPeer(
65-
ORGS[org][key].requests,
66-
{
67-
pem: Buffer.from(data).toString(),
68-
'ssl-target-name-override': ORGS[org][key]['server-hostname']
69-
}
70-
);
71-
72-
channel.addPeer(peer);
73-
}
59+
for (let key in ORGS[org].peers) {
60+
let data = fs.readFileSync(path.join(__dirname, ORGS[org].peers[key]['tls_cacerts']));
61+
let peer = client.newPeer(
62+
ORGS[org].peers[key].requests,
63+
{
64+
pem: Buffer.from(data).toString(),
65+
'ssl-target-name-override': ORGS[org].peers[key]['server-hostname']
66+
}
67+
);
68+
peer.setName(key);
69+
70+
channel.addPeer(peer);
7471
}
7572
}
7673

7774
function newOrderer(client) {
7875
var caRootsPath = ORGS.orderer.tls_cacerts;
7976
let data = fs.readFileSync(path.join(__dirname, caRootsPath));
8077
let caroots = Buffer.from(data).toString();
81-
return client.newOrderer(config.orderer, {
78+
return client.newOrderer(ORGS.orderer.url, {
8279
'pem': caroots,
8380
'ssl-target-name-override': ORGS.orderer['server-hostname']
8481
});
@@ -100,60 +97,36 @@ function getOrgName(org) {
10097
}
10198

10299
function getKeyStoreForOrg(org) {
103-
return config.keyValueStore + '_' + org;
100+
return hfc.getConfigSetting('keyValueStore') + '_' + org;
104101
}
105102

106-
function newRemotes(urls, forPeers, userOrg) {
107-
var targets = [];
108-
// find the peer that match the urls
109-
outer:
110-
for (let index in urls) {
111-
let peerUrl = urls[index];
112-
113-
let found = false;
114-
for (let key in ORGS) {
115-
if (key.indexOf('org') === 0) {
116-
// if looking for event hubs, an app can only connect to
117-
// event hubs in its own org
118-
if (!forPeers && key !== userOrg) {
119-
continue;
120-
}
121-
122-
let org = ORGS[key];
123-
let client = getClientForOrg(key);
124-
125-
for (let prop in org) {
126-
if (prop.indexOf('peer') === 0) {
127-
if (org[prop]['requests'].indexOf(peerUrl) >= 0) {
128-
// found a peer matching the subject url
129-
if (forPeers) {
130-
let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts']));
131-
targets.push(client.newPeer('grpcs://' + peerUrl, {
132-
pem: Buffer.from(data).toString(),
133-
'ssl-target-name-override': org[prop]['server-hostname']
134-
}));
135-
136-
continue outer;
137-
} else {
138-
let eh = client.newEventHub();
139-
let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts']));
140-
eh.setPeerAddr(org[prop]['events'], {
141-
pem: Buffer.from(data).toString(),
142-
'ssl-target-name-override': org[prop]['server-hostname']
143-
});
144-
targets.push(eh);
145-
146-
continue outer;
147-
}
148-
}
149-
}
150-
}
103+
function newRemotes(names, forPeers, userOrg) {
104+
let client = getClientForOrg(userOrg);
105+
106+
let targets = [];
107+
// find the peer that match the names
108+
for (let idx in names) {
109+
let peerName = names[idx];
110+
if (ORGS[userOrg].peers[peerName]) {
111+
// found a peer matching the name
112+
let data = fs.readFileSync(path.join(__dirname, ORGS[userOrg].peers[peerName]['tls_cacerts']));
113+
let grpcOpts = {
114+
pem: Buffer.from(data).toString(),
115+
'ssl-target-name-override': ORGS[userOrg].peers[peerName]['server-hostname']
116+
};
117+
118+
if (forPeers) {
119+
targets.push(client.newPeer(ORGS[userOrg].peers[peerName].requests, grpcOpts));
120+
} else {
121+
let eh = client.newEventHub();
122+
eh.setPeerAddr(ORGS[userOrg].peers[peerName].events, grpcOpts);
123+
targets.push(eh);
151124
}
152125
}
126+
}
153127

154-
if (!found) {
155-
logger.error(util.format('Failed to find a peer matching the url %s', peerUrl));
156-
}
128+
if (targets.length === 0) {
129+
logger.error(util.format('Failed to find peers matching the names %s', names));
157130
}
158131

159132
return targets;
@@ -170,12 +143,12 @@ var getClientForOrg = function(org) {
170143
return clients[org];
171144
};
172145

173-
var newPeers = function(urls) {
174-
return newRemotes(urls, true);
146+
var newPeers = function(names, org) {
147+
return newRemotes(names, true, org);
175148
};
176149

177-
var newEventHubs = function(urls, org) {
178-
return newRemotes(urls, false, org);
150+
var newEventHubs = function(names, org) {
151+
return newRemotes(names, false, org);
179152
};
180153

181154
var getMspID = function(org) {
@@ -184,7 +157,7 @@ var getMspID = function(org) {
184157
};
185158

186159
var getAdminUser = function(userOrg) {
187-
var users = config.users;
160+
var users = hfc.getConfigSetting('admins');
188161
var username = users[0].username;
189162
var password = users[0].secret;
190163
var member;
@@ -325,7 +298,7 @@ var getOrgAdmin = function(userOrg) {
325298
};
326299

327300
var setupChaincodeDeploy = function() {
328-
process.env.GOPATH = path.join(__dirname, config.GOPATH);
301+
process.env.GOPATH = path.join(__dirname, hfc.getConfigSetting('CC_SRC_PATH'));
329302
};
330303

331304
var getLogger = function(moduleName) {
@@ -334,11 +307,6 @@ var getLogger = function(moduleName) {
334307
return logger;
335308
};
336309

337-
var getPeerAddressByName = function(org, peer) {
338-
var address = ORGS[org][peer].requests;
339-
return address.split('grpcs://')[1];
340-
};
341-
342310
exports.getChannelForOrg = getChannelForOrg;
343311
exports.getClientForOrg = getClientForOrg;
344312
exports.getLogger = getLogger;
@@ -347,6 +315,5 @@ exports.getMspID = getMspID;
347315
exports.ORGS = ORGS;
348316
exports.newPeers = newPeers;
349317
exports.newEventHubs = newEventHubs;
350-
exports.getPeerAddressByName = getPeerAddressByName;
351318
exports.getRegisteredUsers = getRegisteredUsers;
352319
exports.getOrgAdmin = getOrgAdmin;

balance-transfer/app/install-chaincode.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var installChaincode = function(peers, chaincodeName, chaincodePath,
3232

3333
return helper.getOrgAdmin(org).then((user) => {
3434
var request = {
35-
targets: helper.newPeers(peers),
35+
targets: helper.newPeers(peers, org),
3636
chaincodePath: chaincodePath,
3737
chaincodeId: chaincodeName,
3838
chaincodeVersion: chaincodeVersion

balance-transfer/app/instantiate-chaincode.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ var util = require('util');
2020
var hfc = require('fabric-client');
2121
var Peer = require('fabric-client/lib/Peer.js');
2222
var EventHub = require('fabric-client/lib/EventHub.js');
23-
var config = require('../config.json');
2423
var helper = require('./helper.js');
2524
var logger = helper.getLogger('instantiate-chaincode');
26-
hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
2725
var ORGS = hfc.getConfigSetting('network-config');
2826
var tx_id = null;
2927
var eh = null;
@@ -49,10 +47,13 @@ var instantiateChaincode = function(channelName, chaincodeName, chaincodeVersion
4947
var request = {
5048
chaincodeId: chaincodeName,
5149
chaincodeVersion: chaincodeVersion,
52-
fcn: functionName,
5350
args: args,
5451
txId: tx_id
5552
};
53+
54+
if (functionName)
55+
request.fcn = functionName;
56+
5657
return channel.sendInstantiateProposal(request);
5758
}, (err) => {
5859
logger.error('Failed to initialize the channel');
@@ -88,12 +89,12 @@ var instantiateChaincode = function(channelName, chaincodeName, chaincodeVersion
8889
var deployId = tx_id.getTransactionID();
8990

9091
eh = client.newEventHub();
91-
let data = fs.readFileSync(path.join(__dirname, ORGS[org]['peer1'][
92+
let data = fs.readFileSync(path.join(__dirname, ORGS[org].peers['peer1'][
9293
'tls_cacerts'
9394
]));
94-
eh.setPeerAddr(ORGS[org]['peer1']['events'], {
95+
eh.setPeerAddr(ORGS[org].peers['peer1']['events'], {
9596
pem: Buffer.from(data).toString(),
96-
'ssl-target-name-override': ORGS[org]['peer1']['server-hostname']
97+
'ssl-target-name-override': ORGS[org].peers['peer1']['server-hostname']
9798
});
9899
eh.connect();
99100

0 commit comments

Comments
 (0)