github.com/kchristidis/fabric@v1.0.4-0.20171028114726-837acd08cde1/test/tools/PTE/pte-execRequest.js (about)

     1  /**
     2   * Copyright 2016 IBM All Rights Reserved.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *    http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   *  Unless required by applicable law or agreed to in writing, software
    11   *  distributed under the License is distributed on an "AS IS" BASIS,
    12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   *  See the License for the specific language governing permissions and
    14   *  limitations under the License.
    15   */
    16  
    17  /*
    18   *   usage:
    19   *      node pte-execRequest.js pid Nid uiFile tStart
    20   *        - action: deploy, invoke, query
    21   *        - recurrence: integer number
    22   */
    23  // This is an end-to-end test that focuses on exercising all parts of the fabric APIs
    24  // in a happy-path scenario
    25  'use strict';
    26  
    27  var log4js = require('log4js');
    28  var logger = log4js.getLogger('E2E');
    29  logger.setLevel('ERROR');
    30  
    31  var path = require('path');
    32  
    33  var hfc = require('fabric-client');
    34  hfc.setLogger(logger);
    35  
    36  var fs = require('fs');
    37  var grpc = require('grpc');
    38  var util = require('util');
    39  var testUtil = require('./pte-util.js');
    40  var utils = require('fabric-client/lib/utils.js');
    41  var Peer = require('fabric-client/lib/Peer.js');
    42  var Orderer = require('fabric-client/lib/Orderer.js');
    43  var EventHub = require('fabric-client/lib/EventHub.js');
    44  var FabricCAServices = require('fabric-ca-client/lib/FabricCAClientImpl');
    45  var FabricCAClient = FabricCAServices.FabricCAClient;
    46  var User = require('fabric-client/lib/User.js');
    47  var Client = require('fabric-client/lib/Client.js');
    48  var _commonProto = grpc.load(path.join(__dirname, 'node_modules/fabric-client/lib/protos/common/common.proto')).common;
    49  
    50  const crypto = require('crypto');
    51  
    52  utils.setConfigSetting('crypto-keysize', 256);
    53  
    54  
    55  // local vars
    56  var tmp;
    57  var tCurr;
    58  var tEnd;
    59  var tLocal;
    60  var i = 0;
    61  var inv_m = 0;    // counter of invoke move
    62  var inv_q = 0;    // counter of invoke query
    63  var evtTimeout = 0;    // counter of event timeout
    64  var IDone=0;
    65  var QDone=0;
    66  var recHist;
    67  var buff;
    68  var ofile;
    69  var invokeCheck;
    70  var chaincode_id;
    71  var chaincode_ver;
    72  var chain_id;
    73  var tx_id = null;
    74  var nonce = null;
    75  var the_user = null;
    76  var eventHubs=[];
    77  var targets = [];
    78  var eventPromises = [];
    79  
    80  //testUtil.setupChaincodeDeploy();
    81  
    82  // need to override the default key size 384 to match the member service backend
    83  // otherwise the client will not be able to decrypt the enrollment challenge
    84  utils.setConfigSetting('crypto-keysize', 256);
    85  
    86  // need to override the default hash algorithm (SHA3) to SHA2 (aka SHA256 when combined
    87  // with the key size 256 above), in order to match what the peer and COP use
    88  utils.setConfigSetting('crypto-hash-algo', 'SHA2');
    89  
    90  //input args
    91  var pid = parseInt(process.argv[2]);
    92  var Nid = parseInt(process.argv[3]);
    93  var uiFile = process.argv[4];
    94  var tStart = parseInt(process.argv[5]);
    95  var org=process.argv[6];
    96  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] input parameters: uiFile=%s, tStart=%d', Nid, pid, channelName, org, uiFile, tStart);
    97  var uiContent = JSON.parse(fs.readFileSync(uiFile));
    98  var TLS=uiContent.TLS;
    99  var channelOpt=uiContent.channelOpt;
   100  var channelOrgName = [];
   101  var channelName = channelOpt.name;
   102  for (i=0; i<channelOpt.orgName.length; i++) {
   103      channelOrgName.push(channelOpt.orgName[i]);
   104  }
   105  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] TLS: %s', Nid, pid, channelName, org, TLS.toUpperCase());
   106  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] channelOrgName.length: %d, channelOrgName: %s', Nid, pid, channelName, org, channelOrgName.length, channelOrgName);
   107  
   108  var client = new hfc();
   109  var chain = client.newChain(channelName);
   110  
   111  invokeCheck = uiContent.invokeCheck;
   112  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] invokeCheck: ', Nid, pid, channelName, org, invokeCheck);
   113  
   114  var channelID = uiContent.channelID;
   115  chaincode_id = uiContent.chaincodeID+channelID;
   116  chaincode_ver = uiContent.chaincodeVer;
   117  chain_id = uiContent.chainID+channelID;
   118  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] chaincode_id: %s, chain_id: %s', Nid, pid, channelName, org, chaincode_id, chain_id);
   119  
   120  //set log level
   121  var logLevel;
   122      if (typeof( uiContent.logLevel ) == 'undefined') {
   123          logLevel='ERROR';
   124      } else {
   125          logLevel=uiContent.logLevel;
   126      }
   127  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] logLevel: %s', Nid, pid, channelName, org, logLevel);
   128  logger.setLevel(logLevel);
   129  
   130  var svcFile = uiContent.SCFile[0].ServiceCredentials;
   131  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] svcFile: %s, org: %s', Nid, pid, channelName, org, svcFile, org);
   132  hfc.addConfigFile(path.join(__dirname, svcFile));
   133  var ORGS = hfc.getConfigSetting('test-network');
   134  var orgName = ORGS[org].orgName;
   135  
   136  var users =  hfc.getConfigSetting('users');
   137  
   138  //user parameters
   139  var transMode = uiContent.transMode;
   140  var transType = uiContent.transType;
   141  var invokeType = uiContent.invokeType;
   142  var nRequest = parseInt(uiContent.nRequest);
   143  var nProc = parseInt(uiContent.nProc);
   144  var nOrg = parseInt(uiContent.nOrg);
   145  var nPeerPerOrg = parseInt(uiContent.nPeerPerOrg);
   146  var nPeer = nOrg * nPeerPerOrg;
   147  
   148  var nOrderer = parseInt(uiContent.nOrderer);
   149  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] nOrderer: %d, nPeer: %d, transMode: %s, transType: %s, invokeType: %s, nRequest: %d', Nid, pid, channelName, org,  nOrderer, nPeer, transMode, transType, invokeType, nRequest);
   150  
   151  var runDur=0;
   152  if ( nRequest == 0 ) {
   153     runDur = parseInt(uiContent.runDur);
   154     console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] nOrderer: %d, nPeer: %d, transMode: %s, transType: %s, invokeType: %s, runDur: %d', Nid, pid, channelName, org, nOrderer, nPeer, transMode, transType, invokeType, runDur);
   155     // convert runDur from second to ms
   156     runDur = 1000*runDur;
   157  }
   158  
   159  
   160  var ccType = uiContent.ccType;
   161  var keyStart=0;
   162  var payLoadMin=0;
   163  var payLoadMax=0;
   164  var arg0=0;
   165  
   166  if ( ccType == 'ccchecker') {
   167      keyStart = parseInt(uiContent.ccOpt.keyStart);
   168      payLoadMin = parseInt(uiContent.ccOpt.payLoadMin)/2;
   169      payLoadMax = parseInt(uiContent.ccOpt.payLoadMax)/2;
   170      arg0 = keyStart;
   171      console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] ccchecker chaincode setting: keyStart=%d payLoadMin=%d payLoadMax=%d',
   172                   Nid, pid, channelName, org, keyStart, parseInt(uiContent.ccOpt.payLoadMin), parseInt(uiContent.ccOpt.payLoadMax));
   173  }
   174  console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] ccType: %s, keyStart: %d', Nid, pid, channelName, org, ccType, keyStart);
   175  //construct invoke request
   176  var testInvokeArgs = [];
   177  for (i=0; i<uiContent.invoke.move.args.length; i++) {
   178      testInvokeArgs.push(uiContent.invoke.move.args[i]);
   179  }
   180  
   181  var request_invoke;
   182  function getMoveRequest() {
   183      if ( ccType == 'ccchecker') {
   184          arg0 ++;
   185          testInvokeArgs[1] = 'key_'+channelName+'_'+org+'_'+Nid+'_'+pid+'_'+arg0;
   186          // random payload
   187          var r = Math.floor(Math.random() * (payLoadMax - payLoadMin)) + payLoadMin;
   188  
   189          var buf = crypto.randomBytes(r);
   190          testInvokeArgs[2] = buf.toString('hex');
   191      }
   192      //console.log('d:id:chan:org=%d:%d:%s:%s getMoveRequest] testInvokeArgs[1]', Nid, pid, channelName, org, testInvokeArgs[1]);
   193  
   194      nonce = utils.getNonce();
   195      tx_id = hfc.buildTransactionID(nonce, the_user);
   196      utils.setConfigSetting('E2E_TX_ID', tx_id);
   197      logger.info('setConfigSetting("E2E_TX_ID") = %s', tx_id);
   198  
   199      request_invoke = {
   200          chaincodeId : chaincode_id,
   201          chaincodeVersion : chaincode_ver,
   202          chainId: channelName,
   203          fcn: uiContent.invoke.move.fcn,
   204          args: testInvokeArgs,
   205          txId: tx_id,
   206          nonce: nonce
   207      };
   208  
   209  
   210      if ( inv_m == nRequest ) {
   211          if (invokeCheck.toUpperCase() == 'TRUE') {
   212              console.log('request_invoke: ', request_invoke);
   213          }
   214      }
   215  
   216  }
   217  
   218  //construct query request
   219  var testQueryArgs = [];
   220  for (i=0; i<uiContent.invoke.query.args.length; i++) {
   221      testQueryArgs.push(uiContent.invoke.query.args[i]);
   222  }
   223  
   224  var request_query;
   225  function getQueryRequest() {
   226      if ( ccType == 'ccchecker') {
   227          arg0 ++;
   228          testQueryArgs[1] = 'key_'+channelName+'_'+org+'_'+Nid+'_'+pid+'_'+arg0;
   229      }
   230      //console.log('d:id:chan:org=%d:%d:%s:%s getQueryRequest] testQueryArgs[1]', Nid, pid, channelName, org, testQueryArgs[1]);
   231  
   232      nonce = utils.getNonce();
   233      tx_id = hfc.buildTransactionID(nonce, the_user);
   234      request_query = {
   235          chaincodeId : chaincode_id,
   236          chaincodeVersion : chaincode_ver,
   237          chainId: channelName,
   238          txId: tx_id,
   239          nonce: nonce,
   240          fcn: uiContent.invoke.query.fcn,
   241          args: testQueryArgs
   242      };
   243  
   244      //console.log('request_query: ', request_query);
   245  }
   246  
   247  
   248  function assignThreadPeer(chain, client) {
   249      console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] chain name: %s', Nid, pid, channelName, chain.getName());
   250      var peerIdx=0;
   251      var peerTmp;
   252      var eh;
   253      for (let key1 in ORGS) {
   254          if (ORGS.hasOwnProperty(key1)) {
   255              for (let key in ORGS[key1]) {
   256              if (key.indexOf('peer1') === 0) {
   257                  if (peerIdx == pid % nPeer) {
   258                  if (TLS.toUpperCase() == 'ENABLED') {
   259                      let data = fs.readFileSync(ORGS[key1][key]['tls_cacerts']);
   260                      peerTmp = client.newPeer(
   261                          ORGS[key1][key].requests,
   262                          {
   263                              pem: Buffer.from(data).toString(),
   264                              'ssl-target-name-override': ORGS[key1][key]['server-hostname']
   265                          }
   266                      );
   267                      targets.push(peerTmp);
   268                      chain.addPeer(peerTmp);
   269                  } else {
   270                      peerTmp = client.newPeer( ORGS[key1][key].requests);
   271                      targets.push(peerTmp);
   272                      chain.addPeer(peerTmp);
   273                  }
   274  
   275                      eh=new EventHub(client);
   276                      if (TLS.toUpperCase() == 'ENABLED') {
   277                          eh.setPeerAddr(
   278                              ORGS[key1][key].events,
   279                              {
   280                                  pem: Buffer.from(data).toString(),
   281                                  'ssl-target-name-override': ORGS[key1][key]['server-hostname']
   282                              }
   283                          );
   284                      } else {
   285                          eh.setPeerAddr(ORGS[key1][key].events);
   286                      }
   287                      eh.connect();
   288                      eventHubs.push(eh);
   289                      console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] requests: %s, events: %s ', Nid, pid, channelName, ORGS[key1][key].requests, ORGS[key1][key].events);
   290                  }
   291                  peerIdx++;
   292                  }
   293              }
   294          }
   295      }
   296      //console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] add peer: ', Nid, pid, channelName, chain.getPeers());
   297  }
   298  
   299  function assignThreadOrgPeer(chain, client, org) {
   300      console.log('[Nid:id:chan:org=%d:%d:%s:%s assignThreadOrgPeer] chain name: %s', Nid, pid, channelName, org, chain.getName());
   301      var peerIdx=0;
   302      var peerTmp;
   303      var eh;
   304      for (let key in ORGS[org]) {
   305          if (ORGS[org].hasOwnProperty(key)) {
   306              if (key.indexOf('peer') === 0) {
   307                  if (peerIdx == pid % nPeerPerOrg) {
   308                      if (TLS.toUpperCase() == 'ENABLED') {
   309                          let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']);
   310                          peerTmp = client.newPeer(
   311                              ORGS[org][key].requests,
   312                              {
   313                                  pem: Buffer.from(data).toString(),
   314                                  'ssl-target-name-override': ORGS[org][key]['server-hostname']
   315                              }
   316                          );
   317                          targets.push(peerTmp);
   318                          chain.addPeer(peerTmp);
   319                      } else {
   320                          peerTmp = client.newPeer( ORGS[org][key].requests);
   321                          //targets.push(peerTmp);
   322                          chain.addPeer(peerTmp);
   323                      }
   324  
   325                      eh=new EventHub(client);
   326                      if (TLS.toUpperCase() == 'ENABLED') {
   327                          eh.setPeerAddr(
   328                              ORGS[org][key].events,
   329                              {
   330                                  pem: Buffer.from(data).toString(),
   331                                  'ssl-target-name-override': ORGS[org][key]['server-hostname']
   332                              }
   333                          );
   334                      } else {
   335                          eh.setPeerAddr(ORGS[org][key].events);
   336                      }
   337                      eh.connect();
   338                      eventHubs.push(eh);
   339                  }
   340                  peerIdx++;
   341              }
   342          }
   343      }
   344      //console.log('[Nid:id:chan:org=%d:%d:%s:%s assignThreadOrgPeer] add peer: ', Nid, pid, channelName, org, chain.getPeers());
   345  }
   346  
   347  
   348  function channelAddPeer(chain, client, org) {
   349      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeer] chain name: ', Nid, pid, channelName, org, chain.getName());
   350      var peerTmp;
   351      var eh;
   352      for (let key in ORGS[org]) {
   353          if (ORGS[org].hasOwnProperty(key)) {
   354              if (key.indexOf('peer') === 0) {
   355                  if (TLS.toUpperCase() == 'ENABLED') {
   356                      let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']);
   357                      peerTmp = client.newPeer(
   358                          ORGS[org][key].requests,
   359                          {
   360                              pem: Buffer.from(data).toString(),
   361                              'ssl-target-name-override': ORGS[org][key]['server-hostname']
   362                          }
   363                      );
   364                      targets.push(peerTmp);
   365                      chain.addPeer(peerTmp);
   366                  } else {
   367                      peerTmp = client.newPeer( ORGS[org][key].requests);
   368                      targets.push(peerTmp);
   369                      chain.addPeer(peerTmp);
   370                  }
   371              }
   372          }
   373      }
   374      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeer] add peer: ', Nid, pid, channelName, org, chain.getPeers());
   375  }
   376  
   377  
   378  function channelAddPeerEvent(chain, client, org) {
   379      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] chain name: ', Nid, pid, channelName, org, chain.getName());
   380              var eh;
   381              var peerTmp;
   382              for (let key in ORGS[org]) {
   383                  console.log('key: ', key);
   384                  if (ORGS[org].hasOwnProperty(key)) {
   385                      if (key.indexOf('peer') === 0) {
   386                          if (TLS.toUpperCase() == 'ENABLED') {
   387                              let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']);
   388                              peerTmp = client.newPeer(
   389                                  ORGS[org][key].requests,
   390                                  {
   391                                      pem: Buffer.from(data).toString(),
   392                                      'ssl-target-name-override': ORGS[key]['server-hostname']
   393                                  }
   394                              );
   395                          } else {
   396                              peerTmp = client.newPeer( ORGS[org][key].requests);
   397                              console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] peer: ', Nid, pid, channelName, org, ORGS[org][key].requests);
   398                          }
   399                          targets.push(peerTmp);
   400                          chain.addPeer(peerTmp);
   401  
   402                          eh=new EventHub(client);
   403                          if (TLS.toUpperCase() == 'ENABLED') {
   404                              eh.setPeerAddr(
   405                                  ORGS[org][key].events,
   406                                  {
   407                                      pem: Buffer.from(data).toString(),
   408                                      'ssl-target-name-override': ORGS[org][key]['server-hostname']
   409                                  }
   410                              );
   411                          } else {
   412                              eh.setPeerAddr(ORGS[org][key].events);
   413                          }
   414                          eh.connect();
   415                          eventHubs.push(eh);
   416                          console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] requests: %s, events: %s ', Nid, pid, channelName, org, ORGS[org][key].requests, ORGS[org][key].events);
   417                      }
   418                  }
   419                  //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] add peer: ', Nid, pid, channelName, org, chain.getPeers());
   420                  //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] event: ', Nid, pid, channelName, org, eventHubs);
   421              }
   422  }
   423  
   424  function channelAddOrderer(chain, client, org) {
   425      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] chain name: ', Nid, pid, channelName, org, chain.getName());
   426      if (TLS.toUpperCase() == 'ENABLED') {
   427          var caRootsPath = ORGS.orderer.tls_cacerts;
   428          let data = fs.readFileSync(caRootsPath);
   429          let caroots = Buffer.from(data).toString();
   430  
   431          chain.addOrderer(
   432              new Orderer(
   433                  ORGS.orderer.url,
   434                  {
   435                      'pem': caroots,
   436                      'ssl-target-name-override': ORGS.orderer['server-hostname']
   437                  }
   438              )
   439          );
   440      } else {
   441          chain.addOrderer( new Orderer(ORGS.orderer.url));
   442          console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] orderer url: ', Nid, pid, channelName, org, ORGS.orderer.url);
   443      }
   444      //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] orderer in the chain: ', Nid, pid, channelName, org, chain.getOrderers());
   445  }
   446  
   447  function channelAddAnchorPeer(chain, client, org) {
   448      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] chain name: %s', Nid, pid, channelName, org, chain.getName());
   449      var peerTmp;
   450      var eh;
   451      var data;
   452      for (let key in ORGS) {
   453          if (ORGS.hasOwnProperty(key) && typeof ORGS[key].peer1 !== 'undefined') {
   454                  if ( key == org ) {
   455                  if (TLS.toUpperCase() == 'ENABLED') {
   456                      data = fs.readFileSync(ORGS[key].peer1['tls_cacerts']);
   457                      peerTmp = client.newPeer(
   458                          ORGS[key].peer1.requests,
   459                          {
   460                              pem: Buffer.from(data).toString(),
   461                              'ssl-target-name-override': ORGS[key].peer1['server-hostname']
   462                          }
   463                      );
   464                      targets.push(peerTmp);
   465                      chain.addPeer(peerTmp);
   466                  } else {
   467                      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] key: %s, peer1: %s', Nid, pid, channelName, org, key, ORGS[org].peer1.requests);
   468                      peerTmp = client.newPeer( ORGS[key].peer1.requests);
   469                      targets.push(peerTmp);
   470                      chain.addPeer(peerTmp);
   471                  }
   472                  }
   473  
   474                  if ( (invokeType.toUpperCase() == 'MOVE') && ( key == org ) ) {
   475                      eh=new EventHub(client);
   476                      if (TLS.toUpperCase() == 'ENABLED') {
   477                          eh.setPeerAddr(
   478                              ORGS[key].peer1.events,
   479                              {
   480                                  pem: Buffer.from(data).toString(),
   481                                  'ssl-target-name-override': ORGS[key].peer1['server-hostname']
   482                              }
   483                          );
   484                      } else {
   485                          eh.setPeerAddr(ORGS[key].peer1.events);
   486                      }
   487                      eh.connect();
   488                      eventHubs.push(eh);
   489                      console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] requests: %s, events: %s ', Nid, pid, channelName, org, ORGS[key].peer1.requests, ORGS[key].peer1.events);
   490                  }
   491          }
   492      }
   493      console.log('[[Nid:id=%d:%d] channelAddAnchorPeer] get peer: ', Nid, pid, chain.getPeers());
   494      //console.log('[[Nid:id=%d:%d] channelAddAnchorPeer] event: ', Nid, pid, eventHubs);
   495  }
   496  
   497  /*
   498   *   transactions begin ....
   499   */
   500      execTransMode();
   501  
   502  function execTransMode() {
   503  
   504      // init vars
   505      inv_m = 0;
   506      inv_q = 0;
   507  
   508      //var caRootsPath = ORGS.orderer.tls_cacerts;
   509      //let data = fs.readFileSync(caRootsPath);
   510      //let caroots = Buffer.from(data).toString();
   511      var username = ORGS[org].username;
   512      var secret = ORGS[org].secret;
   513      console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] user= %s, secret=%s', Nid, pid, channelName, org, username, secret);
   514  
   515  
   516  
   517      //enroll user
   518      hfc.newDefaultKeyValueStore({
   519          path: testUtil.storePathForOrg(orgName)
   520      }).then(
   521          function (store) {
   522              client.setStateStore(store);
   523  
   524              client._userContext = null;
   525              testUtil.getSubmitter(username, secret, client, true, org, svcFile)
   526              .then(
   527                  function(admin) {
   528  
   529                      console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Successfully loaded user \'admin\'', Nid, pid, channelName, org);
   530                      the_user = admin;
   531  
   532                      channelAddOrderer(chain, client, org)
   533  
   534                      channelAddAnchorPeer(chain, client, org);
   535                      //assignThreadOrgPeer(chain, client, org);
   536  
   537  	            tCurr = new Date().getTime();
   538                      var tSynchUp=tStart-tCurr;
   539                      if ( tSynchUp < 10000 ) {
   540                          tSynchUp=10000;
   541                      }
   542  	            console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] execTransMode: tCurr= %d, tStart= %d, time to wait=%d', Nid, pid, channelName, org, tCurr, tStart, tSynchUp);
   543                      // execute transactions
   544                      chain.initialize()
   545                      .then((success) => {
   546                      setTimeout(function() {
   547                          if (transMode.toUpperCase() == 'SIMPLE') {
   548                              execModeSimple();
   549                          } else if (transMode.toUpperCase() == 'CONSTANT') {
   550                              execModeConstant();
   551                          } else if (transMode.toUpperCase() == 'MIX') {
   552                              execModeMix();
   553                          } else if (transMode.toUpperCase() == 'BURST') {
   554                              execModeBurst();
   555                          } else if (transMode.toUpperCase() == 'LATENCY') {
   556                              execModeLatency();
   557                          } else if (transMode.toUpperCase() == 'PROPOSAL') {
   558                              execModeProposal();
   559                          } else {
   560                              // invalid transaction request
   561                              console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Transaction %j and/or mode %s invalid", Nid, pid, channelName, org, transType, transMode));
   562                              process.exit(1);
   563                          }
   564                      }, tSynchUp);
   565                      });
   566                  },
   567                  function(err) {
   568                      console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Failed to wait due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   569                      return;
   570                  }
   571              );
   572          });
   573  }
   574  
   575  function isExecDone(trType){
   576      tCurr = new Date().getTime();
   577      if ( trType.toUpperCase() == 'MOVE' ) {
   578          if ( nRequest > 0 ) {
   579             if ( (inv_m % (nRequest/10)) == 0 ) {
   580                console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d",
   581                                           Nid, pid, channelName, org, trType, inv_m, tCurr-tLocal));
   582             }
   583  
   584             if ( inv_m >= nRequest ) {
   585                  IDone = 1;
   586             }
   587          } else {
   588             if ( (inv_m % 1000) == 0 ) {
   589                console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d",
   590                                           Nid, pid, channelName, org, trType, inv_m, tCurr-tLocal));
   591             }
   592  
   593             if ( tCurr > tEnd ) {
   594                  IDone = 1;
   595             }
   596          }
   597      } else if ( trType.toUpperCase() == 'QUERY' ) {
   598          if ( nRequest > 0 ) {
   599             if ( (inv_q % (nRequest/10)) == 0 ) {
   600                console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d",
   601                                           Nid, pid, channelName, org, trType, inv_q, tCurr-tLocal));
   602             }
   603  
   604             if ( inv_q >= nRequest ) {
   605                  QDone = 1;
   606             }
   607          } else {
   608             if ( (inv_q % 1000) == 0 ) {
   609                console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d",
   610                                           Nid, pid, channelName, org, trType, inv_q, tCurr-tLocal));
   611             }
   612  
   613             if ( tCurr > tEnd ) {
   614                  QDone = 1;
   615             }
   616          }
   617      }
   618  
   619  
   620  }
   621  
   622  
   623  var txRequest;
   624  function getTxRequest(results) {
   625      txRequest = {
   626          proposalResponses: results[0],
   627          proposal: results[1],
   628          header: results[2]
   629      };
   630  }
   631  
   632  var evtRcv=0;
   633  function eventRegister(tx, cb) {
   634      var txId = tx.toString();
   635  
   636      var deployId = tx_id.toString();
   637      var eventPromises = [];
   638      eventHubs.forEach((eh) => {
   639          let txPromise = new Promise((resolve, reject) => {
   640              let handle = setTimeout(reject, 600000);
   641  
   642              eh.registerTxEvent(deployId.toString(), (tx, code) => {
   643                  clearTimeout(handle);
   644                  eh.unregisterTxEvent(deployId);
   645                  evtRcv++;
   646  
   647                  if (code !== 'VALID') {
   648                      console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] The invoke transaction was invalid, code = ', Nid, pid, channelName, org,  code);
   649                      reject();
   650                  } else {
   651                      if ( ( IDone == 1 ) && ( inv_m == evtRcv ) ) {
   652                          tCurr = new Date().getTime();
   653                          console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] completed Rcvd(sent)=%d(%d) %s(%s) in %d ms, timestamp: start %d end %d, #event timeout: %d', Nid, pid, channelName, org,  evtRcv, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr, evtTimeout);
   654                          if (invokeCheck.toUpperCase() == 'TRUE') {
   655                              arg0 = keyStart + inv_m - 1;
   656                              inv_q = inv_m - 1;
   657                              invoke_query_simple(0);
   658                          }
   659                          evtDisconnect();
   660                          resolve();
   661                      }
   662                  }
   663              });
   664          }).catch((err) => {
   665              evtTimeout++;
   666              //console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] number of events timeout=%d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, evtTimeout, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   667          });
   668  
   669          eventPromises.push(txPromise);
   670      });
   671      //var sendPromise = chain.sendTransaction(txRequest);
   672      cb(eventPromises);
   673          //cb(txRequest);
   674      /*
   675      return Promise.all([sendPromise].concat(eventPromises))
   676      .then((results) => {
   677          console.log(' event promise all complete and testing complete');
   678          return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call
   679      }).catch((err) => {
   680          console.log('Failed to send transaction and get notifications within the timeout period.');
   681          evtDisconnect();
   682          throw new Error('Failed to send transaction and get notifications within the timeout period.');
   683      });
   684      */
   685  }
   686  
   687  function eventRegister_latency(tx, cb) {
   688      var txId = tx.toString();
   689  
   690      var deployId = tx_id.toString();
   691      var eventPromises = [];
   692      eventHubs.forEach((eh) => {
   693          let txPromise = new Promise((resolve, reject) => {
   694              let handle = setTimeout(reject, 600000);
   695              evtRcv++;
   696  
   697              eh.registerTxEvent(deployId.toString(), (tx, code) => {
   698                  clearTimeout(handle);
   699                  eh.unregisterTxEvent(deployId);
   700  
   701                  if (code !== 'VALID') {
   702                      console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister_latency] The invoke transaction was invalid, code = ', Nid, pid, channelName, org, code);
   703                      reject();
   704                  } else {
   705                      if ( ( IDone == 1 ) && ( inv_m == evtRcv ) ) {
   706                          tCurr = new Date().getTime();
   707                          console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister_latency] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   708                          if (invokeCheck.toUpperCase() == 'TRUE') {
   709                              arg0 = keyStart + inv_m - 1;
   710                              inv_q = inv_m - 1;
   711                              invoke_query_simple(0);
   712                          }
   713                          evtDisconnect();
   714                          resolve();
   715                      } else if ( IDone != 1 ) {
   716                          invoke_move_latency();
   717                      }
   718                  }
   719              });
   720          });
   721  
   722          eventPromises.push(txPromise);
   723      });
   724      //var sendPromise = chain.sendTransaction(txRequest);
   725      cb(eventPromises);
   726      
   727  /*
   728      return Promise.all([sendPromise].concat(eventPromises))
   729      .then((results) => {
   730          console.log(' event promise all complete and testing complete');
   731          return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call
   732      }).catch((err) => {
   733          console.log('Failed to send transaction and get notifications within the timeout period.');
   734          evtDisconnect();
   735          throw new Error('Failed to send transaction and get notifications within the timeout period.');
   736      });
   737  */
   738      
   739  }
   740  
   741  
   742  // invoke_move_latency
   743  function invoke_move_latency() {
   744      if ( IDone == 1 ) {
   745         return;
   746      }
   747  
   748      inv_m++;
   749  
   750      getMoveRequest();
   751  
   752      chain.sendTransactionProposal(request_invoke)
   753      .then(
   754          function(results) {
   755              var proposalResponses = results[0];
   756  
   757              getTxRequest(results);
   758              eventRegister_latency(request_invoke.txId, function(sendPromise) {
   759  
   760                  var sendPromise = chain.sendTransaction(txRequest);
   761                  return Promise.all([sendPromise].concat(eventPromises))
   762                  .then((results) => {
   763  
   764                      isExecDone('Move');
   765                      return results[0];
   766  
   767                  }).catch((err) => {
   768                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_latency] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   769                      evtDisconnect();
   770                      return;
   771                  })
   772              },
   773              function(err) {
   774                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_latency] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   775                  evtDisconnect();
   776              })
   777  
   778          });
   779  
   780  }
   781  
   782  
   783  function execModeLatency() {
   784  
   785      // send proposal to endorser
   786      if ( transType.toUpperCase() == 'INVOKE' ) {
   787          tLocal = new Date().getTime();
   788          if ( runDur > 0 ) {
   789              tEnd = tLocal + runDur;
   790          }
   791          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeLatency] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal);
   792          if ( invokeType.toUpperCase() == 'MOVE' ) {
   793              var freq = 20000;
   794              if ( ccType == 'ccchecker' ) {
   795                  freq = 0;
   796              }
   797              invoke_move_latency();
   798          } else if ( invokeType.toUpperCase() == 'QUERY' ) {
   799              invoke_query_simple(0);
   800          }
   801      } else {
   802          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeLatency] invalid transType= %s', Nid, pid, channelName, org, transType);
   803          evtDisconnect();
   804      }
   805  }
   806  
   807  // invoke_move_simple
   808  function invoke_move_simple(freq) {
   809      inv_m++;
   810  
   811      getMoveRequest();
   812  
   813      chain.sendTransactionProposal(request_invoke)
   814      .then(
   815          function(results) {
   816              var proposalResponses = results[0];
   817  
   818              getTxRequest(results);
   819              eventRegister(request_invoke.txId, function(sendPromise) {
   820  
   821                  var sendPromise = chain.sendTransaction(txRequest);
   822                  return Promise.all([sendPromise].concat(eventPromises))
   823                  .then((results) => {
   824                      //tCurr = new Date().getTime();
   825                      //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   826  
   827                      isExecDone('Move');
   828                      if ( IDone != 1 ) {
   829                          setTimeout(function(){
   830                              invoke_move_simple(freq);
   831                          },freq);
   832                      } else {
   833                          tCurr = new Date().getTime();
   834                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   835                      //    return;
   836                      }
   837                      return results[0];
   838  
   839                  }).catch((err) => {
   840                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   841                      evtDisconnect();
   842                      return;
   843                  })
   844              },
   845              function(err) {
   846                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   847                  evtDisconnect();
   848              })
   849  
   850          });
   851  }
   852  
   853  
   854  
   855  
   856  // invoke_query_simple
   857  function invoke_query_simple(freq) {
   858      inv_q++;
   859  
   860      getQueryRequest();
   861      chain.queryByChaincode(request_query)
   862      .then(
   863          function(response_payloads) {
   864              isExecDone('Query');
   865              if ( QDone != 1 ) {
   866                  setTimeout(function(){
   867                      invoke_query_simple(freq);
   868                  },freq);
   869              } else {
   870                  tCurr = new Date().getTime();
   871                  if (response_payloads) {
   872                      console.log('response_payloads length:', response_payloads.length);
   873                      for(let j = 0; j < response_payloads.length; j++) {
   874                          //console.log('[Nid:id=%d:%d key:%d] invoke_query_simple query result:', Nid, pid, inv_q, response_payloads[j].toString('utf8'));
   875                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8'));
   876                      }
   877                  } else {
   878                      console.log('response_payloads is null');
   879                  }
   880                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   881                  process.exit();
   882              }
   883          },
   884          function(err) {
   885              console.log('[[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   886              process.exit();
   887              return;
   888          })
   889      .catch(
   890          function(err) {
   891              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] %s failed: ', Nid, pid, channelName, org, transType,  err.stack ? err.stack : err);
   892              process.exit();
   893          }
   894      );
   895  
   896  }
   897  
   898  function execModeSimple() {
   899  
   900      // send proposal to endorser
   901      if ( transType.toUpperCase() == 'INVOKE' ) {
   902          tLocal = new Date().getTime();
   903          if ( runDur > 0 ) {
   904              tEnd = tLocal + runDur;
   905          }
   906          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeSimple] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal);
   907          if ( invokeType.toUpperCase() == 'MOVE' ) {
   908              var freq = 20000;
   909              if ( ccType == 'ccchecker' ) {
   910                  freq = 0;
   911              }
   912              invoke_move_simple(freq);
   913          } else if ( invokeType.toUpperCase() == 'QUERY' ) {
   914              invoke_query_simple(0);
   915          }
   916      } else {
   917          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeSimple] invalid transType= %s', Nid, pid, channelName, org, transType);
   918          evtDisconnect();
   919      }
   920  }
   921  
   922  var devFreq;
   923  function getRandomNum(min0, max0) {
   924          return Math.floor(Math.random() * (max0-min0)) + min0;
   925  }
   926  // invoke_move_const
   927  function invoke_move_const(freq) {
   928      inv_m++;
   929  
   930      var t1 = new Date().getTime();
   931      getMoveRequest();
   932  
   933      chain.sendTransactionProposal(request_invoke)
   934      .then(
   935          function(results) {
   936              var proposalResponses = results[0];
   937  
   938              getTxRequest(results);
   939              eventRegister(request_invoke.txId, function(sendPromise) {
   940  
   941                  var sendPromise = chain.sendTransaction(txRequest);
   942                  return Promise.all([sendPromise].concat(eventPromises))
   943                  .then((results) => {
   944                      //tCurr = new Date().getTime();
   945                      //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   946  
   947                      // hist output
   948                      if ( recHist == 'HIST' ) {
   949                          tCurr = new Date().getTime();
   950                          buff = Nid +':'+ pid + ':' + channelName +':' + org + ' ' + transType[0] + ':' + inv_m + ' time:'+ tCurr + '\n';
   951                          fs.appendFile(ofile, buff, function(err) {
   952                              if (err) {
   953                                 return console.log(err);
   954                              }
   955                          })
   956                      }
   957  
   958                      isExecDone('Move');
   959                      if ( IDone != 1 ) {
   960                          var freq_n=freq;
   961                          if ( devFreq > 0 ) {
   962                              freq_n=getRandomNum(freq-devFreq, freq+devFreq);
   963                          }
   964                          tCurr = new Date().getTime();
   965                          t1 = tCurr - t1;
   966                          setTimeout(function(){
   967                              invoke_move_const(freq);
   968                          },freq_n-t1);
   969                      } else {
   970                          tCurr = new Date().getTime();
   971                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
   972                          return;
   973                      }
   974                      //return results[0];
   975  
   976                  }).catch((err) => {
   977                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   978                      evtDisconnect();
   979                      return;
   980                  })
   981              },
   982              function(err) {
   983                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
   984                  evtDisconnect();
   985              })
   986  
   987          });
   988  }
   989  
   990  
   991  // invoke_query_const
   992  function invoke_query_const(freq) {
   993      inv_q++;
   994  
   995      getQueryRequest();
   996      chain.queryByChaincode(request_query)
   997      .then(
   998          function(response_payloads) {
   999              // output
  1000              if ( recHist == 'HIST' ) {
  1001                  tCurr = new Date().getTime();
  1002                  buff = Nid +':'+ pid + ':' + channelName +':' + org + ' ' + transType[0] + ':' + inv_m + ' time:'+ tCurr + '\n';
  1003                  fs.appendFile(ofile, buff, function(err) {
  1004                      if (err) {
  1005                         return console.log(err);
  1006                      }
  1007                  })
  1008              }
  1009              isExecDone('Query');
  1010              if ( QDone != 1 ) {
  1011                  var freq_n=getRandomNum(freq-devFreq, freq+devFreq);
  1012                  setTimeout(function(){
  1013                      invoke_query_const(freq);
  1014                  },freq_n);
  1015              } else {
  1016                  tCurr = new Date().getTime();
  1017                  for(let j = 0; j < response_payloads.length; j++) {
  1018                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8'));
  1019                  }
  1020                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1021                  process.exit();
  1022              }
  1023          },
  1024          function(err) {
  1025              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1026              process.exit();
  1027          })
  1028      .catch(
  1029          function(err) {
  1030              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] %s failed: ', Nid, pid, channelName, org, transType,  err.stack ? err.stack : err);
  1031              process.exit();
  1032          }
  1033      );
  1034  
  1035  }
  1036  function execModeConstant() {
  1037  
  1038      // send proposal to endorser
  1039      if ( transType.toUpperCase() == 'INVOKE' ) {
  1040          if (uiContent.constantOpt.recHist) {
  1041              recHist = uiContent.constantOpt.recHist.toUpperCase();
  1042          }
  1043          console.log('recHist: ', recHist);
  1044  
  1045          tLocal = new Date().getTime();
  1046          if ( runDur > 0 ) {
  1047              tEnd = tLocal + runDur;
  1048          }
  1049          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal);
  1050          var freq = parseInt(uiContent.constantOpt.constFreq);
  1051          ofile = 'ConstantResults'+Nid+'.txt';
  1052  
  1053          if (typeof( uiContent.constantOpt.devFreq ) == 'undefined') {
  1054              console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] devFreq undefined, set to 0', Nid, pid, channelName, org);
  1055              devFreq=0;
  1056          } else {
  1057              devFreq = parseInt(uiContent.constantOpt.devFreq);
  1058          }
  1059  
  1060          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] Constant Freq: %d ms, variance Freq: %d ms', Nid, pid, channelName, org, freq, devFreq);
  1061  
  1062          if ( invokeType.toUpperCase() == 'MOVE' ) {
  1063              if ( ccType == 'general' ) {
  1064                  if ( freq < 20000 ) {
  1065                      freq = 20000;
  1066                  }
  1067              }
  1068              invoke_move_const(freq);
  1069          } else if ( invokeType.toUpperCase() == 'QUERY' ) {
  1070              invoke_query_const(freq);
  1071          }
  1072      } else {
  1073          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] invalid transType= %s', Nid, pid, channelName, org, transType);
  1074          evtDisconnect();
  1075      }
  1076  }
  1077  
  1078  // mix mode
  1079  function invoke_move_mix(freq) {
  1080      inv_m++;
  1081  
  1082      getMoveRequest();
  1083  
  1084      chain.sendTransactionProposal(request_invoke)
  1085      .then(
  1086          function(results) {
  1087              var proposalResponses = results[0];
  1088  
  1089              getTxRequest(results);
  1090              eventRegister(request_invoke.txId, function(sendPromise) {
  1091  
  1092                  var sendPromise = chain.sendTransaction(txRequest);
  1093                  return Promise.all([sendPromise].concat(eventPromises))
  1094                  .then((results) => {
  1095                      //tCurr = new Date().getTime();
  1096                      //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1097  
  1098                      if ( IDone != 1 ) {
  1099                          setTimeout(function(){
  1100                              arg0--;
  1101                              invoke_query_mix(freq);
  1102                          },freq);
  1103                      } else {
  1104                          tCurr = new Date().getTime();
  1105                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1106                      //    return;
  1107                      }
  1108                      return results[0];
  1109  
  1110                  }).catch((err) => {
  1111                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1112                      evtDisconnect();
  1113                      return;
  1114                  })
  1115              },
  1116              function(err) {
  1117                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1118                  evtDisconnect();
  1119              })
  1120  
  1121          });
  1122  }
  1123  
  1124  // invoke_query_mix
  1125  function invoke_query_mix(freq) {
  1126      inv_q++;
  1127  
  1128      getQueryRequest();
  1129      chain.queryByChaincode(request_query)
  1130      .then(
  1131          function(response_payloads) {
  1132                  isExecDone('Move');
  1133                  if ( IDone != 1 ) {
  1134                      invoke_move_mix(freq);
  1135                  } else {
  1136                      for(let j = 0; j < response_payloads.length; j++) {
  1137                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8'));
  1138                      }
  1139                      tCurr = new Date().getTime();
  1140                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] completed %d Invoke(move) and %d invoke(query) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, inv_q, tCurr-tLocal, tLocal, tCurr);
  1141                      return;
  1142                  }
  1143          },
  1144          function(err) {
  1145              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1146              evtDisconnect();
  1147              return;
  1148          })
  1149      .catch(
  1150          function(err) {
  1151              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] %s failed: ', Nid, pid, channelName, org, transType,  err.stack ? err.stack : err);
  1152              evtDisconnect();
  1153          }
  1154      );
  1155  
  1156  }
  1157  function execModeMix() {
  1158  
  1159      // send proposal to endorser
  1160      if ( transType.toUpperCase() == 'INVOKE' ) {
  1161          // no need to check since a query is issued after every invoke
  1162          invokeCheck = 'FALSE';
  1163          tLocal = new Date().getTime();
  1164          if ( runDur > 0 ) {
  1165              tEnd = tLocal + runDur;
  1166          }
  1167          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] tStart %d, tEnd %d, tLocal %d', Nid, pid, channelName, org, tStart, tEnd, tLocal);
  1168          var freq = parseInt(uiContent.mixOpt.mixFreq);
  1169          if ( ccType == 'general' ) {
  1170              if ( freq < 20000 ) {
  1171                  freq = 20000;
  1172              }
  1173          }
  1174          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] Mix Freq: %d ms', Nid, pid, channelName, org, freq);
  1175          invoke_move_mix(freq);
  1176      } else {
  1177          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] invalid transType= %s', Nid, pid, channelName, org, transType);
  1178          evtDisconnect();
  1179      }
  1180  }
  1181  
  1182  
  1183  // invoke_move_latency
  1184  function invoke_move_proposal() {
  1185  
  1186      inv_m++;
  1187  
  1188      getMoveRequest();
  1189  
  1190      chain.sendTransactionProposal(request_invoke)
  1191      .then(
  1192          function(results) {
  1193              var proposalResponses = results[0];
  1194  
  1195              isExecDone('Move');
  1196              if ( IDone == 1 ) {
  1197                 tCurr = new Date().getTime();
  1198                 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_proposal] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1199                 evtDisconnect();
  1200                 return;
  1201              } else {
  1202                      invoke_move_proposal();
  1203                      return results[0];
  1204              }
  1205  
  1206  
  1207          },
  1208          function(err) {
  1209              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_proposal] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1210              evtDisconnect();
  1211          });
  1212  
  1213  
  1214  }
  1215  
  1216  
  1217  function execModeProposal() {
  1218  
  1219      // send proposal to endorser
  1220      if ( transType.toUpperCase() == 'INVOKE' ) {
  1221          tLocal = new Date().getTime();
  1222          if ( runDur > 0 ) {
  1223              tEnd = tLocal + runDur;
  1224          }
  1225          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal);
  1226          if ( invokeType.toUpperCase() == 'MOVE' ) {
  1227              var freq = 20000;
  1228              if ( ccType == 'ccchecker' ) {
  1229                  freq = 0;
  1230              }
  1231              invoke_move_latency();
  1232              invoke_move_proposal();
  1233          } else if ( invokeType.toUpperCase() == 'QUERY' ) {
  1234              console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] invalid invokeType= %s', Nid, pid, channelName, org, invokeType);
  1235              evtDisconnect();
  1236          }
  1237      } else {
  1238          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] invalid transType= %s', Nid, pid, channelName, org, transType);
  1239          evtDisconnect();
  1240      }
  1241  }
  1242  
  1243  // Burst mode vars
  1244  var burstFreq0;
  1245  var burstDur0;
  1246  var burstFreq1;
  1247  var burstDur1;
  1248  var tDur=[];
  1249  var tFreq=[];
  1250  var tUpd0;
  1251  var tUpd1;
  1252  var bFreq;
  1253  
  1254  function getBurstFreq() {
  1255  
  1256      tCurr = new Date().getTime();
  1257      //console.log('[Nid:id:chan:org=%d:%d:%s:%s, getBurstFreq] tCurr= %d', Nid, pid, channelName, org, tCurr);
  1258  
  1259      // set up burst traffic duration and frequency
  1260      if ( tCurr < tUpd0 ) {
  1261          bFreq = tFreq[0];
  1262      } else if ( tCurr < tUpd1 ) {
  1263          bFreq = tFreq[1];
  1264      } else {
  1265          tUpd0 = tCurr + tDur[0];
  1266          tUpd1 = tUpd0 + tDur[1];
  1267          bFreq = tFreq[0];
  1268      }
  1269  
  1270  }
  1271  
  1272  // invoke_move_burst
  1273  function invoke_move_burst() {
  1274      inv_m++;
  1275      // set up burst traffic duration and frequency
  1276      getBurstFreq();
  1277      //console.log('invoke_move_burst: inv_m: %d, bFreq: %d', inv_m, bFreq);
  1278  
  1279      getMoveRequest();
  1280  
  1281      chain.sendTransactionProposal(request_invoke)
  1282      .then(
  1283          function(results) {
  1284              var proposalResponses = results[0];
  1285  
  1286              getTxRequest(results);
  1287              eventRegister(request_invoke.txId, function(sendPromise) {
  1288  
  1289                  var sendPromise = chain.sendTransaction(txRequest);
  1290                  return Promise.all([sendPromise].concat(eventPromises))
  1291                  .then((results) => {
  1292                      //tCurr = new Date().getTime();
  1293                      //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1294  
  1295                      isExecDone('Move');
  1296                      if ( IDone != 1 ) {
  1297                          setTimeout(function(){
  1298                              invoke_move_burst();
  1299                          },bFreq);
  1300                      } else {
  1301                          tCurr = new Date().getTime();
  1302                          console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1303                          return;
  1304                      }
  1305                      //return results[0];
  1306  
  1307                  }).catch((err) => {
  1308                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1309                      evtDisconnect();
  1310                      return;
  1311                  })
  1312              },
  1313              function(err) {
  1314                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1315                  evtDisconnect();
  1316              })
  1317  
  1318          });
  1319  }
  1320  
  1321  
  1322  // invoke_query_burst
  1323  function invoke_query_burst() {
  1324      inv_q++;
  1325  
  1326      // set up burst traffic duration and frequency
  1327      getBurstFreq();
  1328  
  1329      getQueryRequest();
  1330      chain.queryByChaincode(request_query)
  1331      .then(
  1332          function(response_payloads) {
  1333              isExecDone('Query');
  1334              if ( QDone != 1 ) {
  1335                  setTimeout(function(){
  1336                      invoke_query_burst();
  1337                  },bFreq);
  1338              } else {
  1339                  tCurr = new Date().getTime();
  1340                  for(let j = 0; j < response_payloads.length; j++) {
  1341                      console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8'));
  1342                  }
  1343                  console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr);
  1344                  //return;
  1345              }
  1346          },
  1347          function(err) {
  1348              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err);
  1349              evtDisconnect();
  1350              return;
  1351          })
  1352      .catch(
  1353          function(err) {
  1354              console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] %s failed: ', Nid, pid, channelName, org, transType,  err.stack ? err.stack : err);
  1355              evtDisconnect();
  1356          }
  1357      );
  1358  
  1359  }
  1360  function execModeBurst() {
  1361  
  1362      // init TcertBatchSize
  1363      burstFreq0 = parseInt(uiContent.burstOpt.burstFreq0);
  1364      burstDur0 = parseInt(uiContent.burstOpt.burstDur0);
  1365      burstFreq1 = parseInt(uiContent.burstOpt.burstFreq1);
  1366      burstDur1 = parseInt(uiContent.burstOpt.burstDur1);
  1367      tFreq = [burstFreq0, burstFreq1];
  1368      tDur  = [burstDur0, burstDur1];
  1369  
  1370      console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] Burst setting: tDur =',Nid, pid, channelName, org, tDur);
  1371      console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] Burst setting: tFreq=',Nid, pid, channelName, org, tFreq);
  1372  
  1373      // get time
  1374      tLocal = new Date().getTime();
  1375  
  1376      tUpd0 = tLocal+tDur[0];
  1377      tUpd1 = tLocal+tDur[1];
  1378      bFreq = tFreq[0];
  1379  
  1380      // send proposal to endorser
  1381      if ( transType.toUpperCase() == 'INVOKE' ) {
  1382          tLocal = new Date().getTime();
  1383          if ( runDur > 0 ) {
  1384              tEnd = tLocal + runDur;
  1385          }
  1386          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal);
  1387          if ( invokeType.toUpperCase() == 'MOVE' ) {
  1388              invoke_move_burst();
  1389          } else if ( invokeType.toUpperCase() == 'QUERY' ) {
  1390              invoke_query_burst();
  1391          }
  1392      } else {
  1393          console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] invalid transType= %s', Nid, pid, channelName, org, transType);
  1394          evtDisconnect();
  1395      }
  1396  }
  1397  
  1398  function sleep(ms) {
  1399  	return new Promise(resolve => setTimeout(resolve, ms));
  1400  }
  1401  
  1402  function evtDisconnect() {
  1403      for ( i=0; i<eventHubs.length; i++) {
  1404          if (eventHubs[i] && eventHubs[i].isconnected()) {
  1405              logger.info('Disconnecting the event hub: %d', i);
  1406              eventHubs[i].disconnect();
  1407          }
  1408      }
  1409  }
  1410