diff --git a/fabric-client/lib/Chain.js b/fabric-client/lib/Chain.js index a9159b2d67..2c5bd3861b 100755 --- a/fabric-client/lib/Chain.js +++ b/fabric-client/lib/Chain.js @@ -27,6 +27,7 @@ var ChannelConfig = require('./ChannelConfig.js'); var Peer = require('./Peer.js'); var Orderer = require('./Orderer.js'); var BlockDecoder = require('./BlockDecoder.js'); +var TransactionID = require('./TransactionID.js'); var settle = require('promise-settle'); var grpc = require('grpc'); var logger = utils.getLogger('Chain.js'); @@ -414,8 +415,7 @@ var Chain = class { * Will get the genesis block from the defined orderer that may be * used in a join request * @param {Object} request - An object containing the following fields: - *
`txId` : required - String of the transaction id - *
`nonce` : required - Integer of the once time number + *
`txId` : required - {@link TransactionID} object with the transaction id and nonce * * @returns {Promise} A Promise for a protobuf `Block` * @see /protos/peer/proposal_response.proto @@ -432,10 +432,6 @@ var Chain = class { else if(!request.txId) { errorMsg = 'Missing txId input parameter with the required transaction identifier'; } - // verify that we have the nonce - else if(!request.nonce) { - errorMsg = 'Missing nonce input parameter with the required single use number'; - } if(errorMsg) { logger.error('getGenesisBlock - error '+ errorMsg); @@ -472,11 +468,11 @@ var Chain = class { var seekInfoHeader = Chain._buildChannelHeader( _commonProto.HeaderType.DELIVER_SEEK_INFO, self._name, - request.txId, + request.txId.getTransactionID(), self._initial_epoch ); - var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, request.nonce); + var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, request.txId.getNonce()); var seekPayload = new _commonProto.Payload(); seekPayload.setHeader(seekHeader); seekPayload.setData(seekInfo.toBuffer()); @@ -503,8 +499,7 @@ var Chain = class { * this channel *
`block` : the genesis block of the channel * see getGenesisBlock() method - *
`txId` : required - String of the transaction id - *
`nonce` : required - Integer of the once time number + *
`txId` : required - {@link TransactionID} object with the transaction id and nonce * @returns {Promise} A Promise for a `ProposalResponse` * @see /protos/peer/proposal_response.proto */ @@ -528,11 +523,6 @@ var Chain = class { errorMsg = 'Missing txId input parameter with the required transaction identifier'; } - // verify that we have the nonce - else if(!request.nonce) { - errorMsg = 'Missing nonce input parameter with the required single use number'; - } - else if(!request.block) { errorMsg = 'Missing block input parameter with the required genesis block'; } @@ -552,7 +542,7 @@ var Chain = class { chaincodeInput.setArgs(args); var chaincodeID = new _ccProto.ChaincodeID(); - chaincodeID.setName('cscc'); + chaincodeID.setName(Constants.CSCC); var chaincodeSpec = new _ccProto.ChaincodeSpec(); chaincodeSpec.setType(_ccProto.ChaincodeSpec.Type.GOLANG); @@ -562,12 +552,12 @@ var Chain = class { var channelHeader = Chain._buildChannelHeader( _commonProto.HeaderType.ENDORSER_TRANSACTION, '', - request.txId, + request.txId.getTransactionID(), null, //no epoch - 'cscc' + Constants.CSCC ); - var header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.nonce); + var header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.txId.getNonce()); var proposal = Chain._buildProposal(chaincodeSpec, header); var signed_proposal = Chain._signProposal(userContext.getSigningIdentity(), proposal); @@ -599,8 +589,7 @@ var Chain = class { var orderer = self.getOrderers()[0]; userContext = this._clientContext.getUserContext(); - var nonce = utils.getNonce(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); // seek the latest block var seekSpecifiedStart = new _abProto.SeekNewest(); @@ -621,11 +610,11 @@ var Chain = class { var seekInfoHeader = Chain._buildChannelHeader( _commonProto.HeaderType.DELIVER_SEEK_INFO, self._name, - tx_id, + txId.getTransactionID(), self._initial_epoch ); - var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, nonce); + var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, txId.getNonce()); var seekPayload = new _commonProto.Payload(); seekPayload.setHeader(seekHeader); seekPayload.setData(seekInfo.toBuffer()); @@ -659,8 +648,7 @@ var Chain = class { var last_config = _commonProto.LastConfig.decode(metadata.value); logger.debug('getChannelConfig - latest block has config block of %s',last_config.index); - var nonce = utils.getNonce(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); // now build the seek info to get the block called out // as the latest config block @@ -686,11 +674,11 @@ var Chain = class { var seekInfoHeader = Chain._buildChannelHeader( _commonProto.HeaderType.DELIVER_SEEK_INFO, self._name, - tx_id, + txId.getTransactionID(), self._initial_epoch ); - var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, nonce); + var seekHeader = Chain._buildHeader(userContext.getIdentity(), seekInfoHeader, txId.getNonce()); var seekPayload = new _commonProto.Payload(); seekPayload.setHeader(seekHeader); seekPayload.setData(seekInfo.toBuffer()); @@ -829,15 +817,13 @@ var Chain = class { queryInfo() { logger.debug('queryInfo - start'); var self = this; - var nonce = utils.getNonce(); var userContext = this._clientContext.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); var request = { targets: [self.getPrimaryPeer()], - chaincodeId : 'qscc', + chaincodeId : Constants.QSCC, chainId: '', - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'GetChainInfo', args: [ self._name] }; @@ -885,15 +871,13 @@ var Chain = class { return Promise.reject( new Error('Blockhash bytes are required')); } var self = this; - var nonce = utils.getNonce(); var userContext = this._clientContext.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); var request = { targets: [self.getPrimaryPeer()], - chaincodeId : 'qscc', + chaincodeId : Constants.QSCC, chainId: '', - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'GetBlockByHash', args: [ self._name], argbytes : blockHash @@ -946,15 +930,13 @@ var Chain = class { return Promise.reject( new Error('Block number must be a postive integer')); } var self = this; - var nonce = utils.getNonce(); var userContext = self._clientContext.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); var request = { targets: [self.getPrimaryPeer()], - chaincodeId : 'qscc', + chaincodeId : Constants.QSCC, chainId: '', - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'GetBlockByNumber', args: [ self._name, block_number] }; @@ -994,29 +976,27 @@ var Chain = class { /** * Queries the ledger for Transaction by number. * This query will be made to the primary peer. - * @param {number} transactionID + * @param tx_id The id of the transaction * @returns {object} Transaction information containing the transaction. */ - queryTransaction(transactionID) { - logger.debug('queryTransaction - start transactionID %s',transactionID); + queryTransaction(tx_id) { + logger.debug('queryTransaction - start transactionID %s',tx_id); var transaction_id = null; - if(transactionID) { - transaction_id = transactionID.toString(); + if(tx_id) { + tx_id = tx_id.toString(); } else { - return Promise.reject( new Error('Transaction id is required')); + return Promise.reject( new Error('Missing "tx_id" parameter')); } var self = this; - var nonce = utils.getNonce(); var userContext = self._clientContext.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); var request = { targets: [self.getPrimaryPeer()], - chaincodeId : 'qscc', + chaincodeId : Constants.QSCC, chainId: '', - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'GetTransactionByID', - args: [ self._name, transaction_id] + args: [ self._name, tx_id] }; return self.sendTransactionProposal(request) .then( @@ -1057,15 +1037,13 @@ var Chain = class { queryInstantiatedChaincodes() { logger.debug('queryInstantiatedChaincodes - start'); var self = this; - var nonce = utils.getNonce(); var userContext = self._clientContext.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(userContext); var request = { targets: [self.getPrimaryPeer()], chaincodeId : Constants.LSCC, chainId: self._name, - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'getchaincodes', args: [] }; @@ -1118,11 +1096,10 @@ var Chain = class { * the source code of the chaincode *
`chaincodeId` : required - String of the name of the chaincode *
`chaincodeVersion` : required - String of the version of the chaincode - *
`txId` : required - String of the transaction id + *
`txId` : required - {@link TransactionID} object with the transaction id and nonce *
`transientMap` : optional - map that can be used by * the chaincode but not saved in the ledger, such as cryptographic information * for encryption - *
`nonce` : required - Integer of the once time number *
`fcn` : optional - String of the function to be called on * the chaincode once instantiated (default 'init') *
`args` : optional - String Array arguments specific to @@ -1174,11 +1151,10 @@ var Chain = class { * the source code of the chaincode *
`chaincodeId` : required - String of the name of the chaincode *
`chaincodeVersion` : required - String of the version of the chaincode - *
`txId` : required - String of the transaction id + *
`txId` : required - {@link TransactionID} object with the transaction id and nonce *
`transientMap` : optional - map that can be used by * the chaincode but not saved in the ledger, such as cryptographic information * for encryption - *
`nonce` : required - Integer of the once time number *
`fcn` : optional - String of the function to be called on * the chaincode once instantiated (default 'init') *
`args` : optional - String Array arguments specific to @@ -1269,11 +1245,11 @@ var Chain = class { var channelHeader = Chain._buildChannelHeader( _commonProto.HeaderType.ENDORSER_TRANSACTION, self._name, - request.txId, + request.txId.getTransactionID(), null, Constants.LSCC ); - header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.nonce); + header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.txId.getNonce()); proposal = Chain._buildProposal(lcccSpec, header, request.transientMap); let signed_proposal = Chain._signProposal(userContext.getSigningIdentity(), proposal); @@ -1290,11 +1266,9 @@ var Chain = class { * * @param {Object} request *
`targets` : optional -- The peers that will receive this request, - * when not provided the peers assigned to this channel will - * be used. + * when not provided the peers assigned to this channel will be used. *
`chaincodeId` : The id of the chaincode to perform the transaction proposal - *
`txId` : required - String of the transaction id - *
`nonce` : required - Integer of the once time number + *
`txId` : required - {@link TransactionID} object with the transaction id and nonce *
`transientMap` : optional - map that can be used by * the chaincode but not saved in the ledger, such as cryptographic information * for encryption @@ -1377,11 +1351,11 @@ var Chain = class { var channelHeader = Chain._buildChannelHeader( _commonProto.HeaderType.ENDORSER_TRANSACTION, channelId, - request.txId, + request.txId.getTransactionID(), null, request.chaincodeId ); - header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.nonce); + header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.txId.getNonce()); proposal = Chain._buildProposal(invokeSpec, header, request.transientMap); let signed_proposal = Chain._signProposal(userContext.getSigningIdentity(), proposal); @@ -1529,14 +1503,30 @@ var Chain = class { * @returns {Promise} A Promise for an array of byte array results from the chaincode on all Endorsing Peers */ queryByChaincode(request) { - logger.debug('Chain.sendQueryProposal - start'); + logger.debug('queryByChaincodel - start'); + if(!request) { + return Promise.reject(new Error('Missing request object for this queryByChaincode call.')); + } + var userContext = this._clientContext.getUserContext(); + var txId = new TransactionID(userContext); + // make a new request object so we can add in the txId and not change the user's + var trans_request = { + targets : request.targets, + chaincodeId : request.chaincodeId, + chaincodeVersion : request.chaincodeVersion, + chainId : request.chainId, + fcn : request.fcn, + args : request.args, + transientMap : request.transientMap, + txId : txId + }; - return this.sendTransactionProposal(request) + return this.sendTransactionProposal(trans_request) .then( function(results) { var responses = results[0]; var proposal = results[1]; - logger.debug('Chain-queryByChaincode - results received'); + logger.debug('queryByChaincode - results received'); if(responses && Array.isArray(responses)) { var results = []; for(let i = 0; i < responses.length; i++) { @@ -1686,8 +1676,12 @@ var Chain = class { cc_payload.setInput(cciSpec.toBuffer()); if (typeof transientMap === 'object') { + logger.debug('_buildProposal - adding in transientMap %j',transientMap); cc_payload.setTransientMap(transientMap); } + else { + logger.debug('_buildProposal - not adding a transientMap'); + } // proposal -- will switch to building the proposal once the signProposal is used let proposal = new _proposalProto.Proposal(); @@ -1773,17 +1767,14 @@ var Chain = class { /* * @private */ - static _checkProposalRequest(request) { + static _checkProposalRequest(request, skip) { var errorMsg = null; if(request) { - var isQuery = (request.chaincodeId == 'qscc' || request.chaincodeId == 'cscc'); if(!request.chaincodeId) { errorMsg = 'Missing "chaincodeId" parameter in the proposal request'; - } else if(!request.txId) { + } else if(!request.txId && !skip) { errorMsg = 'Missing "txId" parameter in the proposal request'; - } else if(!request.nonce) { - errorMsg = 'Missing "nonce" parameter in the proposal request'; } } else { errorMsg = 'Missing input request object on the proposal request'; @@ -1807,25 +1798,6 @@ var Chain = class { return errorMsg; } - /** - * Utility method to build an unique transaction id - * based on a nonce and this chain's user. - * @param {int} nonce - a one time use number - * @param {User} userContext - the user context - * @returns {string} An unique string - */ - static buildTransactionID(nonce, userContext) { - logger.debug('buildTransactionID - start'); - var creator_bytes = userContext.getIdentity().serialize();//same as signatureHeader.Creator - var nonce_bytes = nonce;//nonce is already in bytes - var trans_bytes = Buffer.concat([nonce_bytes, creator_bytes]); - var trans_hash = hashPrimitives.sha2_256(trans_bytes); - var transaction_id = Buffer.from(trans_hash).toString(); - logger.debug('buildTransactionID - transaction_id %s',transaction_id); - return transaction_id; - } - - //utility method to build a common chain header static _buildChannelHeader(type, chain_id, tx_id, epoch, chaincode_id, time_stamp) { logger.debug('buildChannelHeader - type %s chain_id %s tx_id %d epoch % chaincode_id %s', diff --git a/fabric-client/lib/Client.js b/fabric-client/lib/Client.js index 5396010aab..436eba929d 100644 --- a/fabric-client/lib/Client.js +++ b/fabric-client/lib/Client.js @@ -26,6 +26,7 @@ var ChannelConfig = require('./ChannelConfig.js'); var Packager = require('./Packager.js'); var Peer = require('./Peer.js'); var Orderer = require('./Orderer.js'); +var TransactionID = require('./TransactionID.js'); var MSP = require('./msp/msp.js'); var logger = sdkUtils.getLogger('Client.js'); @@ -228,7 +229,7 @@ var Client = class { } /** - * Build a new MSP with the definition. + * Create a new MSP with the definition. * @parm {Object} which has the following the following fields: *
`id`: {string} value for the identifier of this instance *
`rootCerts`: array of {@link Identity} representing trust anchors for validating @@ -252,6 +253,23 @@ var Client = class { return msp; } + /** + * Create a new transaction id object with an unique transaction id + * based on included nonce and the user context. + * Requires this client instance to have an assigned user context. + * @returns {@link TransactionID} An object that contains a transaction id + * based on the user context and also contains + * the generated nonce value. + */ + newTransactionID() { + if (typeof this._userContext === 'undefined' || this._userContext === null) { + throw new Error('This client instance must be assigned an user context'); + } + let trans_id = new TransactionID(this._userContext); + + return trans_id; + } + /* * For test only * @@ -455,9 +473,7 @@ var Client = class { if(!request.txId && !have_envelope) { errorMsg = 'Missing txId request parameter'; } - if(!request.nonce && !have_envelope) { - errorMsg = 'Missing nonce request parameter'; - } + // verify that we have an orderer configured if(!request.orderer) { errorMsg = 'Missing orderer request parameter'; @@ -498,10 +514,10 @@ var Client = class { var proto_channel_header = Chain._buildChannelHeader( _commonProto.HeaderType.CONFIG_UPDATE, request.name, - request.txId + request.txId.getTransactionID() ); - var proto_header = Chain._buildHeader(userContext.getIdentity(), proto_channel_header, request.nonce); + var proto_header = Chain._buildHeader(userContext.getIdentity(), proto_channel_header, request.txId.getNonce()); var proto_payload = new _commonProto.Payload(); proto_payload.setHeader(proto_header); proto_payload.setData(proto_config_Update_envelope.toBuffer()); @@ -567,14 +583,11 @@ var Client = class { return Promise.reject( new Error('Peer is required')); } var self = this; - var nonce = sdkUtils.getNonce(); - var userContext = this.getUserContext(); - var txId = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(this._userContext); var request = { targets: [peer], - chaincodeId : 'cscc', + chaincodeId : Constants.CSCC, txId: txId, - nonce: nonce, fcn : 'GetChannels', args: [] }; @@ -627,14 +640,11 @@ var Client = class { return Promise.reject( new Error('Peer is required')); } var self = this; - var nonce = sdkUtils.getNonce(); - var userContext = self.getUserContext(); - var tx_id = Chain.buildTransactionID(nonce, userContext); + var txId = new TransactionID(this._userContext); var request = { targets: [peer], chaincodeId : Constants.LSCC, - txId: tx_id, - nonce: nonce, + txId: txId, fcn : 'getinstalledchaincodes', args: [] }; @@ -678,21 +688,19 @@ var Client = class { * Sends an install proposal to one or more endorsing peers. * * @param {Object} request - An object containing the following fields: - *
`chaincodePath` : required - String of the path to location of - * the source code of the chaincode - *
`chaincodeId` : required - String of the name of the chaincode - *
`chaincodeVersion` : required - String of the version of the chaincode - *
`chaincodePackage` : optional - Byte array of the archive content for - * the chaincode source. The archive must have a 'src' - * folder containing subfolders corresponding to the - * 'chaincodePath' field. For instance, if the chaincodePath - * is 'mycompany/myproject', then the archive must contain a - * folder at the path 'src/mycompany/myproject', where the - * GO source code resides. - *
`chaincodeType` : optional - Type of chaincode ['golang', 'car', 'java'] - * (default 'golang') - *
`txId` : required - String of the transaction id - *
`nonce` : required - Integer of the once time number + *
`chaincodePath` : required - String of the path to location of + * the source code of the chaincode + *
`chaincodeId` : required - String of the name of the chaincode + *
`chaincodeVersion` : required - String of the version of the chaincode + *
`chaincodePackage` : optional - Byte array of the archive content for + * the chaincode source. The archive must have a 'src' + * folder containing subfolders corresponding to the + * 'chaincodePath' field. For instance, if the chaincodePath + * is 'mycompany/myproject', then the archive must contain a + * folder at the path 'src/mycompany/myproject', where the + * GO source code resides. + *
`chaincodeType` : optional - Type of chaincode ['golang', 'car', 'java'] + * (default 'golang') * @returns {Promise} A Promise for a `ProposalResponse` * @see /protos/peer/proposal_response.proto */ @@ -716,8 +724,7 @@ var Client = class { errorMsg = 'Missing input request object on install chaincode request'; } - - if (!errorMsg) errorMsg = Chain._checkProposalRequest(request); + if (!errorMsg) errorMsg = Chain._checkProposalRequest(request, true); if (!errorMsg) errorMsg = Chain._checkInstallRequest(request); if (errorMsg) { @@ -764,15 +771,15 @@ var Client = class { var header, proposal; var userContext = self.getUserContext(); - var txId = Chain.buildTransactionID(request.nonce, userContext); + var txId = new TransactionID(userContext); var channelHeader = Chain._buildChannelHeader( _commonProto.HeaderType.ENDORSER_TRANSACTION, '', //install does not target a channel - txId, + txId.getTransactionID(), null, Constants.LSCC ); - header = Chain._buildHeader(userContext.getIdentity(), channelHeader, request.nonce); + header = Chain._buildHeader(userContext.getIdentity(), channelHeader, txId.getNonce()); proposal = Chain._buildProposal(lcccSpec, header); let signed_proposal = Chain._signProposal(userContext.getSigningIdentity(), proposal); @@ -856,7 +863,7 @@ var Client = class { } /** - * Sets an instance of the User class as the security context of self client instance. This user’s + * Sets an instance of the User class as the security context of this client instance. This user’s * credentials (ECert), or special transaction certificates that are derived from the user's ECert, * will be used to conduct transactions and queries with the blockchain network. * Upon setting the user context, the SDK saves the object in a persistence cache if the “state store” @@ -1024,17 +1031,6 @@ var Client = class { return this._stateStore; } - /** - * Utility method to build an unique transaction id - * based on a nonce and the user context. - * @param {int} nonce - a one time use number - * @param {User} userContext - the user context - * @returns {string} An unique string - */ - static buildTransactionID(nonce, userContext) { - return Chain.buildTransactionID(nonce, userContext); - } - /** * Returns an authorized user loaded using the * private key and pre-enrolled certificate from files diff --git a/fabric-client/lib/Constants.js b/fabric-client/lib/Constants.js index 1c27e30e70..5329a769ba 100755 --- a/fabric-client/lib/Constants.js +++ b/fabric-client/lib/Constants.js @@ -17,4 +17,6 @@ 'use strict'; module.exports.LSCC = 'lscc'; +module.exports.QSCC = 'qscc'; +module.exports.CSCC = 'cscc'; module.exports.SYSTEM_CHANNEL_NAME = 'testchainid'; \ No newline at end of file diff --git a/fabric-client/lib/TransactionID.js b/fabric-client/lib/TransactionID.js new file mode 100644 index 0000000000..2302cfb944 --- /dev/null +++ b/fabric-client/lib/TransactionID.js @@ -0,0 +1,72 @@ +/* + 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. +*/ + +'use strict'; + +var sdkUtils = require('./utils.js'); +var logger = sdkUtils.getLogger('TransactionID.js'); +var User = require('./User.js'); +var hashPrimitives = require('./hash.js'); + + +/** + * The class representing the transaction identifier. Provides for + * automatically creating the `nonce` value when an instance of this + * object is created. + * + * @class + */ +var TransactionID = class { + + /** + * Builds a new tranaction Id based on a user's certificate and an automatically + * generated nonce value. + * @param {Client} clientContext An instance of {@link Client} that provides an unique + * base for this transaction id. + */ + constructor(userContext) { + logger.debug('const - start'); + if (typeof userContext === 'undefined' || userContext === null) { + throw new Error('Missing userContext parameter'); + } + if(!(userContext instanceof User)) { + throw new Error('Parameter "userContext" must be an instance of the "User" class'); + } + this._nonce = sdkUtils.getNonce(); //nonce is in bytes + let creator_bytes = userContext.getIdentity().serialize();//same as signatureHeader.Creator + let trans_bytes = Buffer.concat([this._nonce, creator_bytes]); + let trans_hash = hashPrimitives.sha2_256(trans_bytes); + this._transaction_id = Buffer.from(trans_hash).toString(); + logger.debug('const - transaction_id %s',this._transaction_id); + } + + /** + * The transaction ID + */ + getTransactionID() { + return this._transaction_id; + } + + /** + * The nonce value + */ + getNonce() { + return this._nonce; + } +}; + +module.exports = TransactionID; + diff --git a/test/integration/create-configtx-channel.js b/test/integration/create-configtx-channel.js index d6fc446229..a06c62f0e0 100644 --- a/test/integration/create-configtx-channel.js +++ b/test/integration/create-configtx-channel.js @@ -131,15 +131,13 @@ test('\n\n***** Configtx Built config create flow *****\n\n', function(t) { logger.debug('\n***\n done signing \n***\n'); // build up the create request - let nonce = utils.getNonce(); - let tx_id = Client.buildTransactionID(nonce, the_user); + let tx_id = client.newTransactionID(); var request = { config: config, signatures : signatures, name : channel_name, orderer : orderer, - txId : tx_id, - nonce : nonce + txId : tx_id }; // send to create request to orderer diff --git a/test/integration/e2e/create-channel.js b/test/integration/e2e/create-channel.js index ab1a31254f..fb87759e1d 100644 --- a/test/integration/e2e/create-channel.js +++ b/test/integration/e2e/create-channel.js @@ -333,18 +333,16 @@ test('\n\n***** SDK Built config update create flow *****\n\n', function(t) { logger.debug('\n***\n done signing \n***\n'); // build up the create request - let nonce = utils.getNonce(); - let tx_id = Client.buildTransactionID(nonce, the_user); + let tx_id = client.newTransactionID(); var request = { config: config, signatures : signatures, name : channel_name, orderer : orderer, - txId : tx_id, - nonce : nonce + txId : tx_id }; - // send to create request to orderer + // send create request to orderer return client.createChannel(request); }) .then((result) => { diff --git a/test/integration/e2e/e2eUtils.js b/test/integration/e2e/e2eUtils.js index b4c901316f..51eaf3d146 100644 --- a/test/integration/e2e/e2eUtils.js +++ b/test/integration/e2e/e2eUtils.js @@ -28,25 +28,24 @@ var path = require('path'); var fs = require('fs'); var util = require('util'); -var hfc = require('fabric-client'); +var Client = require('fabric-client'); var EventHub = require('fabric-client/lib/EventHub.js'); var testUtil = require('../../unit/util.js'); var e2e = testUtil.END2END; -hfc.addConfigFile(path.join(__dirname, './config.json')); -var ORGS = hfc.getConfigSetting('test-network'); +Client.addConfigFile(path.join(__dirname, './config.json')); +var ORGS = Client.getConfigSetting('test-network'); var grpc = require('grpc'); var tx_id = null; -var nonce = null; var the_user = null; function installChaincode(org, chaincode_path, version, t) { - hfc.setConfigSetting('request-timeout', 60000); - var channel_name = hfc.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); + Client.setConfigSetting('request-timeout', 60000); + var channel_name = Client.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); - var client = new hfc(); + var client = new Client(); var chain = client.newChain(channel_name); var orgName = ORGS[org].name; @@ -87,7 +86,7 @@ function installChaincode(org, chaincode_path, version, t) { } } - return hfc.newDefaultKeyValueStore({ + return Client.newDefaultKeyValueStore({ path: testUtil.storePathForOrg(orgName) }).then((store) => { client.setStateStore(store); @@ -98,17 +97,12 @@ function installChaincode(org, chaincode_path, version, t) { t.pass('Successfully enrolled user \'admin\''); the_user = admin; - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); - // send proposal to endorser var request = { targets: targets, chaincodePath: chaincode_path, chaincodeId: e2e.chaincodeId, - chaincodeVersion: version, - txId: tx_id, - nonce: nonce + chaincodeVersion: version }; return client.installChaincode(request); @@ -150,8 +144,8 @@ module.exports.installChaincode = installChaincode; function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ - hfc.setConfigSetting('request-timeout', 60000); - var channel_name = hfc.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); + Client.setConfigSetting('request-timeout', 60000); + var channel_name = Client.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); var targets = [], eventhubs = []; @@ -172,7 +166,7 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ }; })(t, eventhubs, t.end); - var client = new hfc(); + var client = new Client(); var chain = client.newChain(channel_name); var orgName = ORGS[userOrg].name; @@ -198,7 +192,7 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ var badTransientMap = { 'test1': 'transientValue' }; // have a different key than what the chaincode example_cc1.go expects in Init() var transientMap = { 'test': 'transientValue' }; - return hfc.newDefaultKeyValueStore({ + return Client.newDefaultKeyValueStore({ path: testUtil.storePathForOrg(orgName) }).then((store) => { @@ -256,9 +250,8 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ // the v1 chaincode has Init() method that expects a transient map if (upgrade) { // first test that a bad transient map would get the chaincode to return an error - let request = buildChaincodeProposal(the_user, chaincode_path, version, upgrade, badTransientMap); - tx_id = request.tx_id; - request = request.request; + let request = buildChaincodeProposal(client, the_user, chaincode_path, version, upgrade, badTransientMap); + tx_id = request.txId; return chain.sendUpgradeProposal(request) .then((results) => { @@ -280,9 +273,8 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ if (success) { // successfully tested the negative conditions caused by // the bad transient map, now send the good transient map - request = buildChaincodeProposal(the_user, chaincode_path, version, upgrade, transientMap); - tx_id = request.tx_id; - request = request.request; + request = buildChaincodeProposal(client, the_user, chaincode_path, version, upgrade, transientMap); + tx_id = request.txId; return chain.sendUpgradeProposal(request); } else { @@ -290,9 +282,8 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ } }); } else { - let request = buildChaincodeProposal(the_user, chaincode_path, version, upgrade, transientMap); - tx_id = request.tx_id; - request = request.request; + let request = buildChaincodeProposal(client, the_user, chaincode_path, version, upgrade, transientMap); + tx_id = request.txId; return chain.sendInstantiateProposal(request); } @@ -331,7 +322,7 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ // set the transaction listener and set a timeout of 30sec // if the transaction did not get committed within the timeout period, // fail the test - var deployId = tx_id.toString(); + var deployId = tx_id.getTransactionID(); var eventPromises = []; eventhubs.forEach((eh) => { @@ -352,7 +343,7 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ } }); }); - logger.info('register eventhub %s with tx=%s',eh.ep._endpoint.addr,tx_id); + logger.info('register eventhub %s with tx=%s',eh.ep._endpoint.addr,deployId); eventPromises.push(txPromise); }); @@ -395,9 +386,8 @@ function instantiateChaincode(userOrg, chaincode_path, version, upgrade, t){ }); }; -function buildChaincodeProposal(the_user, chaincode_path, version, upgrade, transientMap) { - let nonce = utils.getNonce(); - let tx_id = hfc.buildTransactionID(nonce, the_user); +function buildChaincodeProposal(client, the_user, chaincode_path, version, upgrade, transientMap) { + var tx_id = client.newTransactionID(the_user); // send proposal to endorser var request = { @@ -407,7 +397,6 @@ function buildChaincodeProposal(the_user, chaincode_path, version, upgrade, tran fcn: 'init', args: ['a', '100', 'b', '200'], txId: tx_id, - nonce: nonce, // use this to demonstrate the following policy: // 'if signed by org1 admin, then that's the only signature required, // but if that signature is missing, then the policy can also be fulfilled @@ -432,15 +421,15 @@ function buildChaincodeProposal(the_user, chaincode_path, version, upgrade, tran request.transientMap = transientMap; } - return { request: request, tx_id: tx_id }; + return request; } module.exports.instantiateChaincode = instantiateChaincode; function invokeChaincode(userOrg, version, t){ - hfc.setConfigSetting('request-timeout', 60000); - var channel_name = hfc.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); + Client.setConfigSetting('request-timeout', 60000); + var channel_name = Client.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); var targets = [], eventhubs = []; @@ -465,7 +454,7 @@ function invokeChaincode(userOrg, version, t){ // submit the request. intentionally we are using a different org // than the one that instantiated the chaincode, although either org // should work properly - var client = new hfc(); + var client = new Client(); var chain = client.newChain(channel_name); var orgName = ORGS[userOrg].name; @@ -487,7 +476,9 @@ function invokeChaincode(userOrg, version, t){ ) ); - return hfc.newDefaultKeyValueStore({ + var orgName = ORGS[userOrg].name; + + return Client.newDefaultKeyValueStore({ path: testUtil.storePathForOrg(orgName) }).then((store) => { @@ -531,11 +522,10 @@ function invokeChaincode(userOrg, version, t){ return chain.initialize(); }).then((nothing) => { - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); - utils.setConfigSetting('E2E_TX_ID', tx_id); - logger.info('setConfigSetting("E2E_TX_ID") = %s', tx_id); - t.comment(util.format('Sending transaction "%s"', tx_id)); + tx_id = client.newTransactionID(the_user); + utils.setConfigSetting('E2E_TX_ID', tx_id.getTransactionID()); + logger.info('setConfigSetting("E2E_TX_ID") = %s', tx_id.getTransactionID()); + t.comment(util.format('Sending transaction "%s"', tx_id.getTransactionID())); // send proposal to endorser var request = { @@ -544,7 +534,6 @@ function invokeChaincode(userOrg, version, t){ fcn: 'invoke', args: ['move', 'a', 'b','100'], txId: tx_id, - nonce: nonce }; return chain.sendTransactionProposal(request); @@ -611,7 +600,7 @@ function invokeChaincode(userOrg, version, t){ // set the transaction listener and set a timeout of 30sec // if the transaction did not get committed within the timeout period, // fail the test - var deployId = tx_id.toString(); + var deployId = tx_id.getTransactionID(); var eventPromises = []; eventhubs.forEach((eh) => { @@ -671,7 +660,7 @@ function invokeChaincode(userOrg, version, t){ t.pass('Successfully sent transaction to the orderer.'); t.comment('******************************************************************'); t.comment('To manually run /test/integration/query.js, set the following environment variables:'); - t.comment('export E2E_TX_ID='+'\''+tx_id+'\''); + t.comment('export E2E_TX_ID='+'\''+tx_id.getTransactionID()+'\''); t.comment('******************************************************************'); return true; } else { @@ -689,14 +678,14 @@ function invokeChaincode(userOrg, version, t){ module.exports.invokeChaincode = invokeChaincode; function queryChaincode(org, version, value, t, transientMap) { - hfc.setConfigSetting('request-timeout', 60000); - var channel_name = hfc.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); + Client.setConfigSetting('request-timeout', 60000); + var channel_name = Client.getConfigSetting('E2E_CONFIGTX_CHANNEL_NAME', testUtil.END2END.channel); // this is a transaction, will just use org's identity to // submit the request. intentionally we are using a different org // than the one that submitted the "move" transaction, although either org // should work properly - var client = new hfc(); + var client = new Client(); var chain = client.newChain(channel_name); var orgName = ORGS[org].name; @@ -720,7 +709,7 @@ function queryChaincode(org, version, value, t, transientMap) { } } - return hfc.newDefaultKeyValueStore({ + return Client.newDefaultKeyValueStore({ path: testUtil.storePathForOrg(orgName) }).then((store) => { @@ -730,15 +719,11 @@ function queryChaincode(org, version, value, t, transientMap) { }).then((admin) => { the_user = admin; - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); - // send query var request = { chaincodeId : e2e.chaincodeId, chaincodeVersion : version, txId: tx_id, - nonce: nonce, fcn: 'invoke', args: ['query','b'] }; diff --git a/test/integration/e2e/join-channel.js b/test/integration/e2e/join-channel.js index 0a3f5e6eb4..3c4c9a8d04 100644 --- a/test/integration/e2e/join-channel.js +++ b/test/integration/e2e/join-channel.js @@ -33,7 +33,6 @@ var testUtil = require('../../unit/util.js'); var the_user = null; var tx_id = null; -var nonce = null; Client.addConfigFile(path.join(__dirname, './config.json')); var ORGS = Client.getConfigSetting('test-network'); @@ -118,11 +117,9 @@ function joinChannel(org, t) { return testUtil.getOrderAdminSubmitter(client, t); }).then((admin) => { t.pass('Successfully enrolled orderer \'admin\''); - nonce = utils.getNonce(); - tx_id = Client.buildTransactionID(nonce, admin); + tx_id = client.newTransactionID(); let request = { - txId : tx_id, - nonce : nonce + txId : tx_id }; return chain.getGenesisBlock(request); @@ -194,13 +191,11 @@ function joinChannel(org, t) { eventPromises.push(txPromise); }); - nonce = utils.getNonce(); - tx_id = Client.buildTransactionID(nonce, the_user); + tx_id = client.newTransactionID(); let request = { targets : targets, block : genesis_block, - txId : tx_id, - nonce : nonce + txId : tx_id }; let sendPromise = chain.joinChannel(request); return Promise.all([sendPromise].concat(eventPromises)); diff --git a/test/integration/e2e/update-channel.js b/test/integration/e2e/update-channel.js index 82ac523fed..9d47c40b99 100644 --- a/test/integration/e2e/update-channel.js +++ b/test/integration/e2e/update-channel.js @@ -183,15 +183,13 @@ test('\n\n***** U P D A T E C H A N N E L flow: update channel *****\n\n', (t) = signatures.push(signature); // build up the update request - let nonce = utils.getNonce(); - let tx_id = Client.buildTransactionID(nonce, the_user); + let tx_id = client.newTransactionID(); var request = { config : config_update, signatures : signatures, name : channel_name, orderer : orderer, - txId : tx_id, - nonce : nonce + txId : tx_id }; // send to update request to orderer diff --git a/test/integration/e2e/upgrade.js b/test/integration/e2e/upgrade.js index 75df1fcc5e..e453832cda 100644 --- a/test/integration/e2e/upgrade.js +++ b/test/integration/e2e/upgrade.js @@ -110,7 +110,6 @@ test('\n\n***** TransientMap Support in Proposals *****', (t) => { var transient = { 'test': Buffer.from('dummyValue') // string <-> byte[] }; - e2eUtils.queryChaincode('org2', 'v1', '410', t, transient) .then((result) => { if(result){ diff --git a/test/integration/events.js b/test/integration/events.js index 98fd812973..473ae71a08 100644 --- a/test/integration/events.js +++ b/test/integration/events.js @@ -75,7 +75,6 @@ for (let key in ORGS[org]) { var chaincode_id = testUtil.getUniqueVersion('events_unit_test'); var chaincode_version = testUtil.getUniqueVersion(); var request = null; -var nonce = null; var the_user = null; var steps = []; @@ -175,7 +174,7 @@ test('Test chaincode instantiate with event, transaction invocation with chainco t.end(); }).then((results) => { var tmo = 50000; - return Promise.all([eputil.registerTxEvent(eh, request.txId.toString(), tmo), + return Promise.all([eputil.registerTxEvent(eh, request.txId.getTransactionID().toString(), tmo), eputil.sendTransaction(chain, results)]); }, (err) => { @@ -228,8 +227,8 @@ test('Test chaincode instantiate with event, transaction invocation with chainco }).then(([results1, results2]) => { t.comment('sendTransactionProposal received [results1, results2]'); var tmo = 20000; - return Promise.all([eputil.registerTxEvent(eh, req1.txId.toString(), tmo), - eputil.registerTxEvent(eh, req2.txId.toString(), tmo), + return Promise.all([eputil.registerTxEvent(eh, req1.txId.getTransactionID().toString(), tmo), + eputil.registerTxEvent(eh, req2.txId.getTransactionID().toString(), tmo), eputil.sendTransaction(chain, results1), eputil.sendTransaction(chain, results2) ]); diff --git a/test/integration/eventutil.js b/test/integration/eventutil.js index 0db093bfaf..1fea7d0b4d 100644 --- a/test/integration/eventutil.js +++ b/test/integration/eventutil.js @@ -57,16 +57,14 @@ module.exports.registerCCEvent = function(eh, ccid, enregex, timeout) { }; module.exports.createRequest = function(client, chain, user, chaincode_id, targets, fcn, args) { - var nonce = utils.getNonce(); - var tx_id = hfc.buildTransactionID(nonce, user); + var tx_id = client.newTransactionID(); var request = { targets : targets, chaincodeId: chaincode_id, chaincodeVersion: '', fcn: fcn, args: args, - txId: tx_id.toString(), - nonce: nonce + txId: tx_id }; return request; }; diff --git a/test/integration/get-config.js b/test/integration/get-config.js index 43bfb423e5..1f3a0a074d 100644 --- a/test/integration/get-config.js +++ b/test/integration/get-config.js @@ -86,8 +86,6 @@ for (let key in ORGS[org]) { } var the_user = null; -var tx_id = null; -var nonce = null; var querys = []; if (process.argv.length > 2) { diff --git a/test/integration/grpc.js b/test/integration/grpc.js index e1b08515c0..0cc914aaac 100644 --- a/test/integration/grpc.js +++ b/test/integration/grpc.js @@ -116,7 +116,7 @@ test('\n\n*** GRPC communication tests ***\n\n', (t) => { } ); - return chain.sendTransactionProposal(buildEchoRequest(admin, peer)); + return chain.sendTransactionProposal(buildEchoRequest(client, peer)); }, (err) => { @@ -146,7 +146,7 @@ test('\n\n*** GRPC communication tests ***\n\n', (t) => { } ); - return chain.sendTransactionProposal(buildEchoRequest(submitter, peer)); + return chain.sendTransactionProposal(buildEchoRequest(client, peer)); }).then((response) => { if (response[0] && response[0][0] && response[0][0].response && response[0][0].response.status === 200) t.pass('Successfully tested grpc receive message limit'); @@ -160,9 +160,9 @@ test('\n\n*** GRPC communication tests ***\n\n', (t) => { }); }); -function buildEchoRequest(submitter, peer) { +function buildEchoRequest(client, peer) { let nonce = utils.getNonce(); - let tx_id = hfc.buildTransactionID(nonce, submitter); + let tx_id = client.newTransactionID(); return { targets: [peer], diff --git a/test/integration/install.js b/test/integration/install.js index 7b7addfcae..dd0ef1d7fa 100644 --- a/test/integration/install.js +++ b/test/integration/install.js @@ -41,7 +41,6 @@ hfc.addConfigFile(path.join(__dirname, 'e2e', 'config.json')); var ORGS = hfc.getConfigSetting('test-network'); var tx_id = null; -var nonce = null; var the_user = null; testUtil.setupChaincodeDeploy(); @@ -214,18 +213,13 @@ function installChaincode(params, t) { t.pass(params.testDesc+' - Successfully enrolled user \'admin\''); the_user = admin; - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); - // send proposal to endorser var request = { targets: targets, chaincodePath: params.chaincodePath, chaincodeId: params.chaincodeId, chaincodeVersion: params.chaincodeVersion, - chaincodePackage: params.chaincodePackage, - txId: tx_id, - nonce: nonce + chaincodePackage: params.chaincodePackage }; return client.installChaincode(request); diff --git a/test/integration/marbles.js b/test/integration/marbles.js index 3bcae5552a..38d246d31c 100644 --- a/test/integration/marbles.js +++ b/test/integration/marbles.js @@ -34,13 +34,12 @@ var http = require('http'); var hfc = require('fabric-client'); var util = require('util'); var testUtil = require('./util.js'); - +var client = new hfc(); var chain = hfc.newChain('testChain-e2e'); var webUser; var chaincode_id = 'marblescc'; var chain_id = '**TEST_CHAINID**'; var tx_id = null; -var nonce = null; var steps = []; if (process.argv.length > 2) { @@ -59,7 +58,7 @@ chain.setKeyValueStore(hfc.newKeyValueStore({ chain.setOrderer('grpc://localhost:7050'); test('End-to-end flow of chaincode instantiate, transaction invocation, and query', function(t) { - var promise = testUtil.getSubmitter(chain, t); + var promise = testUtil.getSubmitter(client, t); if (steps.length === 0 || steps.indexOf('step1') >= 0) { logger.info('Executing step1'); @@ -68,8 +67,7 @@ test('End-to-end flow of chaincode instantiate, transaction invocation, and quer function(admin) { t.pass('Successfully enrolled user \'admin\''); webUser = admin; - tx_id = hfc.buildTransactionID({length:12}); - nonce = hfc.getNonce(); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { @@ -78,8 +76,7 @@ test('End-to-end flow of chaincode instantiate, transaction invocation, and quer chaincodeId: chaincode_id, fcn: 'init', args: ['1'], - txId: tx_id, - nonce: nonce + txId: tx_id }; return admin.sendInstantiateProposal(request); @@ -156,16 +153,14 @@ test('End-to-end flow of chaincode instantiate, transaction invocation, and quer } ).then( function() { - tx_id = hfc.buildTransactionID({length:12}); - nonce = hfc.getNonce(); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { targets: [hfc.getPeer('grpc://localhost:7051'), hfc.getPeer('grpc://localhost:7056')], chaincodeId : chaincode_id, fcn: 'init_marble', args: ['marble1','blue','35','tom'], - txId: tx_id, - nonce: nonce + txId: tx_id }; return webUser.sendTransactionProposal(request); }, @@ -248,8 +243,7 @@ test('End-to-end flow of chaincode instantiate, transaction invocation, and quer } ).then( function() { - tx_id = hfc.buildTransactionID({length:12}); - nonce = hfc.getNonce(); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { targets: [hfc.getPeer('grpc://localhost:7051'), hfc.getPeer('grpc://localhost:7056')], @@ -257,8 +251,7 @@ test('End-to-end flow of chaincode instantiate, transaction invocation, and quer fcn: 'set_owner', args: ['marble1','jerry'], chainId: chain_id, - txId: tx_id, - nonce: nonce + txId: tx_id }; return webUser.sendTransactionProposal(request); }, diff --git a/test/integration/new-chain.js b/test/integration/new-chain.js index e42e191835..5ddf8af707 100644 --- a/test/integration/new-chain.js +++ b/test/integration/new-chain.js @@ -74,8 +74,6 @@ hfc.setConfigSetting('hfc-logging', '{"debug":"console"}'); var keyValStorePath = testUtil.KVS; var the_user = null; -var tx_id = null; -var nonce = null; // //Orderer via member send chain create diff --git a/test/integration/query.js b/test/integration/query.js index 40e3c9c3ea..971e95b81b 100644 --- a/test/integration/query.js +++ b/test/integration/query.js @@ -53,8 +53,6 @@ var e2e = testUtil.END2END; var the_user = null; var tx_id = null; -var nonce = null; - var querys = []; if (process.argv.length > 2) { for (let i=2; i { let caroots = Buffer.from(data).toString(); var tx_id = null; - var nonce = null; var the_user = null; var allEventhubs = []; @@ -99,19 +98,16 @@ test('\n\n **** E R R O R T E S T I N G on upgrade call', (t) => { }) .then((nothing) => { t.pass('Successfully initialized channel'); - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { chaincodePath: testUtil.CHAINCODE_UPGRADE_PATH, chaincodeId : e2e.chaincodeId, chaincodeVersion : version, - chainId: e2e.channel, fcn: 'init', args: ['a', '500', 'b', '600'], - txId: tx_id, - nonce: nonce + txId: tx_id }; return chain.sendUpgradeProposal(request); @@ -125,8 +121,7 @@ test('\n\n **** E R R O R T E S T I N G on upgrade call', (t) => { t.fail('This should not have thrown an Error ::'+ err); return Promise.resolve(true); }).then((nothing) => { - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { @@ -135,9 +130,7 @@ test('\n\n **** E R R O R T E S T I N G on upgrade call', (t) => { chaincodeVersion: version, fcn: 'init', args: ['a', '500', 'b', '600'], - chainId: e2e.channel, - txId: tx_id, - nonce: nonce + txId: tx_id }; return chain.sendUpgradeProposal(request); @@ -148,8 +141,7 @@ test('\n\n **** E R R O R T E S T I N G on upgrade call', (t) => { return Promise.resolve(true); }).then((nothing) => { - nonce = utils.getNonce(); - tx_id = hfc.buildTransactionID(nonce, the_user); + tx_id = client.newTransactionID(); // send proposal to endorser var request = { @@ -158,8 +150,7 @@ test('\n\n **** E R R O R T E S T I N G on upgrade call', (t) => { chaincodeVersion: 'v333333333', fcn: 'init', args: ['a', '500', 'b', '600'], - txId: tx_id, - nonce: nonce + txId: tx_id }; return chain.sendUpgradeProposal(request); diff --git a/test/unit/chain.js b/test/unit/chain.js index d44a74b8f7..9b55e1506c 100644 --- a/test/unit/chain.js +++ b/test/unit/chain.js @@ -34,6 +34,7 @@ var Peer = require('fabric-client/lib/Peer.js'); var Chain = require('fabric-client/lib/Chain.js'); var Packager = require('fabric-client/lib/Packager.js'); var Orderer = require('fabric-client/lib/Orderer.js'); +var User = require('fabric-client/lib/User.js'); var MSP = require('fabric-client/lib/msp/msp.js'); var MSPManager = require('fabric-client/lib/msp/msp-manager.js'); var idModule = require('fabric-client/lib/msp/identity.js'); @@ -317,30 +318,7 @@ test('\n\n ** Chain joinChannel() tests **\n\n', function (t) { } }); - var p5 = c.joinChannel({targets: 'targets' , txId : 'txId' } - ).then(function () { - t.fail('Should not have been able to resolve the promise because of nonce request parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing nonce') >= 0) { - t.pass('Successfully caught missing nonce request error'); - } else { - t.fail('Failed to catch the missing nonce request error. Error: '); - logger.error(err.stack ? err.stack : err); - } - }); - - var p5a = c.getGenesisBlock({targets: 'targets' , txId : 'txId' } - ).then(function () { - t.fail('Should not have been able to resolve the promise because of nonce request parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing nonce') >= 0) { - t.pass('Successfully caught missing nonce request error'); - } else { - t.fail('Failed to catch the missing nonce request error. Error: '); - logger.error(err.stack ? err.stack : err); - } - }); - Promise.all([p1, p2, p3, p4, p4a, p5, p5a]) + Promise.all([p1, p2, p3, p4, p4a]) .then( function (data) { t.end(); @@ -652,8 +630,7 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { chaincodeId: 'blah', fcn: 'init', args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodeVersion" parameter'); }).catch(function (err) { @@ -671,8 +648,7 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { chaincodeVersion: 'blah', fcn: 'init', args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodeId" parameter'); }).catch(function (err) { @@ -690,8 +666,7 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { chaincodeVersion: 'blah', fcn: 'init', args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "peer" objects on chain'); }).catch(function (err) { @@ -710,8 +685,7 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { chaincodeId: 'blah', chaincodeVersion: 'blah', fcn: 'init', - args: ['a', '100', 'b', '200'], - nonce: 'blah' + args: ['a', '100', 'b', '200'] }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "txId" parameter'); }).catch(function (err) { @@ -722,24 +696,6 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { } }); - var p6 = c.sendInstantiateProposal({ - targets: [new Peer('grpc://localhost:7051')], - chaincodePath: 'blah', - chaincodeId: 'blah', - chaincodeVersion: 'blah', - fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "nonce" parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing "nonce" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing nonce error'); - } else { - t.fail('Failed to catch the missing nonce error. Error: ' + err.stack ? err.stack : err); - } - }); - var p7 = c.sendInstantiateProposal().then(function () { t.fail('Should not have been able to resolve the promise because of missing request parameter'); }).catch(function (err) { @@ -750,7 +706,7 @@ test('\n\n ** Chain sendInstantiateProposal() tests **\n\n', function (t) { } }); - Promise.all([p1, p3, p4, p6, p7]) + Promise.all([p1, p3, p4, p7]) .then( function (data) { t.end(); @@ -771,8 +727,7 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { var p1 = c.sendTransactionProposal({ chaincodeId : 'blah', fcn: 'invoke', - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "args" parameter'); }).catch(function (err) { @@ -787,8 +742,7 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { var p3 = c.sendTransactionProposal({ fcn: 'init', args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodeId" parameter'); }).catch(function (err) { @@ -804,8 +758,7 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { chaincodeId: 'blah', fcn: 'init', args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + txId: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "peer" objects on chain'); }).catch(function (err) { @@ -821,8 +774,7 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { var p5 = c.sendTransactionProposal({ chaincodeId: 'blah', fcn: 'init', - args: ['a', '100', 'b', '200'], - nonce: 'blah' + args: ['a', '100', 'b', '200'] }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "txId" parameter'); }).catch(function (err) { @@ -833,21 +785,6 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { } }); - var p6 = c.sendTransactionProposal({ - chaincodeId: 'blah', - fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "nonce" parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing "nonce" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing nonce error'); - } else { - t.fail('Failed to catch the missing nonce error. Error: ' + err.stack ? err.stack : err); - } - }); - var p7 = c.sendTransactionProposal().then(function () { t.fail('Should not have been able to resolve the promise because of missing request parameter'); }).catch(function (err) { @@ -858,7 +795,7 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { } }); - Promise.all([p1, p3, p4, p5, p6, p7]) + Promise.all([p1, p3, p4, p5, p7]) .then( function (data) { t.end(); @@ -871,113 +808,103 @@ test('\n\n ** Chain sendTransactionProposal() tests **\n\n', function (t) { ); }); -test('\n\n ** Client queryByChaincode() tests **\n\n', function (t) { - var c = client.newChain('any chain goes'); - var peer = new Peer('grpc://localhost:7051'); - c.addPeer(peer); +test('\n\n ** Chain queryByChaincode() tests **\n\n', function (t) { + var TEST_CERT_PEM = require('./user.js').TEST_CERT_PEM; + var member = new User('admin'); - var p1 = c.queryByChaincode({ - chaincodeId : 'blah', - fcn: 'invoke', - txId: 'blah', - nonce: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "args" parameter in queryByChaincode'); - }).catch(function (err) { - var msg = 'Missing "args" in Transaction proposal request'; - if (err.message.indexOf(msg) >= 0 ) { - t.pass('Successfully caught error: '+msg); - } else { - t.fail('Failed to catch queryByChaincode error: '+msg+'. Error: ' + err.stack ? err.stack : err); - } - }); - - var p3 = c.queryByChaincode({ - fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "chaincodeId" parameter in queryByChaincode'); - }).catch(function (err) { - if (err.message.indexOf('Missing "chaincodeId" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing chaincodeId error'); - } else { - t.fail('Failed to catch the queryByChaincode missing chaincodeId error. Error: ' + err.stack ? err.stack : err); - } - }); + // do some setup for following test + utils.setConfigSetting('key-value-store', 'fabric-client/lib/impl/FileKeyValueStore.js'); + hfc.newDefaultKeyValueStore({ + path: testutil.KVS + }).then ( function (store) { + client.setStateStore(store); + var cryptoUtils = utils.newCryptoSuite(); + return cryptoUtils.generateKey({ephemeral : true}); + }).then( function (key) { + // the private key and cert don't match, but it's ok, the code doesn't check + return member.setEnrollment(key, TEST_CERT_PEM, 'DEFAULT'); + }).then( function () { + client.setUserContext(member, true); + var chain = client.newChain('any chain goes'); + var peer = client.newPeer('grpc://localhost:7051'); + chain.addPeer(peer); + + var p1 = chain.queryByChaincode({ + chaincodeId : 'blah', + fcn: 'invoke' + }).then(function () { + t.fail('Should not have been able to resolve the promise because of missing "args" parameter in queryByChaincode'); + }).catch(function (err) { + var msg = 'Missing "args" in Transaction proposal request'; + if (err.message.indexOf(msg) >= 0 ) { + t.pass('Successfully caught error: '+msg); + } else { + t.fail('Failed to catch queryByChaincode error: '+msg+'. Error: ' + err.stack ? err.stack : err); + } + }); - c.removePeer(peer); - var p4 = c.queryByChaincode({ - chaincodeId: 'blah', - fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "peers" on chain in queryByChaincode'); - }).catch(function (err) { - var msg = 'Missing peer objects in Transaction proposal'; - if (err.message.indexOf(msg) >= 0) { - t.pass('Successfully caught error: '+msg); - } else { - t.fail('Failed to catch queryByChaincode error: '+msg+'. Error: ' + err.stack ? err.stack : err); - } - }); + var p3 = chain.queryByChaincode({ + fcn: 'init', + args: ['a', '100', 'b', '200'] + }).then(function () { + t.fail('Should not have been able to resolve the promise because of missing "chaincodeId" parameter in queryByChaincode'); + }).catch(function (err) { + if (err.message.indexOf('Missing "chaincodeId" parameter in the proposal request') >= 0) { + t.pass('Successfully caught missing chaincodeId error'); + } else { + t.fail('Failed to catch the queryByChaincode missing chaincodeId error. Error: ' + err.stack ? err.stack : err); + } + }); - c.addPeer(peer); - var p5 = c.queryByChaincode({ - chaincodeId: 'blah', - fcn: 'init', - args: ['a', '100', 'b', '200'], - nonce: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "txId" parameter in queryByChaincode'); - }).catch(function (err) { - if (err.message.indexOf('Missing "txId" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing txId error'); - } else { - t.fail('Failed to catch the queryByChaincode missing txId error. Error: ' + err.stack ? err.stack : err); - } - }); + chain.removePeer(peer); + var p4 = chain.queryByChaincode({ + chaincodeId: 'blah', + fcn: 'init', + args: ['a', '100', 'b', '200'] + }).then(function () { + t.fail('Should not have been able to resolve the promise because of missing "peers" on chain in queryByChaincode'); + }).catch(function (err) { + var msg = 'Missing peer objects in Transaction proposal'; + if (err.message.indexOf(msg) >= 0) { + t.pass('Successfully caught error: '+msg); + } else { + t.fail('Failed to catch queryByChaincode error: '+msg+'. Error: ' + err.stack ? err.stack : err); + } + }); - var p6 = c.queryByChaincode({ - chaincodeId: 'blah', - fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "nonce" parameter in queryByChaincode'); - }).catch(function (err) { - if (err.message.indexOf('Missing "nonce" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing nonce error'); - } else { - t.fail('Failed to catch the queryByChaincode missing nonce error. Error: ' + err.stack ? err.stack : err); - } - }); + chain.addPeer(peer); - var p7 = c.queryByChaincode().then(function () { - t.fail('Should not have been able to resolve the promise because of missing request parameter in queryByChaincode'); - }).catch(function (err) { - if (err.message.indexOf('Missing request object for this transaction proposal') >= 0) { - t.pass('Successfully caught missing request error'); - } else { - t.fail('Failed to catch the queryByChaincode missing request error. Error: ' + err.stack ? err.stack : err); - } - }); + var p7 = chain.queryByChaincode().then(function () { + t.fail('Should not have been able to resolve the promise because of missing request parameter in queryByChaincode'); + }).catch(function (err) { + if (err.message.indexOf('Missing request object for this queryByChaincode') >= 0) { + t.pass('Successfully caught missing request error'); + } else { + t.fail('Failed to catch the queryByChaincode missing request error. Error: ' + err.stack ? err.stack : err); + } + }); - Promise.all([p1, p3, p4, p5, p6, p7]) - .then( - function (data) { - t.end(); - } - ).catch( + Promise.all([p1, p3, p4, p7]) + .then( + function (data) { + t.pass('all test done'); + t.end(); + } + ).catch( + function (err) { + t.fail('Chain queryByChaincode() tests, Promise.all: '); + logger.error(err.stack ? err.stack : err); + t.end(); + } + ); + }).catch( function (err) { - t.fail('Client queryByChaincode() tests, Promise.all: '); + t.fail('Chain queryByChaincode() failed '); logger.error(err.stack ? err.stack : err); t.end(); } ); + }); test('\n\n ** Chain sendTransaction() tests **\n\n', function (t) { diff --git a/test/unit/client.js b/test/unit/client.js index a9ec0d3372..2080bbffd1 100644 --- a/test/unit/client.js +++ b/test/unit/client.js @@ -336,6 +336,19 @@ test('\n\n ** testing get and new orderer calls on client **\n\n', function (t) t.end(); }); +test('\n\n ** testing get transaction ID call on client **\n\n', function (t) { + t.equals(typeof hfc, 'function'); + var client = new Client(); + + t.throws(function() { + client.newTransactionID(); + }, + /This client instance must be assigned an user context/, + 'Test This client instance must be assigned an user context'); + + t.end(); +}); + /* * This test assumes that there is a ./config directory from the running location * and that there is file called 'config.json'. @@ -368,33 +381,29 @@ test('\n\n ** client installChaincode() tests **\n\n', function (t) { chaincodeId: 'blah', chaincodeVersion: 'blah', fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + args: ['a', '100', 'b', '200'] }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodePath" parameter'); }).catch(function (err) { if (err.message.indexOf('Missing chaincodePath parameter') >= 0) { - t.pass('Successfully caught missing chaincodePath error'); + t.pass('P1 - Successfully caught missing chaincodePath error'); } else { t.fail('Failed to catch the missing chaincodePath error. Error: '); console.log(err.stack ? err.stack : err); } }); - var p1a = client.installChaincode({ + var p2 = client.installChaincode({ targets: [peer], chaincodeId: 'blahp1a', chaincodePath: 'blah', fcn: 'init', - args: ['a', '100', 'b', '200'], - txId: 'blah', - nonce: 'blah' + args: ['a', '100', 'b', '200'] }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodeVersion" parameter'); }).catch(function (err) { if (err.message.indexOf('Missing "chaincodeVersion" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing chaincodeVersion error'); + t.pass('P2 - Successfully caught missing chaincodeVersion error'); } else { t.fail('Failed to catch the missing chaincodeVersion error. Error: '); console.log(err.stack ? err.stack : err); @@ -404,14 +413,12 @@ test('\n\n ** client installChaincode() tests **\n\n', function (t) { var p3 = client.installChaincode({ targets: [peer], chaincodePath: 'blahp3', - chaincodeVersion: 'blah', - txId: 'blah', - nonce: 'blah' + chaincodeVersion: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "chaincodeId" parameter'); }).catch(function (err) { if (err.message.indexOf('Missing "chaincodeId" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing chaincodeId error'); + t.pass('P3 - Successfully caught missing chaincodeId error'); } else { t.fail('Failed to catch the missing chaincodeId error. Error: ' + err.stack ? err.stack : err); } @@ -420,63 +427,29 @@ test('\n\n ** client installChaincode() tests **\n\n', function (t) { var p4 = client.installChaincode({ chaincodePath: 'blahp4', chaincodeId: 'blah', - chaincodeVersion: 'blah', - txId: 'blah', - nonce: 'blah' + chaincodeVersion: 'blah' }).then(function () { t.fail('Should not have been able to resolve the promise because of missing "peer" objects on request'); }).catch(function (err) { var msg = 'Missing peer objects in install chaincode request'; if (err.message.indexOf(msg) >= 0) { - t.pass('Successfully caught error: '+msg); + t.pass('P4 - Successfully caught error: '+msg); } else { t.fail('Failed to catch error: '+msg+'. Error: ' + err.stack ? err.stack : err); } }); - var p5 = client.installChaincode({ - targets: [peer], - chaincodePath: 'blahp5', - chaincodeId: 'blah', - chaincodeVersion: 'blah', - nonce: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "txId" parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing "txId" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing txId error'); - } else { - t.fail('Failed to catch the missing txId error. Error: ' + err.stack ? err.stack : err); - } - }); - - var p6 = client.installChaincode({ - targets: [peer], - chaincodePath: 'blahp6', - chaincodeId: 'blah', - chaincodeVersion: 'blah', - txId: 'blah' - }).then(function () { - t.fail('Should not have been able to resolve the promise because of missing "nonce" parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing "nonce" parameter in the proposal request') >= 0) { - t.pass('Successfully caught missing nonce error'); - } else { - t.fail('Failed to catch the missing nonce error. Error: ' + err.stack ? err.stack : err); - } - }); - - var p7 = client.installChaincode().then(function () { + var p5 = client.installChaincode().then(function () { t.fail('Should not have been able to resolve the promise because of missing request parameter'); }).catch(function (err) { if (err.message.indexOf('Missing input request object on install chaincode request') >= 0) { - t.pass('Successfully caught missing request error'); + t.pass('P5 - Successfully caught missing request error'); } else { t.fail('Failed to catch the missing request error. Error: ' + err.stack ? err.stack : err); } }); - Promise.all([p1, p1a, p3, p4, p6, p7]) + Promise.all([p1, p2, p3, p4, p5]) .then( function (data) { t.end(); @@ -518,7 +491,7 @@ test('\n\n ** Client createChannel() tests **\n\n', function (t) { } }); - var p3 = c.createChannel({orderer : orderer, name : 'name', nonce : 'something', txId : '777', signatures : []} + var p3 = c.createChannel({orderer : orderer, name : 'name', txId : '777', signatures : []} ).then(function () { t.fail('Should not have been able to resolve the promise because of envelope request parameter'); }).catch(function (err) { @@ -542,7 +515,7 @@ test('\n\n ** Client createChannel() tests **\n\n', function (t) { } }); - var p5 = c.createChannel({config : {}, orderer : orderer, name: 'name', txId : 'fff', nonce : 'fff'} + var p5 = c.createChannel({config : {}, orderer : orderer, name: 'name', txId : 'fff'} ).then(function () { t.fail('Should not have been able to resolve the promise because of missing signatures request parameter'); }).catch(function (err) { @@ -554,7 +527,7 @@ test('\n\n ** Client createChannel() tests **\n\n', function (t) { } }); - var p6 = c.createChannel({config : {}, orderer : orderer, name: 'name', signatures : {}, txId : 'fff', nonce : 'fff'} + var p6 = c.createChannel({config : {}, orderer : orderer, name: 'name', signatures : {}, txId : 'fff'} ).then(function () { t.fail('Should not have been able to resolve the promise because of missing signatures request parameter'); }).catch(function (err) { @@ -566,7 +539,7 @@ test('\n\n ** Client createChannel() tests **\n\n', function (t) { } }); - var p7 = c.createChannel({config : {}, orderer : orderer, name: 'name', signatures : [], nonce : 'fff'} + var p7 = c.createChannel({config : {}, orderer : orderer, name: 'name', signatures : []} ).then(function () { t.fail('Should not have been able to resolve the promise because of missing txId request parameter'); }).catch(function (err) { @@ -578,19 +551,7 @@ test('\n\n ** Client createChannel() tests **\n\n', function (t) { } }); - var p8 = c.createChannel({config : {}, orderer : orderer, name: 'name', signatures : [], txId : 'fff'} - ).then(function () { - t.fail('Should not have been able to resolve the promise because of missing nonce request parameter'); - }).catch(function (err) { - if (err.message.indexOf('Missing nonce') >= 0) { - t.pass('Successfully caught request parameter must have nonce error'); - } else { - t.fail('Failed to catch request parameter must have nonce error. Error: '); - console.log(err.stack ? err.stack : err); - } - }); - - Promise.all([p1, p2, p3, p4, p5, p6, p7, p8]) + Promise.all([p1, p2, p3, p4, p5, p6, p7]) .then( function (data) { t.end(); @@ -975,7 +936,7 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { console.log(err.stack ? err.stack : err); } }); - var p3a= client.updateChannel({config : 'a', txId : 'a', nonce : 'a', orderer : 'a', name : 'a' } + var p3a= client.updateChannel({config : 'a', txId : 'a', orderer : 'a', name : 'a' } ).then(function () { t.fail('Should not have been able to resolve the promise'); }).catch(function (err) { @@ -987,7 +948,7 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { console.log(err.stack ? err.stack : err); } }); - var p3b= client.updateChannel({config : 'a', signatures : 'a', txId : 'a', nonce : 'a', orderer : 'a', name : 'a'} + var p3b= client.updateChannel({config : 'a', signatures : 'a', txId : 'a', orderer : 'a', name : 'a'} ).then(function () { t.fail('Should not have been able to resolve the promise'); }).catch(function (err) { @@ -1000,7 +961,7 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { } }); - var p4= client.updateChannel({config : 'a', signatures : [], nonce : 'a', orderer : 'a', name : 'a'} + var p4= client.updateChannel({config : 'a', signatures : [], orderer : 'a', name : 'a'} ).then(function () { t.fail('Should not have been able to resolve the promise'); }).catch(function (err) { @@ -1012,19 +973,8 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { console.log(err.stack ? err.stack : err); } }); - var p5= client.updateChannel({config : 'a', signatures : [], txId : 'a', orderer : 'a', name : 'a'} - ).then(function () { - t.fail('Should not have been able to resolve the promise'); - }).catch(function (err) { - let msg = 'Missing nonce request parameter'; - if (err.message.indexOf(msg) >= 0) { - t.pass('Successfully caught the ' + msg ); - } else { - t.fail('Failed to catch the ' + msg + ' Error: '); - console.log(err.stack ? err.stack : err); - } - }); - var p6= client.updateChannel({config : 'a', signatures : [], txId : 'a', nonce : 'a', name : 'a'} + + var p6= client.updateChannel({config : 'a', signatures : [], txId : 'a', name : 'a'} ).then(function () { t.fail('Should not have been able to resolve the promise'); }).catch(function (err) { @@ -1036,7 +986,7 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { console.log(err.stack ? err.stack : err); } }); - var p7= client.updateChannel({config : 'a', signatures : [], txId : 'a', nonce : 'a', orderer : 'a'} + var p7= client.updateChannel({config : 'a', signatures : [], txId : 'a', orderer : 'a'} ).then(function () { t.fail('Should not have been able to resolve the promise'); }).catch(function (err) { @@ -1060,7 +1010,7 @@ test('\n\n ** test related APIs for create channel **\n\n', function (t) { console.log(err.stack ? err.stack : err); } }); - Promise.all([p1, p1a, p2, p3a, p3b, p4, p5, p6, p7, p8]) + Promise.all([p1, p1a, p2, p3a, p3b, p4, p6, p7, p8]) .then( function (data) { t.end(); diff --git a/test/unit/transactionid.js b/test/unit/transactionid.js new file mode 100644 index 0000000000..5dd261dcfa --- /dev/null +++ b/test/unit/transactionid.js @@ -0,0 +1,65 @@ +/** + * 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. + */ + +'use strict'; + +var tape = require('tape'); +var _test = require('tape-promise'); +var test = _test(tape); + +var TransactionID = require('fabric-client/lib/TransactionID.js'); +var User = require('fabric-client/lib/User.js'); +var utils = require('fabric-client/lib/utils.js'); + +var enrollmentID = 123454321; +var roles = ['admin', 'user']; +var memberCfg = { + 'enrollmentID': enrollmentID, + 'roles': roles +}; + +var TEST_CERT_PEM = require('./user.js').TEST_CERT_PEM; + +test('\n\n ** Transaction - constructor set get tests **\n\n', function (t) { + t.throws(function() { + new TransactionID(); + }, + /Missing userContext parameter/, + 'Test Missing userContext parameter'); + + t.throws(function() { + new TransactionID({}); + }, + /Parameter "userContext" must be an instance of the "User" class/, + 'Test Parameter "userContext" must be an instance of the "User" class'); + + var member = new User('admin'); + // test set enrollment for identity and signing identity + var cryptoUtils = utils.newCryptoSuite(); + cryptoUtils.generateKey({ephemeral : true}) + .then(function (key) { + // the private key and cert don't match, but it's ok, the code doesn't check + return member.setEnrollment(key, TEST_CERT_PEM, 'DEFAULT'); + }).then(() =>{ + var trans_id = new TransactionID(member); + t.pass('Successfully created a new TransactionID'); + t.end(); + }).catch((err) => { + t.fail(err.stack ? err.stack : err); + t.end(); + }); + +}); \ No newline at end of file diff --git a/test/unit/user.js b/test/unit/user.js index fa18189467..720cf7408a 100644 --- a/test/unit/user.js +++ b/test/unit/user.js @@ -57,6 +57,8 @@ var TEST_CERT_PEM = '-----BEGIN CERTIFICATE-----' + 'UWUxIC0CIQDNyHQAwzhw+512meXRwG92GfpzSBssDKLdwlrqiHOu5A==' + '-----END CERTIFICATE-----'; +module.exports.TEST_CERT_PEM = TEST_CERT_PEM; + test('\n\n ** User - constructor set get tests **\n\n', function (t) { utils.setConfigSetting('crypto-hsm', false);