wip
This commit is contained in:
parent
87df236e35
commit
58223948ac
@ -27,12 +27,15 @@ var P2P = function(options) {
|
|||||||
BaseService.call(this, options);
|
BaseService.call(this, options);
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this._maxPeers = this.options.maxPeers || 60;
|
this._maxPeers = this.options.maxPeers || 60;
|
||||||
|
this._minPeers = this.options.minPeers || 1;
|
||||||
this._peers = this.options.peers;
|
this._peers = this.options.peers;
|
||||||
this.subscriptions = {};
|
this.subscriptions = {};
|
||||||
this.subscriptions.block = [];
|
this.subscriptions.block = [];
|
||||||
this.subscriptions.transaction = [];
|
this.subscriptions.transaction = [];
|
||||||
this.messages = new p2p.Messages({ network: this.node.network });
|
this.messages = new p2p.Messages({ network: this.node.network });
|
||||||
|
this._peerHeights = [];
|
||||||
|
this._peers = [];
|
||||||
|
this._peerIndex = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
util.inherits(P2P, BaseService);
|
util.inherits(P2P, BaseService);
|
||||||
@ -86,6 +89,31 @@ P2P.prototype._initPool = function() {
|
|||||||
this._pool = new p2p.Pool(opts);
|
this._pool = new p2p.Pool(opts);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
P2P.prototype._addPeer = function(peer) {
|
||||||
|
this._peers.push(peer);
|
||||||
|
};
|
||||||
|
|
||||||
|
P2P.prototype._removePeer = function(peer) {
|
||||||
|
this._peer.splice(peer, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
P2P.prototype._getPeer = function() {
|
||||||
|
// TODO: this logic could get complicated depending on the state of the pool
|
||||||
|
if (this._peers.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var index = this._peerIndex++ % this._peers.length;
|
||||||
|
return this._peers[index];
|
||||||
|
};
|
||||||
|
|
||||||
|
P2P.prototype._getBestHeight = function(peer) {
|
||||||
|
this._peerHeights.push(peer.bestHeight);
|
||||||
|
if (this._peerHeights >= this._minPeers) {
|
||||||
|
return Math.max(this._bestHeights);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
P2P.prototype._setupListeners = function() {
|
P2P.prototype._setupListeners = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
@ -95,11 +123,17 @@ P2P.prototype._setupListeners = function() {
|
|||||||
peer.network.alias + ', version: ' + peer.version + ', subversion: ' +
|
peer.network.alias + ', version: ' + peer.version + ', subversion: ' +
|
||||||
peer.subversion + ', status: ' + peer.status + ', port: ' +
|
peer.subversion + ', status: ' + peer.status + ', port: ' +
|
||||||
peer.port + ', best height: ' + peer.bestHeight);
|
peer.port + ', best height: ' + peer.bestHeight);
|
||||||
peer.sendMessage(self.messages.MemPool());
|
|
||||||
|
self._addPeer(peer);
|
||||||
|
var bestHeight = self._getBestHeight(peer);
|
||||||
|
if (bestHeight >= 0) {
|
||||||
|
self.emit('bestHeight', bestHeight);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self._pool.on('peerdisconnect', function(peer, addr) {
|
self._pool.on('peerdisconnect', function(peer, addr) {
|
||||||
|
|
||||||
|
self._removePeer(peer);
|
||||||
log.info('Disconnected from peer: ' + addr.ip.v4);
|
log.info('Disconnected from peer: ' + addr.ip.v4);
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -115,7 +149,6 @@ P2P.prototype._setupListeners = function() {
|
|||||||
|
|
||||||
self._inv.set(inv.hash, true);
|
self._inv.set(inv.hash, true);
|
||||||
|
|
||||||
//self._generateRetrievalMessage()
|
|
||||||
newDataNeeded.push(inv);
|
newDataNeeded.push(inv);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -132,9 +165,7 @@ P2P.prototype._setupListeners = function() {
|
|||||||
self._pool.on('peerblock', self._broadcastBlock.bind(self));
|
self._pool.on('peerblock', self._broadcastBlock.bind(self));
|
||||||
|
|
||||||
self.node.on('ready', function() {
|
self.node.on('ready', function() {
|
||||||
setTimeout(function() {
|
self._pool.connect();
|
||||||
self._pool.connect();
|
|
||||||
}, 1000);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -152,7 +183,12 @@ P2P.prototype._broadcastBlock = function(peer, message) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
P2P.prototype.getAPIMethods = function() {
|
P2P.prototype.getAPIMethods = function() {
|
||||||
return [];
|
var methods = [
|
||||||
|
['createHeaderStream', this, this.getHeaders, 2],
|
||||||
|
['createMempoolStream', this, this.getMempool, 0],
|
||||||
|
['createBlockStream', this, this.getBlocks, 2]
|
||||||
|
];
|
||||||
|
return methods;
|
||||||
};
|
};
|
||||||
|
|
||||||
P2P.prototype.getPublishEvents = function() {
|
P2P.prototype.getPublishEvents = function() {
|
||||||
@ -168,8 +204,54 @@ P2P.prototype.getPublishEvents = function() {
|
|||||||
scope: this,
|
scope: this,
|
||||||
subscribe: this.subscribe.bind(this, 'block'),
|
subscribe: this.subscribe.bind(this, 'block'),
|
||||||
unsubscribe: this.unsubscribe.bind(this, 'block')
|
unsubscribe: this.unsubscribe.bind(this, 'block')
|
||||||
},
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
P2P.prototype.createHeaderStream = function(startBlockHash, endBlockHash) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
if (!endBlockHash) {
|
||||||
|
endBlockHash = startBlockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = self.messages.GetHeaders(startBlockHash, endBlockHash);
|
||||||
|
var peer = self._getPeer();
|
||||||
|
|
||||||
|
peer.on('peerheaders', function(peer, message) {
|
||||||
|
self.emit('headers', message.headers);
|
||||||
|
});
|
||||||
|
|
||||||
|
peer.sendMessage(message);
|
||||||
|
return self;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
P2P.prototype.createMempoolStream = function() {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var peer = self._getPeer();
|
||||||
|
peer.sendMessage(self.messages.MemPool());
|
||||||
|
|
||||||
|
peer.on('inv', function(message) {
|
||||||
|
});
|
||||||
|
peer.on('tx', function(message) {
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
P2P.prototype.createBlockStream = function(startBlockHash, endBlockHash) {
|
||||||
|
|
||||||
|
if (!endBlockHash) {
|
||||||
|
endBlockHash = startBlockHash;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = this.messages.GetBlocks(startBlockHash, endBlockHash);
|
||||||
|
var peer = this._getPeer();
|
||||||
|
peer.sendMessage(message);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = P2P;
|
module.exports = P2P;
|
||||||
|
|||||||
@ -26,16 +26,51 @@ TestBusService.prototype.start = function(callback) {
|
|||||||
self.bus = self.node.openBus({ remoteAddress: 'localhost' });
|
self.bus = self.node.openBus({ remoteAddress: 'localhost' });
|
||||||
|
|
||||||
self.bus.on('p2p/transaction', function(tx) {
|
self.bus.on('p2p/transaction', function(tx) {
|
||||||
self.pubSocket.send([ 'transaction', new Buffer(tx.uncheckedSerialize(), 'hex') ]);
|
var self = this;
|
||||||
|
self._cache.transaction.push(tx);
|
||||||
|
if (self._ready) {
|
||||||
|
for(var i = 0; i < self._cache.transaction.length; i++) {
|
||||||
|
var transaction = self._cache.transaction.unshift();
|
||||||
|
self.pubSocket.send([ 'transaction', new Buffer(transaction.uncheckedSerialize(), 'hex') ]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.bus.on('p2p/block', function(block) {
|
self.bus.on('p2p/block', function(block) {
|
||||||
self.pubSocket.send([ 'block', block.toBuffer() ]);
|
var self = this;
|
||||||
|
self._cache.block.push(block);
|
||||||
|
if (self._ready) {
|
||||||
|
for(var i = 0; i < self._cache.block.length; i++) {
|
||||||
|
var blk = self._cache.block.unshift();
|
||||||
|
self.pubSocket.send([ 'block', blk.toBuffer() ]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.bus.on('p2p/headers', function(headers) {
|
||||||
|
var self = this;
|
||||||
|
self._cache.headers.push(headers);
|
||||||
|
if (self._ready) {
|
||||||
|
for(var i = 0; i < self._cache.headers.length; i++) {
|
||||||
|
var hdrs = self._cache.headers.unshift();
|
||||||
|
self.pubSocket.send([ 'headers', hdrs ]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.bus.subscribe('p2p/transaction');
|
self.bus.subscribe('p2p/transaction');
|
||||||
self.bus.subscribe('p2p/block');
|
self.bus.subscribe('p2p/block');
|
||||||
|
|
||||||
|
self.node.on('ready', function() {
|
||||||
|
//we could be getting events right away, so until our subscribers get connected, we need to cache
|
||||||
|
self._cache = { transaction: [], block: [], headers: [] };
|
||||||
|
setTimeout(function() {
|
||||||
|
self._ready = true;
|
||||||
|
}, 2000);
|
||||||
|
});
|
||||||
callback();
|
callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user