diff --git a/lib/services/header/index.js b/lib/services/header/index.js index ee36840b..416337c6 100644 --- a/lib/services/header/index.js +++ b/lib/services/header/index.js @@ -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) {