diff --git a/bin/node b/bin/node index 676bd213..3d1b677b 100755 --- a/bin/node +++ b/bin/node @@ -15,7 +15,8 @@ var node = new bcoin.fullnode({ listen: process.argv.indexOf('--listen') !== -1, selfish: process.argv.indexOf('--selfish') !== -1, broadcast: process.argv.indexOf('--broadcast') !== -1, - mine: process.argv.indexOf('--mine') !== -1 + mine: process.argv.indexOf('--mine') !== -1, + parallel: process.argv.indexOf('--parallel') !== -1 }); node.on('error', function(err) { @@ -30,15 +31,24 @@ node.open(function(err) { if (err) throw err; - if (node.options.mine) { - if (bcoin.network.get().type !== 'regtest') - node.pool.connect(); - node.miner.start(); - if (node.chain.isFull()) - node.startSync(); + if (!node.options.mine) { + node.startSync(); return; } + if (node.network.type === 'regtest') { + node.miner.start(); + return; + } + + node.pool.connect(); node.startSync(); + + if (node.chain.isFull()) { + node.miner.start(); + return; + } + + node.chain.once('full', node.miner.start.bind(node.miner)); }); }); diff --git a/lib/bcoin/fullnode.js b/lib/bcoin/fullnode.js index ac742c1a..ab2320b4 100644 --- a/lib/bcoin/fullnode.js +++ b/lib/bcoin/fullnode.js @@ -96,7 +96,8 @@ Fullnode.prototype._init = function _init() { chain: this.chain, mempool: this.mempool, address: this.options.payoutAddress, - coinbaseFlags: this.options.coinbaseFlags + coinbaseFlags: this.options.coinbaseFlags, + parallel: this.options.parallel }); this.walletdb = new bcoin.walletdb({ diff --git a/lib/bcoin/miner.js b/lib/bcoin/miner.js index 6ea7c1d1..7cc96105 100644 --- a/lib/bcoin/miner.js +++ b/lib/bcoin/miner.js @@ -62,7 +62,7 @@ function Miner(options) { if (bcoin.useWorkers) { this.workerPool = new bcoin.workers({ network: this.network, - size: 1, + size: this.options.parallel ? 2 : 1, timeout: -1 }); } @@ -122,17 +122,14 @@ Miner.prototype._init = function _init() { }); this.on('block', function(block) { - bcoin.debug( - 'Found block: %d (%s)', - block.height, - block.rhash); // Emit the block hex as a failsafe (in case we can't send it) - bcoin.debug('Raw: %s', block.render().toString('hex')); + bcoin.debug('Found block: %d (%s).', block.height, block.rhash); + bcoin.debug('Raw: %s', block.toRaw('hex')); }); this.on('status', function(stat) { bcoin.debug( - 'hashrate=%dkhs hashes=%d target=%d height=%d best=%s', + 'Miner: hashrate=%dkhs hashes=%d target=%d height=%d best=%s', stat.hashrate / 1000 | 0, stat.hashes, stat.target, @@ -274,6 +271,7 @@ Miner.prototype.createBlock = function createBlock(version, callback) { address: self.address, coinbaseFlags: self.coinbaseFlags, witness: self.chain.segwitActive, + parallel: self.options.parallel, dsha256: self.dsha256 }); @@ -630,9 +628,23 @@ MinerBlock.prototype.mineSync = function mineSync() { */ MinerBlock.prototype.mineAsync = function mine(callback) { + var self = this; + if (!this.workerPool) return this.mine(callback); + function done(err, block) { + self.workerPool.destroy(); + callback(err, block); + } + + if (this.options.parallel) { + done = utils.once(done); + this.workerPool.mine(this, done); + this.workerPool.mine(this, done); + return; + } + this.workerPool.mine(this, callback); }; diff --git a/lib/bcoin/workers.js b/lib/bcoin/workers.js index b5409df0..c3785201 100644 --- a/lib/bcoin/workers.js +++ b/lib/bcoin/workers.js @@ -302,8 +302,16 @@ function Worker(pool, id) { self.emit('exit', -1, null); }); - this.child.stdout.on('data', function(data) { - self.emit('data', data); + this.child.stdin.on('error', function(err) { + self.emit('error', err); + }); + + this.child.stdout.on('error', function(err) { + self.emit('error', err); + }); + + this.child.stderr.on('error', function(err) { + self.emit('error', err); }); this.child.stderr.setEncoding('utf8'); @@ -467,6 +475,10 @@ function Master(id, options) { process.stdin.on('data', function(data) { self.emit('data', data); }); + // Nowhere to send these errors: + process.stdin.on('error', utils.nop); + process.stdout.on('error', utils.nop); + process.stderr.on('error', utils.nop); } this.on('data', function(data) { @@ -533,7 +545,7 @@ Master.prototype.sendEvent = function sendEvent() { * @param {...String} args */ -Master.prototype.log = function log() { +Master.prototype.debug = function debug() { var args, msg; if (!this.options.debug) @@ -555,6 +567,15 @@ Master.prototype.log = function log() { process.stderr.write(msg + '\n'); }; +/** + * Write an error as a debug message. + * @param {Error} err + */ + +Master.prototype.error = function error(err) { + this.debug(err.message); +}; + /** * Destroy the worker. */ @@ -574,11 +595,13 @@ Master.prototype.destroy = function destroy() { Master.listen = function listen(id, options) { var master = new Master(id, options); - var log = master.log.bind(master); + var debug = master.debug.bind(master); + var error = master.error.bind(master); - bcoin.debug = log; - utils.print = log; - utils.error = log; + bcoin.debug = debug; + bcoin.error = error; + utils.print = debug; + utils.error = debug; master.on('error', function(err) { bcoin.debug('Master error: %s', err.message); @@ -648,7 +671,7 @@ jobs.mine = function mine(data) { }); attempt.on('status', function(stat) { bcoin.debug( - 'hashrate=%dkhs hashes=%d target=%d height=%d best=%s', + 'Miner: hashrate=%dkhs hashes=%d target=%d height=%d best=%s', stat.hashrate / 1000 | 0, stat.hashes, stat.target,