diff --git a/balance-transfer/README.md b/balance-transfer/README.md index 42fef2930c..1d4cf00b0c 100644 --- a/balance-transfer/README.md +++ b/balance-transfer/README.md @@ -108,7 +108,7 @@ cd fabric-samples/balance-transfer "success": true, "secret": "RaxhMgevgJcm", "message": "Jim enrolled Successfully", - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" + "token": "" } ``` @@ -119,7 +119,7 @@ The response contains the success/failure status, an **enrollment Secret** and a ``` curl -s -X POST \ http://localhost:4000/channels \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ -d '{ "channelName":"mychannel", @@ -134,7 +134,7 @@ Please note that the Header **authorization** must contain the JWT returned from ``` curl -s -X POST \ http://localhost:4000/channels/mychannel/peers \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"] @@ -145,30 +145,30 @@ curl -s -X POST \ ``` curl -s -X POST \ http://localhost:4000/chaincodes \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", - "chaincodePath":"github.com/example_cc", + "chaincodePath":"github.com/example_cc/go", "chaincodeType": "golang", "chaincodeVersion":"v0" }' ``` -**NOTE:** *chaincodeType* must be set to **node** when node.js chaincode is used and *chaincodePath* must be set to the location of the node.js chaincode. +**NOTE:** *chaincodeType* must be set to **node** when node.js chaincode is used and *chaincodePath* must be set to the location of the node.js chaincode. Also put in the $PWD ``` ex: curl -s -X POST \ http://localhost:4000/chaincodes \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ - -d "{ - \"peers\": [\"peer0.org1.example.com\",\"peer1.org1.example.com\"], - \"chaincodeName\":\"mycc\", - \"chaincodePath\":\"$PWD/artifacts/src/github.com/example_cc/node\", - \"chaincodeType\": \"node\", - \"chaincodeVersion\":\"v0\" -}" + -d '{ + "peers": ["peer0.org1.example.com","peer1.org1.example.com"], + "chaincodeName":"mycc", + "chaincodePath":"$PWD/artifacts/src/github.com/example_cc/node", + "chaincodeType": "node", + "chaincodeVersion":"v0" +}' ``` ### Instantiate chaincode @@ -176,9 +176,10 @@ curl -s -X POST \ ``` curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ -d '{ + "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", "chaincodeVersion":"v0", "chaincodeType": "golang", @@ -192,9 +193,10 @@ curl -s -X POST \ ``` curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes/mycc \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" \ -d '{ + "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "fcn":"move", "args":["a","b","10"] }' @@ -206,7 +208,7 @@ curl -s -X POST \ ``` curl -s -X GET \ "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer0.org1.example.com&fcn=query&args=%5B%22a%22%5D" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` @@ -215,18 +217,18 @@ curl -s -X GET \ ``` curl -s -X GET \ "http://localhost:4000/channels/mychannel/blocks/1?peer=peer0.org1.example.com" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` ### Query Transaction by TransactionID ``` -curl -s -X GET http://localhost:4000/channels/mychannel/transactions/TRX_ID?peer=peer0.org1.example.com \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ +curl -s -X GET http://localhost:4000/channels/mychannel/transactions/?peer=peer0.org1.example.com \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` -**NOTE**: Here the TRX_ID can be from any previous invoke transaction, see results of the invoke request, will look something like `8a95b1794cb17e7772164c3f1292f8410fcfdc1943955a35c9764a21fcd1d1b3`. +**NOTE**: The transaction id can be from any previous invoke transaction, see results of the invoke request, will look something like `8a95b1794cb17e7772164c3f1292f8410fcfdc1943955a35c9764a21fcd1d1b3`. ### Query ChainInfo @@ -234,7 +236,7 @@ curl -s -X GET http://localhost:4000/channels/mychannel/transactions/TRX_ID?peer ``` curl -s -X GET \ "http://localhost:4000/channels/mychannel?peer=peer0.org1.example.com" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` @@ -243,7 +245,7 @@ curl -s -X GET \ ``` curl -s -X GET \ "http://localhost:4000/chaincodes?peer=peer0.org1.example.com&type=installed" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` @@ -252,7 +254,7 @@ curl -s -X GET \ ``` curl -s -X GET \ "http://localhost:4000/chaincodes?peer=peer0.org1.example.com&type=instantiated" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` @@ -261,7 +263,7 @@ curl -s -X GET \ ``` curl -s -X GET \ "http://localhost:4000/channels?peer=peer0.org1.example.com" \ - -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \ + -H "authorization: Bearer " \ -H "content-type: application/json" ``` diff --git a/balance-transfer/app.js b/balance-transfer/app.js index 7b62b84a4e..cffddce80a 100644 --- a/balance-transfer/app.js +++ b/balance-transfer/app.js @@ -126,11 +126,13 @@ app.post('/users', async function(req, res) { orgName: orgName }, app.get('secret')); let response = await helper.getRegisteredUser(username, orgName, true); - logger.debug('Successfully returned from registering the username %s for organization %s',username,orgName); + logger.debug('-- returned from registering the username %s for organization %s',username,orgName); if (response && typeof response !== 'string') { + logger.debug('Successfully registered the username %s for organization %s',username,orgName); response.token = token; res.json(response); } else { + logger.debug('Failed to register the username %s for organization %s with::%s',username,orgName,response); res.json({success: false, message: response}); } @@ -215,12 +217,14 @@ app.post('/chaincodes', async function(req, res) { // Instantiate chaincode on target peers app.post('/channels/:channelName/chaincodes', async function(req, res) { logger.debug('==================== INSTANTIATE CHAINCODE =================='); + var peers = req.body.peers; var chaincodeName = req.body.chaincodeName; var chaincodeVersion = req.body.chaincodeVersion; var channelName = req.params.channelName; var chaincodeType = req.body.chaincodeType; var fcn = req.body.fcn; var args = req.body.args; + logger.debug('peers : ' + peers); logger.debug('channelName : ' + channelName); logger.debug('chaincodeName : ' + chaincodeName); logger.debug('chaincodeVersion : ' + chaincodeVersion); @@ -248,7 +252,7 @@ app.post('/channels/:channelName/chaincodes', async function(req, res) { return; } - let message = await instantiate.instantiateChaincode(channelName, chaincodeName, chaincodeVersion, chaincodeType, fcn, args, req.username, req.orgname); + let message = await instantiate.instantiateChaincode(peers, channelName, chaincodeName, chaincodeVersion, chaincodeType, fcn, args, req.username, req.orgname); res.send(message); }); // Invoke transaction on chaincode on target peers diff --git a/balance-transfer/app/helper.js b/balance-transfer/app/helper.js index 20c7db19ff..42f579f6de 100644 --- a/balance-transfer/app/helper.js +++ b/balance-transfer/app/helper.js @@ -20,9 +20,6 @@ logger.setLevel('DEBUG'); var path = require('path'); var util = require('util'); -var fs = require('fs-extra'); -var User = require('fabric-client/lib/User.js'); -var crypto = require('crypto'); var copService = require('fabric-ca-client'); var hfc = require('fabric-client'); @@ -85,6 +82,7 @@ var getRegisteredUser = async function(username, userOrg, isJson) { logger.info('Successfully loaded member from persistence'); } else { // user was not enrolled, so we will need an admin user object to register + logger.info('User %s was not enrolled, so we will need an admin user object to register',username); var admins = hfc.getConfigSetting('admins'); let adminUserObj = await client.setUserContext({username: admins[0].username, password: admins[0].secret}); let caClient = client.getCertificateAuthority(); diff --git a/balance-transfer/app/instantiate-chaincode.js b/balance-transfer/app/instantiate-chaincode.js index fe529a6b19..a7c51cd9b6 100644 --- a/balance-transfer/app/instantiate-chaincode.js +++ b/balance-transfer/app/instantiate-chaincode.js @@ -21,7 +21,7 @@ var hfc = require('fabric-client'); var helper = require('./helper.js'); var logger = helper.getLogger('instantiate-chaincode'); -var instantiateChaincode = async function(channelName, chaincodeName, chaincodeVersion, functionName, chaincodeType, args, username, org_name) { +var instantiateChaincode = async function(peers, channelName, chaincodeName, chaincodeVersion, functionName, chaincodeType, args, username, org_name) { logger.debug('\n\n============ Instantiate chaincode on channel ' + channelName + ' ============\n'); var error_message = null; @@ -45,6 +45,7 @@ var instantiateChaincode = async function(channelName, chaincodeName, chaincodeV // send proposal to endorser var request = { + targets : peers, chaincodeId: chaincodeName, chaincodeType: chaincodeType, chaincodeVersion: chaincodeVersion, @@ -128,10 +129,11 @@ var instantiateChaincode = async function(channelName, chaincodeName, chaincodeV }); var orderer_request = { - txId: tx_id, //must includethe transaction id so that the outbound + txId: tx_id, // must include the transaction id so that the outbound // transaction to the orderer will be signed by the admin // id as was the proposal above, notice that transactionID - // generated above was based on the admin id not userContext. + // generated above was based on the admin id not the current + // user assigned to the 'client' instance. proposalResponses: proposalResponses, proposal: proposal }; diff --git a/balance-transfer/app/invoke-transaction.js b/balance-transfer/app/invoke-transaction.js index b6b13412d3..3b84d9ed85 100644 --- a/balance-transfer/app/invoke-transaction.js +++ b/balance-transfer/app/invoke-transaction.js @@ -42,6 +42,7 @@ var invokeChaincode = async function(peerNames, channelName, chaincodeName, fcn, // send proposal to endorser var request = { + targets: peerNames, chaincodeId: chaincodeName, fcn: fcn, args: args, @@ -167,9 +168,10 @@ var invokeChaincode = async function(peerNames, channelName, chaincodeName, fcn, if (!error_message) { let message = util.format( - 'Successfully invoked the chaincode %s to the channel \'%s\'', - org_name, channelName); + 'Successfully invoked the chaincode %s to the channel \'%s\' for transaction ID: %s', + org_name, channelName, tx_id_string); logger.info(message); + return tx_id_string; } else { let message = util.format('Failed to invoke chaincode. cause:%s',error_message); diff --git a/balance-transfer/package-lock.json b/balance-transfer/package-lock.json index a022a0acf6..d10a673f61 100644 --- a/balance-transfer/package-lock.json +++ b/balance-transfer/package-lock.json @@ -553,9 +553,9 @@ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, "fabric-ca-client": { - "version": "1.1.0-snapshot.25", - "resolved": "https://registry.npmjs.org/fabric-ca-client/-/fabric-ca-client-1.1.0-snapshot.25.tgz", - "integrity": "sha512-mhMasJ/y7pkzF4EJi4zk4mjKu/DGy6NyRCzmX9bV2SW0Kyqz4UMFmOe5iV9P0BXTDm31peplp2XCvRNyH3MV+g==", + "version": "1.1.0-snapshot.39", + "resolved": "https://registry.npmjs.org/fabric-ca-client/-/fabric-ca-client-1.1.0-snapshot.39.tgz", + "integrity": "sha512-6aG5Y2+ZcVOxEyTdY/AJpJ/hJbJT6NL9mQh8NfigfAy9ywZjWJfr5B5EAYT0eD0YBbu8b5JspytbPVMm4qPxwA==", "requires": { "bn.js": "4.11.8", "elliptic": "6.4.0", @@ -564,7 +564,7 @@ "jsrsasign": "6.2.2", "jssha": "2.3.1", "nconf": "0.8.5", - "sjcl": "1.0.3", + "sjcl": "1.0.7", "sjcl-codec": "0.1.1", "url": "0.11.0", "util": "0.10.3", @@ -582,13 +582,18 @@ "path-is-absolute": "1.0.1", "rimraf": "2.6.2" } + }, + "sjcl": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.7.tgz", + "integrity": "sha1-MrNlpQ3Ju6JriLo8nfjqNCF9n0U=" } } }, "fabric-client": { - "version": "1.1.0-snapshot.25", - "resolved": "https://registry.npmjs.org/fabric-client/-/fabric-client-1.1.0-snapshot.25.tgz", - "integrity": "sha512-gZYoVvs1Q1BzIY8HZZi6adl7OerDaqxiCbCErivv6s23vgHYmcvulFIvhQZQt3IdBiT25yOnhfdpcjlj5d4O7w==", + "version": "1.1.0-snapshot.39", + "resolved": "https://registry.npmjs.org/fabric-client/-/fabric-client-1.1.0-snapshot.39.tgz", + "integrity": "sha512-NKgtVdDI8GuWseUXJVMb528+31bueb0aPKeXps1eyEkZu/bX0JmkSw5/YypWoMPeMlk2x6iiFl5WhTWd2ThXHA==", "requires": { "bn.js": "4.11.8", "callsite": "1.0.0", @@ -607,7 +612,7 @@ "path": "0.12.7", "pkcs11js": "1.0.10", "promise-settle": "0.3.0", - "sjcl": "1.0.3", + "sjcl": "1.0.7", "sjcl-codec": "0.1.1", "stream-buffers": "3.0.1", "tar-stream": "1.5.2", @@ -627,6 +632,11 @@ "path-is-absolute": "1.0.1", "rimraf": "2.6.2" } + }, + "sjcl": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.7.tgz", + "integrity": "sha1-MrNlpQ3Ju6JriLo8nfjqNCF9n0U=" } } }, @@ -1333,13 +1343,6 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "bundled": true, @@ -1349,6 +1352,13 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "bundled": true @@ -2247,11 +2257,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, - "sjcl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.3.tgz", - "integrity": "sha1-TtSGSY7Wt0K11KIZAiaBFvBUpwk=" - }, "sjcl-codec": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/sjcl-codec/-/sjcl-codec-0.1.1.tgz", @@ -2307,14 +2312,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.1.tgz", "integrity": "sha1-aKOMX6re3tef95mI02jj+xMl7wY=" }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -2325,6 +2322,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", diff --git a/balance-transfer/testAPIs.sh b/balance-transfer/testAPIs.sh index 191d299f14..57673c6302 100755 --- a/balance-transfer/testAPIs.sh +++ b/balance-transfer/testAPIs.sh @@ -159,13 +159,14 @@ curl -s -X POST \ echo echo -echo "POST invoke chaincode on peers of Org1 and Org2" +echo "POST invoke chaincode on peers of Org1" echo TRX_ID=$(curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes/mycc \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ + "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "fcn":"move", "args":["a","b","10"] }')