From abac6a9ed3df392751e4507638f0fa8dbabf97f0 Mon Sep 17 00:00:00 2001 From: eordano Date: Mon, 6 Apr 2015 12:50:08 -0300 Subject: [PATCH 1/3] Dont require patched version of bitcore --- lib/data/genesis.js | 13 +++++++++++++ lib/node.js | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 lib/data/genesis.js diff --git a/lib/data/genesis.js b/lib/data/genesis.js new file mode 100644 index 00000000..46bf2f59 --- /dev/null +++ b/lib/data/genesis.js @@ -0,0 +1,13 @@ +module.exports = { + livenet: new Buffer('010000000000000000000000000000000000000000000000000000000000' + + '0000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a5132' + + '3a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c01010000000100000000' + + '00000000000000000000000000000000000000000000000000000000ffff' + + 'ffff4d04ffff001d0104455468652054696d65732030332f4a616e2f3230' + + '3039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f' + + '6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01' + + '000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a6' + + '7962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b' + + '8d578a4c702b6bf11d5fac00000000', 'hex'), + testnet: new Buffer('') +} diff --git a/lib/node.js b/lib/node.js index 30ba9549..d504af47 100644 --- a/lib/node.js +++ b/lib/node.js @@ -19,6 +19,8 @@ var BlockService = require('./services/block'); var TransactionService = require('./services/transaction'); var AddressService = require('./services/address'); +var genesisBlocks = require('./data/genesis'); + var BitcoreNode = function(bus, networkMonitor, blockService, transactionService, addressService) { $.checkArgument(bus); $.checkArgument(networkMonitor); @@ -82,7 +84,7 @@ BitcoreNode.prototype.start = function() { }; BitcoreNode.prototype.sync = function() { - var genesis = bitcore.Block.fromBuffer(bitcore.Networks.defaultNetwork.genesis); + var genesis = bitcore.Block.fromBuffer(genesisBlocks[bitcore.Networks.defaultNetwork.name]); var self = this; this.networkMonitor.on('ready', function() { console.log('ready'); From 13b4f41f80189bff6983a6b4a7d37bc4406e5615 Mon Sep 17 00:00:00 2001 From: eordano Date: Mon, 6 Apr 2015 15:14:12 -0300 Subject: [PATCH 2/3] Change name to sync on networkmonitor --- lib/networkmonitor.js | 10 +++++----- lib/node.js | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index e0a1c2ba..fb3435c3 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -64,6 +64,11 @@ NetworkMonitor.prototype.setupPeer = function(peer) { }; +NetworkMonitor.prototype.requestBlocks = function(start) { + $.checkArgument(_.isString(start), 'start must be a block hash string'); + this.peer.sendMessage(messages.GetBlocks([start])); +}; + NetworkMonitor.prototype.start = function() { this.peer.connect(); }; @@ -76,9 +81,4 @@ NetworkMonitor.prototype.abort = function(reason) { throw reason; }; -NetworkMonitor.prototype.syncFrom = function(start) { - $.checkArgument(_.isString(start), 'start must be a block hash string'); - this.peer.sendMessage(messages.GetBlocks([start])); -}; - module.exports = NetworkMonitor; diff --git a/lib/node.js b/lib/node.js index d504af47..bd6b9f54 100644 --- a/lib/node.js +++ b/lib/node.js @@ -28,6 +28,8 @@ var BitcoreNode = function(bus, networkMonitor, blockService, transactionService this.bus = bus; this.networkMonitor = networkMonitor; + this.tip = null; + this.addressService = addressService; this.transactionService = transactionService; this.blockService = blockService; @@ -95,7 +97,8 @@ BitcoreNode.prototype.sync = function() { start = latest.hash; } console.log('Starting sync from', start); - self.networkMonitor.syncFrom(start); + self.tip = latest; + self.networkMonitor.requestBlocks(start); }) .catch(function(err) { self.networkMonitor.stop(); From 9c7fa5cfaf8ed77aac132c1aedc606c7795541c6 Mon Sep 17 00:00:00 2001 From: eordano Date: Mon, 6 Apr 2015 15:44:31 -0300 Subject: [PATCH 3/3] Add blockchain --- lib/blockchain.js | 45 +++++++++++++++++++++++++++++++++++++++++++ lib/node.js | 17 ++++++++-------- lib/services/block.js | 25 +++++++++++++++++++++++- 3 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 lib/blockchain.js diff --git a/lib/blockchain.js b/lib/blockchain.js new file mode 100644 index 00000000..49cbafc8 --- /dev/null +++ b/lib/blockchain.js @@ -0,0 +1,45 @@ +'use strict'; + +var bitcore = require('bitcore'); +var $ = bitcore.util.preconditions; +var _ = bitcore.deps._; + +function BlockChain() { + this.tip = null; + this.headers = {}; + this.next = {}; + this.prev = {}; +} + +BlockChain.fromObject = function(obj) { + var blockchain = new BlockChain(); + blockchain.tip = obj.tip; + blockchain.headers = obj.headers; + blockchain.next = obj.next; + blockchain.prev = obj.prev; + return blockchain; +}; + +BlockChain.prototype.setTip = function(block) { + $.checkArgument(block instanceof bitcore.Block, 'Argument is not a Block instance'); + this.tip = block.hash; + this.headers[block.hash] = block.header; + var prevHash = bitcore.util.buffer.reverse(block.header.prevHash).toString('hex'); + this.next[prevHash] = block.hash; + this.prev[block.hash] = prevHash; +}; + +BlockChain.prototype.toObject = function() { + return { + tip: this.tip, + headers: _.map(this.headers, function(header) { return header.toObject(); }), + next: this.next, + prev: this.prev + }; +}; + +BlockChain.prototype.toJSON = function() { + return JSON.stringify(this.toObject()); +}; + +module.exports = BlockChain; diff --git a/lib/node.js b/lib/node.js index bd6b9f54..49a6a1a3 100644 --- a/lib/node.js +++ b/lib/node.js @@ -19,6 +19,7 @@ var BlockService = require('./services/block'); var TransactionService = require('./services/transaction'); var AddressService = require('./services/address'); +var BlockChain = require('./blockchain'); var genesisBlocks = require('./data/genesis'); var BitcoreNode = function(bus, networkMonitor, blockService, transactionService, addressService) { @@ -89,16 +90,14 @@ BitcoreNode.prototype.sync = function() { var genesis = bitcore.Block.fromBuffer(genesisBlocks[bitcore.Networks.defaultNetwork.name]); var self = this; this.networkMonitor.on('ready', function() { - console.log('ready'); - self.blockService.getLatest().then(function(latest) { - var start = genesis.hash; - console.log('latest', latest); - if (latest) { - start = latest.hash; + self.blockService.getBlockchain().then(function(blockchain) { + if (blockchain) { + self.blockchain = blockchain; + } else { + self.blockchain = new BlockChain(); + self.blockchain.setTip(genesis); } - console.log('Starting sync from', start); - self.tip = latest; - self.networkMonitor.requestBlocks(start); + self.networkMonitor.requestBlocks(self.blockchain.tip); }) .catch(function(err) { self.networkMonitor.stop(); diff --git a/lib/services/block.js b/lib/services/block.js index 39468652..3c614035 100644 --- a/lib/services/block.js +++ b/lib/services/block.js @@ -39,7 +39,8 @@ var Index = { prev: 'prev-', // prev- -> parent hash next: 'nxt-', // nxt- -> hash for the next block in the main chain that is a child height: 'bh-', // bh- -> height (-1 means disconnected) - tip: 'tip' // tip -> { hash: hex, height: int }, the latest tip + tip: 'tip', // tip -> { hash: hex, height: int }, the latest tip + blockchain: 'chain' }; _.extend(Index, { getNextBlock: helper(Index.next), @@ -381,4 +382,26 @@ BlockService.prototype.getBlockForTransaction = function(transaction) { }); }; +BlockService.prototype.getBlockchain = function() { + var self = this; + return new Promise(function(resolve, reject) { + self.database.getAsync(Index.blockchain).then(function(blockchain) { + blockchain = BlockChain.fromObject(JSON.parse(blockchain)); + return resolve(blockchain); + }).catch(function(arg) { + if (arg.message.indexOf('Key not found in database') !== -1) { + return resolve(); + } + return reject(arg); + }); + }); +}; + +BlockService.prototype.saveBlockchain = function(blockchain) { + return this.database.putAsync({ + key: Index.blockchain, + value: blockchain.toJSON() + }); +}; + module.exports = BlockService;