From acfbef8a333f68ba89200f0fb920a530e017a466 Mon Sep 17 00:00:00 2001 From: eordano Date: Tue, 7 Apr 2015 16:08:46 -0300 Subject: [PATCH] Reorgs and sync --- lib/node.js | 57 ++++++++++++++++++++++++++++++------------- lib/services/block.js | 5 ++-- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/lib/node.js b/lib/node.js index 3fc762eb..b89ef2d8 100644 --- a/lib/node.js +++ b/lib/node.js @@ -35,7 +35,29 @@ var BitcoreNode = function(bus, networkMonitor, blockService, transactionService this.transactionService = transactionService; this.blockService = blockService; - this.bus.register(bitcore.Block, this.blockService.onBlock.bind(this.blockService)); + this.blockCache = {}; + + this.bus.register(bitcore.Block, function(block) { + + var prevHash = bitcore.util.buffer.reverse(block.header.prevHash).toString('hex'); + self.blockCache[block.hash] = block; + + if (!self.blockchain.hasData(prevHash)) { + self.networkMonitor.requestBlocks(self.blockchain.getBlockLocator()); + return; + } + + var blockchainChanges = self.blockchain.proposeNewBlock(block); + Promise.series(blockchainChanges.unconfirmed.map(function(hash) { + return self.blockService.unconfirm(self.blockCache[hash]); + })) + .then(Promise.series(blockchainChanges.confirmed.map(function(hash) { + return self.blockService.confirm(self.blockCache[hash]); + }))) + .then(function() { + self.networkMonitor.requestBlocks(self.blockchain.getBlockLocator()); + }); + }); this.bus.onAny(function(value) { self.emit(this.event, value); @@ -82,8 +104,18 @@ BitcoreNode.create = function(opts) { }; BitcoreNode.prototype.start = function() { - this.sync(); - this.networkMonitor.start(); + var self = this; + this.blockService.getBlockchain().then(function(blockchain) { + if (!blockchain) { + self.blockchain = new BlockChain(); + self.blockchain.setTip(genesis); + } + self.sync(); + self.networkMonitor.start(); + }); + this.networkMonitor.on('stop', function() { + self.blockService.saveBlockchain(self.blockchain); + }); }; BitcoreNode.prototype.stop = function() { @@ -92,24 +124,15 @@ BitcoreNode.prototype.stop = function() { BitcoreNode.prototype.sync = function() { - var genesis = bitcore.Block.fromBuffer(genesisBlocks[bitcore.Networks.defaultNetwork.name]); var self = this; this.networkMonitor.on('ready', function() { self.blockService.getBlockchain().then(function(blockchain) { - if (blockchain) { - self.blockchain = blockchain; - } else { - self.blockchain = new BlockChain(); - self.blockchain.setTip(genesis); - } - self.networkMonitor.requestBlocks(self.blockchain.tip); - }) - .catch(function(err) { - self.networkMonitor.stop(); - throw err; - }); + self.networkMonitor.requestBlocks(self.blockchain.getBlockLocator()); + }).catch(function(err) { + self.networkMonitor.stop(); + throw err; + }); }); }; - module.exports = BitcoreNode; diff --git a/lib/services/block.js b/lib/services/block.js index 3c614035..9a6a0680 100644 --- a/lib/services/block.js +++ b/lib/services/block.js @@ -226,9 +226,8 @@ BlockService.prototype.onBlock = function(block) { * @param {bitcore.Block} block * @return {Promise} a promise of the same block, for chaining */ -BlockService.prototype.save = function(block) { +BlockService.prototype.unconfirm = function(block) { // TODO: unconfirm previous tip, confirm new tip. - return this._confirmBlock(block); }; @@ -238,7 +237,7 @@ BlockService.prototype.save = function(block) { * @param {bitcore.Block} block * @return {Promise} a promise of the same block, for chaining */ -BlockService.prototype._confirmBlock = function(block) { +BlockService.prototype.confirm = function(block) { $.checkArgument(block instanceof bitcore.Block); var self = this;