From 8c8b62a57f07b84d91a2091ba75942d328e6769f Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Mon, 23 May 2016 00:49:52 -0700 Subject: [PATCH] headers sync. --- bin/node | 2 +- lib/bcoin/errors.js | 15 +++++++++------ lib/bcoin/fullnode.js | 2 +- lib/bcoin/pool.js | 40 ++++++++++++++++++++++++++-------------- 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/bin/node b/bin/node index 8d0ac655..24c44dcc 100755 --- a/bin/node +++ b/bin/node @@ -14,7 +14,7 @@ var node = new bcoin.fullnode({ useCheckpoints: process.argv.indexOf('--checkpoints') !== -1, listen: process.argv.indexOf('--listen') !== -1, selfish: process.argv.indexOf('--selfish') !== -1, - broadcast: process.argv.indexOf('--broadcast') !== -1, + headers: process.argv.indexOf('--headers') !== -1, mine: process.argv.indexOf('--mine') !== -1, parallel: process.argv.indexOf('--parallel') !== -1 }); diff --git a/lib/bcoin/errors.js b/lib/bcoin/errors.js index adaac1ae..1f82a6b2 100644 --- a/lib/bcoin/errors.js +++ b/lib/bcoin/errors.js @@ -17,7 +17,7 @@ var constants = bcoin.protocol.constants; * @global * @constructor * @extends Error - * @param {Block|TX} object + * @param {Block|TX} msg * @param {String} code - Reject packet ccode. * @param {String} reason - Reject packet reason. * @param {Number} score - Ban score increase @@ -29,7 +29,7 @@ var constants = bcoin.protocol.constants; * @property {String} message */ -function VerifyError(object, code, reason, score) { +function VerifyError(msg, code, reason, score) { Error.call(this); if (Error.captureStackTrace) @@ -37,11 +37,14 @@ function VerifyError(object, code, reason, score) { this.type = 'VerifyError'; - this.hash = object.hash(); - this.height = object.height; + this.hash = msg.hash(); + this.height = msg.height; - if (object.getCoinbaseHeight && this.height === -1) - this.height = object.getCoinbaseHeight(); + if (msg.getCoinbaseHeight && this.height === -1) + this.height = msg.getCoinbaseHeight(); + + if (score == null) + score = -1; this.code = code; this.reason = score === -1 ? null : reason; diff --git a/lib/bcoin/fullnode.js b/lib/bcoin/fullnode.js index ab2320b4..8d5e0d81 100644 --- a/lib/bcoin/fullnode.js +++ b/lib/bcoin/fullnode.js @@ -86,7 +86,7 @@ Fullnode.prototype._init = function _init() { mempool: this.mempool, witness: this.network.witness, selfish: this.options.selfish, - broadcast: this.options.broadcast, + headers: this.options.headers, spv: false }); diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index 0750bbd4..92e8bb59 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -690,11 +690,16 @@ Pool.prototype._handleHeaders = function _handleHeaders(headers, peer, callback) utils.forEachSerial(headers, function(header, next) { var hash = header.hash('hex'); - if (last && header.prevBlock !== last) + if (last && header.prevBlock !== last) { + peer.sendReject(block, 'invalid', 'bad-prevblk', 100); return next(new Error('Bad header chain.')); + } - if (!header.verify(ret)) + if (!header.verify(ret)) { + peer.sendReject(block, 'invalid', ret.reason, 100); + self.rejects.add(header.hash()); return next(new VerifyError(header, 'invalid', ret.reason, ret.score)); + } last = hash; @@ -838,21 +843,28 @@ Pool.prototype._handleBlock = function _handleBlock(block, peer, callback) { return callback(err); } - if (err.score >= 0) + if (err.score !== -1) peer.sendReject(block, err.code, err.reason, err.score); - self.rejects.add(block.hash()); - - if (err.reason === 'bad-prevblk' && peer === self.peers.load) { - self.resolveOrphan(peer, null, block.hash('hex'), function(e) { - self.scheduleRequests(peer); - return callback(e || err); - }); - return; + if (err.reason === 'bad-prevblk') { + if (self.options.headers) { + peer.setMisbehavior(10); + peer.destroy(); + return callback(err); + } + if (peer === self.peers.load) { + self.resolveOrphan(peer, null, block.hash('hex'), function(e) { + self.scheduleRequests(peer); + return callback(e || err); + }); + return; + } + self.scheduleRequests(peer); + return callback(err); } + self.rejects.add(block.hash()); self.scheduleRequests(peer); - return callback(err); } @@ -1078,7 +1090,7 @@ Pool.prototype._handleTX = function _handleTX(tx, peer, callback) { addMempool(tx, function(err) { if (err) { if (err.type === 'VerifyError') { - if (err.score >= 0) + if (err.score !== -1) peer.sendReject(tx, err.code, err.reason, err.score); self.rejects.add(tx.hash()); return callback(err); @@ -2109,7 +2121,7 @@ function LoadRequest(pool, peer, type, hash, callback) { */ LoadRequest.prototype.destroy = function destroy() { - this.finish(new Error('Timeout or closed.')); + return this.finish(new Error('Destroyed.')); }; /**