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);
|
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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user