From f5472c815b2d7607a2bd665741f5182e649a6e46 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Tue, 24 Feb 2015 16:19:43 -0300 Subject: [PATCH 1/5] move to bleeding edge bitcore and submodules --- lib/networkmonitor.js | 21 +++++++++++++++++++++ package.json | 5 +++-- test/networkmonitor.js | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 lib/networkmonitor.js create mode 100644 test/networkmonitor.js diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js new file mode 100644 index 00000000..c3256648 --- /dev/null +++ b/lib/networkmonitor.js @@ -0,0 +1,21 @@ +'use strict'; + + +var bitcore = require('bitcore'); +var Promise = require('bluebird'); +var $ = bitcore.util.preconditions; +var _ = bitcore.deps._; +var EventEmitter = require('events').EventEmitter; +var util = require('util'); +var EventBus = require('./eventbus'); + + +var p2p = require('bitcore-p2p'); + +function NetworkMonitor(eventBus) { + $.checkArgument(eventBus instanceof EventBus); + this.bus = eventBus; +} +util.inherits(NetworkMonitor, EventEmitter); + +module.exports = NetworkMonitor; diff --git a/package.json b/package.json index 34b9d5b2..c2300bf4 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,10 @@ "dependencies": { "async": "0.9.0", "bignum": "*", - "bitcore": "0.10.4", + "bitcore": "bitpay/bitcore", + "bitcore-p2p": "bitpay/bitcore-p2p", "bluebird": "^2.9.12", - "bufferput": "git://github.com/bitpay/node-bufferput.git", + "bufferput": "bitpay/node-bufferput", "buffertools": "*", "commander": "^2.3.0", "cron": "^1.0.4", diff --git a/test/networkmonitor.js b/test/networkmonitor.js new file mode 100644 index 00000000..074692fe --- /dev/null +++ b/test/networkmonitor.js @@ -0,0 +1,22 @@ +'use strict'; + +var chai = require('chai'); +var should = chai.should(); +var sinon = require('sinon'); + +var NetworkMonitor = require('../lib/networkmonitor'); +var EventBus = require('../lib/eventbus'); +var util = require('util'); +var Promise = require('bluebird'); +Promise.longStackTraces(); + +var bus = sinon.createStubInstance(EventBus); + +describe('NetworkMonitor', function() { + + it.only('instantiate', function() { + var nm = new NetworkMonitor(bus); + should.exist(nm); + }); + +}); From 71a322777136e29bf72a24969a5f2f88a42f7a9a Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Tue, 24 Feb 2015 19:22:28 -0300 Subject: [PATCH 2/5] add barebones NetworkMonitor --- config.js | 2 +- lib/logger.js | 4 ++-- lib/networkmonitor.js | 43 ++++++++++++++++++++++++++++++++++++++---- test/networkmonitor.js | 16 +++++++++++++--- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/config.js b/config.js index 3c5bfe6a..fc964060 100644 --- a/config.js +++ b/config.js @@ -4,7 +4,7 @@ var path = require('path'); var fs = require('fs'); var mkdirp = require('mkdirp'); -var rootPath = path.normalize(__dirname + '/..'), +var rootPath = path.normalize(__dirname), env, db, port, diff --git a/lib/logger.js b/lib/logger.js index 23680925..ba233391 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -1,5 +1,5 @@ var winston = require('winston'); -var config = require('../config/config'); +var config = require('../config'); var logger = new winston.Logger({ transports: [ @@ -10,4 +10,4 @@ var logger = new winston.Logger({ }); logger.transports.console.level = config.loggerLevel; -module.exports.logger = logger; +module.exports = logger; diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index c3256648..2cd4f151 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -2,20 +2,55 @@ var bitcore = require('bitcore'); +var Networks = bitcore.Networks; +var p2p = require('bitcore-p2p'); var Promise = require('bluebird'); var $ = bitcore.util.preconditions; var _ = bitcore.deps._; var EventEmitter = require('events').EventEmitter; var util = require('util'); var EventBus = require('./eventbus'); +var Peer = p2p.Peer; +var Messages = p2p.Messages; +var logger = require('./logger'); - -var p2p = require('bitcore-p2p'); - -function NetworkMonitor(eventBus) { +function NetworkMonitor(eventBus, opts) { $.checkArgument(eventBus instanceof EventBus); this.bus = eventBus; + + opts = opts || {}; + opts.network = opts.network || Networks.defaultNetwork; + opts.host = opts.host || 'localhost'; + opts.port = opts.port || Networks.defaultNetwork.port; + + var peer = new Peer(opts.host, opts.port, opts.network); + this.peer = peer; + this.setupPeer(peer); } util.inherits(NetworkMonitor, EventEmitter); + +NetworkMonitor.prototype.setupPeer = function(peer) { + var self = this; + + peer.on('ready', function() { + logger.info('NetworkMonitor: connected to the bitcoin network.'); + }); + peer.on('inv', function(m) { + // TODO only ask for data if tx or block is unknown + peer.sendMessage(new Messages.GetData(m.inventory)); + }); + peer.on('tx', function(m) { + self.bus.process(m.transaction); + }); + peer.on('block', function(m) { + self.bus.process(m.block); + }); +}; + +NetworkMonitor.prototype.start = function() { + this.peer.connect(); +}; + + module.exports = NetworkMonitor; diff --git a/test/networkmonitor.js b/test/networkmonitor.js index 074692fe..98437b78 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -3,6 +3,7 @@ var chai = require('chai'); var should = chai.should(); var sinon = require('sinon'); +var bitcore = require('bitcore'); var NetworkMonitor = require('../lib/networkmonitor'); var EventBus = require('../lib/eventbus'); @@ -10,13 +11,22 @@ var util = require('util'); var Promise = require('bluebird'); Promise.longStackTraces(); -var bus = sinon.createStubInstance(EventBus); +var bus = new EventBus(); //sinon.createStubInstance(EventBus); -describe('NetworkMonitor', function() { +describe.only('NetworkMonitor', function() { - it.only('instantiate', function() { + this.timeout(10000); + + it('instantiate', function() { var nm = new NetworkMonitor(bus); should.exist(nm); }); + it('start', function(cb) { + var nm = new NetworkMonitor(bus); + bus.register(bitcore.Transaction, function(tx) { + console.log('new tx: ', tx.id); + }); + nm.start(); + }); }); From c84c66f2013072ecfd90d74470089916508437ce Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Wed, 25 Feb 2015 16:42:06 -0300 Subject: [PATCH 3/5] fix NetworkMonitor tests --- lib/networkmonitor.js | 20 +++++++++++--------- test/networkmonitor.js | 33 +++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 2cd4f151..434ce000 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -14,21 +14,23 @@ var Peer = p2p.Peer; var Messages = p2p.Messages; var logger = require('./logger'); -function NetworkMonitor(eventBus, opts) { - $.checkArgument(eventBus instanceof EventBus); +function NetworkMonitor(eventBus, peer) { + $.checkArgument(eventBus); + $.checkArgument(peer); this.bus = eventBus; - - opts = opts || {}; - opts.network = opts.network || Networks.defaultNetwork; - opts.host = opts.host || 'localhost'; - opts.port = opts.port || Networks.defaultNetwork.port; - - var peer = new Peer(opts.host, opts.port, opts.network); this.peer = peer; this.setupPeer(peer); } util.inherits(NetworkMonitor, EventEmitter); +NetworkMonitor.create = function(eventBus, opts) { + opts.network = opts.network || Networks.defaultNetwork; + opts.host = opts.host || 'localhost'; + opts.port = opts.port || Networks.defaultNetwork.port; + + var peer = new Peer(opts.host, opts.port, opts.network); + return new NetworkMonitor(eventBus, peer); +}; NetworkMonitor.prototype.setupPeer = function(peer) { var self = this; diff --git a/test/networkmonitor.js b/test/networkmonitor.js index 98437b78..535a9412 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -2,29 +2,38 @@ var chai = require('chai'); var should = chai.should(); -var sinon = require('sinon'); var bitcore = require('bitcore'); +var Transaction = bitcore.Transaction; +var EventEmitter = require('events').EventEmitter; var NetworkMonitor = require('../lib/networkmonitor'); var EventBus = require('../lib/eventbus'); -var util = require('util'); -var Promise = require('bluebird'); -Promise.longStackTraces(); -var bus = new EventBus(); //sinon.createStubInstance(EventBus); +describe('NetworkMonitor', function() { -describe.only('NetworkMonitor', function() { - - this.timeout(10000); + // mocks + var mockTx, busMock, peerMock; + beforeEach(function() { + mockTx = new Transaction(); + busMock = new EventBus(); + peerMock = new EventEmitter(); + peerMock.connect = function() { + this.emit('tx', { + transaction: mockTx + }); + }; + }); it('instantiate', function() { - var nm = new NetworkMonitor(bus); + var nm = new NetworkMonitor(busMock, peerMock); should.exist(nm); }); + it('start', function(cb) { - var nm = new NetworkMonitor(bus); - bus.register(bitcore.Transaction, function(tx) { - console.log('new tx: ', tx.id); + var nm = new NetworkMonitor(busMock, peerMock); + busMock.register(bitcore.Transaction, function(tx) { + tx.id.should.equal(mockTx.id); + cb(); }); nm.start(); }); From df04857bb494d8ec6887e49f77e6ddf3e6b01951 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Wed, 25 Feb 2015 18:48:23 -0300 Subject: [PATCH 4/5] 100% test coverage for NetworkMonitor --- lib/networkmonitor.js | 4 ++-- test/networkmonitor.js | 52 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 434ce000..25a735f1 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -12,7 +12,6 @@ var util = require('util'); var EventBus = require('./eventbus'); var Peer = p2p.Peer; var Messages = p2p.Messages; -var logger = require('./logger'); function NetworkMonitor(eventBus, peer) { $.checkArgument(eventBus); @@ -24,6 +23,7 @@ function NetworkMonitor(eventBus, peer) { util.inherits(NetworkMonitor, EventEmitter); NetworkMonitor.create = function(eventBus, opts) { + opts = opts || {}; opts.network = opts.network || Networks.defaultNetwork; opts.host = opts.host || 'localhost'; opts.port = opts.port || Networks.defaultNetwork.port; @@ -36,7 +36,7 @@ NetworkMonitor.prototype.setupPeer = function(peer) { var self = this; peer.on('ready', function() { - logger.info('NetworkMonitor: connected to the bitcoin network.'); + self.emit('ready'); }); peer.on('inv', function(m) { // TODO only ask for data if tx or block is unknown diff --git a/test/networkmonitor.js b/test/networkmonitor.js index 535a9412..cba95deb 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -3,7 +3,10 @@ var chai = require('chai'); var should = chai.should(); var bitcore = require('bitcore'); +var sinon = require('sinon'); +var util = require('util'); var Transaction = bitcore.Transaction; +var Block = bitcore.Block; var EventEmitter = require('events').EventEmitter; var NetworkMonitor = require('../lib/networkmonitor'); @@ -12,24 +15,58 @@ var EventBus = require('../lib/eventbus'); describe('NetworkMonitor', function() { // mocks - var mockTx, busMock, peerMock; + var mockTx, mockBlock, busMock, peerMock; beforeEach(function() { mockTx = new Transaction(); + var genesishex = '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000'; + var genesisbuf = new Buffer(genesishex, 'hex'); + mockBlock = new Block(genesisbuf); + mockBlock.id = 'asd'; busMock = new EventBus(); peerMock = new EventEmitter(); + peerMock.sendMessage = sinon.spy(); peerMock.connect = function() { + this.emit('ready'); + this.emit('inv', { + inventory: [] + }); this.emit('tx', { transaction: mockTx }); + this.emit('block', { + block: mockBlock + }); }; }); - it('instantiate', function() { + it('instantiates correctly from constructor', function() { var nm = new NetworkMonitor(busMock, peerMock); should.exist(nm); }); - it('start', function(cb) { + it('instantiates correctly from create', function() { + var nm = NetworkMonitor.create(busMock); + should.exist(nm); + }); + + it('start', function() { + var nm = new NetworkMonitor(busMock, peerMock); + nm.start.bind(nm).should.not.throw(); + }); + + it('broadcasts ready after start', function(cb) { + var nm = new NetworkMonitor(busMock, peerMock); + nm.on('ready', cb) + nm.start(); + }); + + it('sends getdatas when receiving invs', function() { + var nm = new NetworkMonitor(busMock, peerMock); + nm.start(); + peerMock.sendMessage.calledOnce.should.equal(true); + }); + + it('sends transactions to bus', function(cb) { var nm = new NetworkMonitor(busMock, peerMock); busMock.register(bitcore.Transaction, function(tx) { tx.id.should.equal(mockTx.id); @@ -38,4 +75,13 @@ describe('NetworkMonitor', function() { nm.start(); }); + it('sends blocks to bus', function(cb) { + var nm = new NetworkMonitor(busMock, peerMock); + busMock.register(bitcore.Block, function(block) { + block.id.should.equal(mockBlock.id); + cb(); + }); + nm.start(); + }); + }); From df81629fa1373a40780e73cde70e4d0faffcdd45 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 26 Feb 2015 11:59:31 -0300 Subject: [PATCH 5/5] order requires --- lib/networkmonitor.js | 9 +++------ test/networkmonitor.js | 11 +++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 25a735f1..cf7d9b7c 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -1,15 +1,12 @@ 'use strict'; +var util = require('util'); +var EventEmitter = require('events').EventEmitter; var bitcore = require('bitcore'); var Networks = bitcore.Networks; -var p2p = require('bitcore-p2p'); -var Promise = require('bluebird'); var $ = bitcore.util.preconditions; -var _ = bitcore.deps._; -var EventEmitter = require('events').EventEmitter; -var util = require('util'); -var EventBus = require('./eventbus'); +var p2p = require('bitcore-p2p'); var Peer = p2p.Peer; var Messages = p2p.Messages; diff --git a/test/networkmonitor.js b/test/networkmonitor.js index cba95deb..f084e3f4 100644 --- a/test/networkmonitor.js +++ b/test/networkmonitor.js @@ -3,6 +3,7 @@ var chai = require('chai'); var should = chai.should(); var bitcore = require('bitcore'); +var Networks = bitcore.Networks; var sinon = require('sinon'); var util = require('util'); var Transaction = bitcore.Transaction; @@ -49,6 +50,16 @@ describe('NetworkMonitor', function() { should.exist(nm); }); + it('instantiates correctly from create with opts', function() { + var opts = { + network: Networks.livenet, + host: '8.8.8.8', + port: 3001 + }; + var nm = NetworkMonitor.create(busMock); + should.exist(nm); + }); + it('start', function() { var nm = new NetworkMonitor(busMock, peerMock); nm.start.bind(nm).should.not.throw();