From 8121f52c38c7a03157323c5f755177b1273b05e3 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 26 Mar 2015 12:57:45 -0300 Subject: [PATCH] WIP --- lib/networkmonitor.js | 18 ++++++------- lib/node.js | 11 ++++---- lib/services/block.js | 61 +++++++++++++++++++++++-------------------- package.json | 1 + 4 files changed, 48 insertions(+), 43 deletions(-) diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 210c6452..2d161614 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -45,20 +45,18 @@ NetworkMonitor.prototype.setupPeer = function(peer) { peer.on('tx', function(m) { self.bus.process(m.transaction) .catch(function(err) { - self.stop(err); + self.abort(err); }); - //.catch(self.stop.bind(self)); }); peer.on('block', function(m) { self.bus.process(m.block) .catch(function(err) { - self.stop(err); + self.abort(err); }); - //.catch(self.stop.bind(self)); }); peer.on('error', function(err) { self.emit('error', err); - self.stop(err); + self.abort(err); }); peer.on('disconnect', function() { self.emit('disconnect'); @@ -70,11 +68,13 @@ NetworkMonitor.prototype.start = function() { this.peer.connect(); }; NetworkMonitor.prototype.stop = function(reason) { - console.trace(); this.peer.disconnect(); - if (reason) { - throw reason; - } + console.log('Stopping network, reason:', reason); +}; +NetworkMonitor.prototype.abort = function(reason) { + this.peer.disconnect(); + console.log('Unexpected error, aborting:', reason); + process.exit(1); }; NetworkMonitor.prototype.syncFrom = function(start) { diff --git a/lib/node.js b/lib/node.js index 36c8f309..37ee068f 100644 --- a/lib/node.js +++ b/lib/node.js @@ -52,7 +52,7 @@ BitcoreNode.create = function(opts) { var networkMonitor = NetworkMonitor.create(bus, opts.NetworkMonitor); - var database = new LevelUp(opts.LevelUp || config.get('LevelUp')); + var database = Promise.promisifyAll(new LevelUp(opts.LevelUp || config.get('LevelUp'))); var rpc = Promise.promisifyAll(new RPC(config.get('RPC'))); var transactionService = new TransactionService({ @@ -79,20 +79,21 @@ BitcoreNode.prototype.start = function() { }; BitcoreNode.prototype.sync = function() { - var genesis = bitcore.Networks.defaultNetwork.genesis; + var genesis = bitcore.Block.fromBuffer(bitcore.Networks.defaultNetwork.genesis); var self = this; this.networkMonitor.on('ready', function() { console.log('ready'); self.blockService.getLatest().then(function(latest) { - var start = genesis; + var start = genesis.hash; + console.log('latest', latest); if (latest) { - start = latest.rawHash; + start = latest.hash; } console.log('Starting sync from', start); self.networkMonitor.syncFrom(start); }) .catch(function(err) { - self.networkMonitor.disconnect(); + self.networkMonitor.stop(); throw err; }); }); diff --git a/lib/services/block.js b/lib/services/block.js index 41e3d73a..90e8d8c9 100644 --- a/lib/services/block.js +++ b/lib/services/block.js @@ -183,16 +183,16 @@ BlockService.prototype.getBlockByHeight = function(height) { return Promise.try(function() { - return self.rpc.getBlockHashAsync(height); + return self.rpc.getBlockHashAsync(height); - }) - .catch(blockNotFound) - .then(function(result) { + }) + .catch(blockNotFound) + .then(function(result) { - var blockHash = result.result; - return self.getBlock(blockHash); + var blockHash = result.result; + return self.getBlock(blockHash); - }); + }); }; /** @@ -227,7 +227,7 @@ BlockService.prototype.onBlock = function(block) { var events = []; return this.save(block) .then(function(block) { - return undefined; + console.log('block', block.id, 'saved'); block.transactions.forEach(function(tx) { events.push(tx); }); @@ -261,38 +261,41 @@ BlockService.prototype._confirmBlock = function(block) { var ops = []; return this.writeLock().then(function() { + return self._setNextBlock(ops, block.header.prevHash, block); - return self._setNextBlock(ops, block.header.prevHash, block); + }).then(function() { - }).then(function() { + if (block.header.prevHash.toString('hex') !== NULLBLOCKHASH) { + return self.getBlock(block.header.prevHash, { + withoutTransactions: true + }); + } else { + return GENESISPARENT; + } - if (block.header.prevHash.toString('hex') !== NULLBLOCKHASH) { - return self.getBlock(block.header.prevHash, { - withoutTransactions: true - }); - } else { - return GENESISPARENT; - } + }).then(function(parent) { - }).then(function(parent) { + return self._setBlockHeight(ops, block, parent.height + 1); - return self._setBlockHeight(ops, block, parent.height + 1); + }).then(function() { - }).then(function() { + return self._setBlockByTs(ops, block); - return self._setBlockByTs(ops, block); + }).then(function() { - }).then(function() { + return Promise.all(block.transactions.map(function(transaction) { + return self.transactionService._confirmTransaction(ops, block, transaction); + })); - return Promise.all(block.transactions.map(function(transaction) { - return self.transactionService._confirmTransaction(ops, block, transaction); - })); + }).then(function() { - }).then(function() { + return self.database.batchAsync(ops); - return self.database.batchAsync(ops); - - }).then(this.unlock.bind(this)); + }) + .then(this.unlock.bind(this)) + .then(function() { + return block; + }); }; BlockService.prototype._setNextBlock = function(ops, prevBlockHash, block) { diff --git a/package.json b/package.json index 9eec33e2..8799a9b2 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "glob": "*", "js-yaml": "^3.2.7", "leveldown": "^1.0.1", + "levelup": "git://github.com/rvagg/node-levelup", "moment": "~2.5.0", "morgan": "^1.5.1", "request": "^2.48.0",