Changed to a more traditional reorg detection.
This commit is contained in:
parent
0c75879084
commit
74542a3e7f
@ -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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user