headers sync.

This commit is contained in:
Christopher Jeffrey 2016-05-23 00:49:52 -07:00
parent 373e474f59
commit 8c8b62a57f
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
4 changed files with 37 additions and 22 deletions

View File

@ -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
});

View File

@ -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;

View File

@ -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
});

View File

@ -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.'));
};
/**