Changed to a more traditional reorg detection.

This commit is contained in:
Chris Kleeschulte 2017-09-27 14:06:36 -04:00
parent 0c75879084
commit 74542a3e7f
No known key found for this signature in database
GPG Key ID: 33195D27EF6BDB7F

View File

@ -260,7 +260,7 @@ HeaderService.prototype._queueBlock = function(block) {
return self._handleError(err);
}
log.info('Header Service: completed processing block: ' + block.rhash() + ' prev hash: ' + bcoin.util.revHex(block.prevBlock));
log.debug('Header Service: completed processing block: ' + block.rhash() + ' prev hash: ' + bcoin.util.revHex(block.prevBlock));
});
@ -289,18 +289,30 @@ HeaderService.prototype._processBlocks = function(block, callback) {
};
HeaderService.prototype._findCommonAncestor = function(block, callback) {
var self = this;
self.getBlockHeader(bcoin.util.revHex(block.prevBlock), function(err, header) {
if (err) {
return callback(err);
}
callback(null, header);
});
};
HeaderService.prototype._persistHeader = function(block, callback) {
var self = this;
self._detectReorg(block, function(err, commonHeader) {
if (!self._detectReorg(block)) {
return self._syncBlock(block, callback);
}
if (err) {
return callback(err);
}
self._findCommonAncestor(block, function(err, commonHeader) {
if (!commonHeader) {
return self._syncBlock(block, callback);
if (err || !commonHeader) {
return callback(err ||
new Error('Header Service: a common header could not be found between the new block: ' +
block.rhash() + ' and the current tip: ' + self._tip.hash));
}
self._handleReorg(block, commonHeader, function(err) {
@ -310,6 +322,7 @@ HeaderService.prototype._persistHeader = function(block, callback) {
}
self._syncBlock(block, callback);
});
});
@ -335,7 +348,6 @@ HeaderService.prototype._syncBlock = function(block, callback) {
var dbOps = self._getDBOpForLastHeader(header);
dbOps = dbOps.concat(self._onHeader(header));
console.log(dbOps);
self._saveHeaders(dbOps, callback);
};
@ -579,35 +591,8 @@ HeaderService.prototype._getHeader = function(height, hash, callback) {
};
HeaderService.prototype._detectReorg = function(block, callback) {
var self = this;
var prevHash = bcoin.util.revHex(block.prevBlock);
var nextBlock = prevHash === self._lastHeader.hash;
// common case
if (nextBlock) {
return callback(null, false);
}
self.getBlockHeader(prevHash, function(err, header) {
if (err) {
return callback(err);
}
if (header) {
return callback(null, header);
}
// this should be very rare
log.warn('Header Service: Block: ' + block.rhash() + ' references: ' + prevHash +
' as its previous block, yet we have not stored this block in our data set, thus ignoring this block.');
callback(null, false);
});
HeaderService.prototype._detectReorg = function(block) {
return bcoin.util.revHex(block.prevBlock) !== this._lastHeader.hash;
};
HeaderService.prototype._handleReorg = function(block, commonHeader, callback) {