diff --git a/lib/services/block/index.js b/lib/services/block/index.js index cc062564..1c6f98eb 100644 --- a/lib/services/block/index.js +++ b/lib/services/block/index.js @@ -49,7 +49,7 @@ inherits(BlockService, BaseService); BlockService.dependencies = [ 'p2p', 'db', 'header' ]; -BlockService.MAX_BLOCKS = 1; +BlockService.MAX_BLOCKS = 3 // --- public prototype functions BlockService.prototype.getAPIMethods = function() { diff --git a/lib/services/header/index.js b/lib/services/header/index.js index 79a4adef..f48ea3d6 100644 --- a/lib/services/header/index.js +++ b/lib/services/header/index.js @@ -10,6 +10,7 @@ var async = require('async'); var BN = require('bn.js'); var consensus = require('bcoin').consensus; var assert = require('assert'); +var constants = require('../../constants'); var HeaderService = function(options) { @@ -23,6 +24,7 @@ var HeaderService = function(options) { this.subscriptions = {}; this.subscriptions.block = []; + this.GENESIS_HASH = constants.BITCOIN_GENESIS_HASH[this.node.getNetworkName()]; }; inherits(HeaderService, BaseService); @@ -90,7 +92,23 @@ HeaderService.prototype.start = function(callback) { }, function(tip, next) { self._tip = tip; - self._originalTip = Object.assign(self._tip, {}); + if (self._tip.height === 0) { + self._headers.set(self.GENESIS_HASH, { + hash: self.GENESIS_HASH, + height: 0, + chainwork: HeaderService.STARTING_CHAINWORK, + version: 1, + prevHash: new Array(65).join('0'), + timestamp: 1231006505, + nonce: 2083236893, + bits: 0x1d00ffff, + merkleRoot: '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b' + }); + } + self._originalTip = { + height: self._tip.height, + hash: self._tip.hash + }; next(); }, function(next) { @@ -121,12 +139,14 @@ HeaderService.prototype._startSubscriptions = function() { } this._subscribed = true; + if (!this._bus) { this._bus = this.node.openBus({remoteAddress: 'localhost-header'}); } this._bus.on('p2p/headers', this._onHeaders.bind(this)); this._bus.on('p2p/block', this._onBlock.bind(this)); + this._bus.subscribe('p2p/headers'); this._bus.subscribe('p2p/block'); @@ -215,7 +235,30 @@ HeaderService.prototype._onHeaders = function(headers, convert) { }); self._db._store.batch(dbOps, function() { - self._sync(); + + if (self._tip.height < self._bestHeight) { + self._sync(); + return; + } + + log.debug('Header Service: download complete.'); + + // have we reorg'ed since we've been shutdown? + if (self._originalTip.height > 0) { + + var headerHash = self._headers.getIndex(self._originalTip.height).hash; + console.log(headerHash, self._originalTip, self._tip, self._headers.getIndex(0)); + + if (self._originalTip.hash !== headerHash) { + + self.emit('reorg', headerHash, self._headers); + return; + + } + } + + + self.emit('headers', self._headers); }); }; @@ -251,29 +294,12 @@ HeaderService.prototype._startSync = function() { HeaderService.prototype._sync = function() { - if (this._tip.height < this._bestHeight) { log.debug('Header Service: download progress: ' + this._tip.height + '/' + - this._numNeeded + ' (' + (this._tip.height / this._numNeeded*100).toFixed(2) + '%)'); + this._bestHeight + ' (' + (this._tip.height / this._bestHeight*100).toFixed(2) + '%)'); this._p2p.getHeaders({ startHash: this._tip.hash }); - return; - } - - log.debug('Header Service: download complete.'); - - // have we reorg'ed since we've been shutdown? - var headerHash = this._headers.getIndex(this._originalTip.height).hash; - - if (this._originalTip.hash !== headerHash) { - - this.emit('reorg', headerHash, this._headers); - return; - - } - - this.emit('headers', this._headers); };