embark-area-51/lib/modules/blockchain_process/simulator.js

84 lines
3.3 KiB
JavaScript
Raw Normal View History

const path = require('path');
2018-08-12 22:10:49 +00:00
const pkgUp = require('pkg-up');
2017-03-29 17:50:05 +00:00
let shelljs = require('shelljs');
let proxy = require('./proxy');
const Ipc = require('../../core/ipc');
const constants = require('../../constants.json');
const {defaultHost, dockerHostSwap} = require('../../utils/host');
const fs = require('../../core/fs.js');
2018-06-11 20:40:14 +00:00
2017-03-30 11:12:39 +00:00
class Simulator {
constructor(options) {
this.blockchainConfig = options.blockchainConfig;
this.logger = options.logger;
2017-03-30 11:12:39 +00:00
}
2018-06-11 20:43:08 +00:00
run(options) {
2018-06-11 13:02:52 +00:00
let cmds = [];
const ganache_main = require.resolve('ganache-cli', {paths: fs.embarkPath('node_modules')});
2018-08-12 22:10:49 +00:00
const ganache_json = pkgUp.sync(path.dirname(ganache_main));
const ganache_root = path.dirname(ganache_json);
const ganache_bin = require(ganache_json).bin;
let ganache;
if (typeof ganache_bin === 'string') {
ganache = path.join(ganache_root, ganache_bin);
} else {
ganache = path.join(ganache_root, ganache_bin['ganache-cli']);
}
2018-06-07 19:13:35 +00:00
let useProxy = this.blockchainConfig.proxy || false;
let host = (dockerHostSwap(options.host || this.blockchainConfig.rpcHost) || defaultHost);
2018-06-07 17:03:04 +00:00
let port = (options.port || this.blockchainConfig.rpcPort || 8545);
2018-06-11 20:43:08 +00:00
cmds.push("-p " + (port + (useProxy ? constants.blockchain.servicePortOnProxy : 0)));
2018-07-12 21:04:19 +00:00
cmds.push("-h " + host);
2017-12-27 22:48:33 +00:00
cmds.push("-a " + (options.numAccounts || 10));
cmds.push("-e " + (options.defaultBalance || 100));
cmds.push("-l " + (options.gasLimit || 8000000));
// adding mnemonic only if it is defined in the blockchainConfig or options
let simulatorMnemonic = this.blockchainConfig.simulatorMnemonic || options.simulatorMnemonic;
if (simulatorMnemonic) {
cmds.push("--mnemonic \"" + (simulatorMnemonic) +"\"");
}
// as ganache-cli documentation explains, the simulatorAccounts configuration overrides a mnemonic
let simulatorAccounts = this.blockchainConfig.simulatorAccounts || options.simulatorAccounts;
if (simulatorAccounts && simulatorAccounts.length > 0) {
let web3 = new (require('web3'))();
let AccountParser = require('../../utils/accountParser.js');
let parsedAccounts = AccountParser.parseAccountsConfig(simulatorAccounts, web3, this.logger);
parsedAccounts.forEach((account) => {
let cmd = '--account="' + account.privateKey + ','+account.hexBalance + '"';
cmds.push(cmd);
});
}
// adding blocktime only if it is defined in the blockchainConfig or options
let simulatorBlocktime = this.blockchainConfig.simulatorBlocktime || options.simulatorBlocktime;
if (simulatorBlocktime) {
cmds.push("-b \"" + (simulatorBlocktime) +"\"");
}
// Setting up network id for simulator from blockchainConfig or options.
// Otherwise ganache-cli would make random network id.
let networkId = this.blockchainConfig.networkId || options.networkId;
if (networkId) { // Don't handle networkId=="0" because it is not a valid networkId for ganache-cli.
cmds.push("--networkId " + networkId);
}
const programName = 'ganache-cli';
const program = ganache;
2018-07-11 15:32:47 +00:00
console.log(`running: ${programName} ${cmds.join(' ')}`);
2018-06-07 19:13:35 +00:00
shelljs.exec(`${program} ${cmds.join(' ')}`, {async : true});
if(useProxy){
2018-06-11 20:40:14 +00:00
let ipcObject = new Ipc({ipcRole: 'client'});
proxy.serve(ipcObject, host, port, false);
2018-06-07 19:13:35 +00:00
}
2017-03-30 11:12:39 +00:00
}
}
module.exports = Simulator;