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); 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) { HeaderService.prototype._persistHeader = function(block, callback) {
var self = this; var self = this;
self._detectReorg(block, function(err, commonHeader) { if (!self._detectReorg(block)) {
return self._syncBlock(block, callback);
}
if (err) { self._findCommonAncestor(block, function(err, commonHeader) {
return callback(err);
}
if (!commonHeader) { if (err || !commonHeader) {
return self._syncBlock(block, callback); 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) { self._handleReorg(block, commonHeader, function(err) {
@ -310,6 +322,7 @@ HeaderService.prototype._persistHeader = function(block, callback) {
} }
self._syncBlock(block, callback); self._syncBlock(block, callback);
}); });
}); });
@ -335,7 +348,6 @@ HeaderService.prototype._syncBlock = function(block, callback) {
var dbOps = self._getDBOpForLastHeader(header); var dbOps = self._getDBOpForLastHeader(header);
dbOps = dbOps.concat(self._onHeader(header)); dbOps = dbOps.concat(self._onHeader(header));
console.log(dbOps);
self._saveHeaders(dbOps, callback); self._saveHeaders(dbOps, callback);
}; };
@ -579,35 +591,8 @@ HeaderService.prototype._getHeader = function(height, hash, callback) {
}; };
HeaderService.prototype._detectReorg = function(block, callback) { HeaderService.prototype._detectReorg = function(block) {
return bcoin.util.revHex(block.prevBlock) !== this._lastHeader.hash;
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._handleReorg = function(block, commonHeader, callback) { HeaderService.prototype._handleReorg = function(block, commonHeader, callback) {