be more strict on the protocol level.

This commit is contained in:
Christopher Jeffrey 2016-03-04 14:51:37 -08:00
parent 24625b1abf
commit 6de9e54667
5 changed files with 74 additions and 19 deletions

View File

@ -11,9 +11,3 @@ var node = bcoin.fullnode({
node.on('error', function(err) { node.on('error', function(err) {
utils.print(err.message); utils.print(err.message);
}); });
node.pool.on('full', function() {
setInterval(function() {
console.log(node.wallet.getAll());
}, 1000);
});

View File

@ -411,7 +411,10 @@ Pool.prototype._addLoader = function _addLoader() {
peer = this._createPeer({ peer = this._createPeer({
seed: this.getSeed(true), seed: this.getSeed(true),
priority: true priority: true,
network: true,
spv: this.options.spv,
witness: this.options.witness
}); });
assert(peer); assert(peer);
@ -826,10 +829,36 @@ Pool.prototype._createPeer = function _createPeer(options) {
peer.on('version', function(version) { peer.on('version', function(version) {
if (version.height > self.block.versionHeight) if (version.height > self.block.versionHeight)
self.block.versionHeight = version.height; self.block.versionHeight = version.height;
self.emit('version', version, peer);
if (options.network) {
if (!version.network) {
utils.debug('Peer does not support network services. Killing.');
self.setMisbehavior(peer, 100);
return;
}
}
if (options.spv) {
if (!version.bloom || version.v < 70011) {
utils.debug('Peer does not support bip37. Killing.');
self.setMisbehavior(peer, 100);
return;
}
}
if (options.witness) {
if (!version.witness) {
utils.debug('Peer does not support segregated witness. Killing.');
self.setMisbehavior(peer, 100);
return;
}
}
utils.debug( utils.debug(
'Received version from %s: version=%d height=%d agent=%s', 'Received version from %s: version=%d height=%d agent=%s',
peer.host, version.v, version.height, version.agent); peer.host, version.v, version.height, version.agent);
self.emit('version', version, peer);
}); });
return peer; return peer;
@ -881,7 +910,10 @@ Pool.prototype._addLeech = function _addLeech(socket) {
peer = this._createPeer({ peer = this._createPeer({
socket: socket, socket: socket,
priority: false priority: false,
network: false,
spv: false,
witness: false
}); });
assert(peer); assert(peer);
@ -958,7 +990,10 @@ Pool.prototype._addPeer = function _addPeer() {
peer = this._createPeer({ peer = this._createPeer({
seed: seed, seed: seed,
priority: false priority: false,
network: true,
spv: this.options.spv,
witness: this.options.witness
}); });
this.peers.pending.push(peer); this.peers.pending.push(peer);

View File

@ -8,13 +8,17 @@ var bcoin = require('../../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = bcoin.utils; var utils = bcoin.utils;
var i;
exports.minVersion = 70001; exports.minVersion = 70001;
exports.version = 70002; exports.version = 70002;
// exports.maxMessage = 2 * 1024 * 1024; // main
exports.maxMessage = 4 * 1000 * 1000; // segwit
exports.bcoinServices = 0;
exports.services = { exports.services = {
network: 1 network: (1 << 0),
getutxo: (1 << 1),
bloom: (1 << 2),
witness: (1 << 3)
}; };
exports.inv = { exports.inv = {

View File

@ -157,7 +157,7 @@ Framer.address = function addr(data, full) {
data.ts = utils.now() - (process.uptime() | 0); data.ts = utils.now() - (process.uptime() | 0);
if (!data.services) if (!data.services)
data.services = constants.services.network; data.services = 0;
if (!data.ipv4) if (!data.ipv4)
data.ipv4 = new Buffer([]); data.ipv4 = new Buffer([]);
@ -206,21 +206,30 @@ Framer.version = function version(options) {
if (!options) if (!options)
options = {}; options = {};
if (!options.remote)
options.remote = {};
if (!options.local)
options.local = {};
if (options.local.services == null)
options.local.services = constants.bcoinServices;
// Version // Version
off += utils.writeU32(p, constants.version, off); off += utils.writeU32(p, constants.version, off);
// Services // Services
off += utils.writeU64(p, constants.services.network, off); off += utils.writeU64(p, constants.bcoinServices, off);
// Timestamp // Timestamp
off += utils.write64(p, utils.now(), off); off += utils.write64(p, utils.now(), off);
// Their address (recv) // Their address (recv)
remote = Framer.address(options.remote || {}); remote = Framer.address(options.remote);
off += utils.copy(remote, p, off); off += utils.copy(remote, p, off);
// Our address (from) // Our address (from)
local = Framer.address(options.local || {}); local = Framer.address(options.local);
off += utils.copy(local, p, off); off += utils.copy(local, p, off);
// Nonce, very dramatic // Nonce, very dramatic

View File

@ -67,6 +67,9 @@ Parser.prototype.feed = function feed(data) {
}; };
Parser.prototype.parse = function parse(chunk) { Parser.prototype.parse = function parse(chunk) {
if (chunk.length > constants.maxMessage)
return this._error('Packet too large: %dmb.', utils.mb(chunk.length));
if (this.packet === null) { if (this.packet === null) {
this.packet = this.parseHeader(chunk) || {}; this.packet = this.parseHeader(chunk) || {};
return; return;
@ -95,9 +98,8 @@ Parser.prototype.parseHeader = function parseHeader(h) {
magic = utils.readU32(h, 0); magic = utils.readU32(h, 0);
if (magic !== network.magic) { if (magic !== network.magic)
return this._error('Invalid magic value: ' + magic.toString(16)); return this._error('Invalid magic value: ' + magic.toString(16));
}
// Count length of the cmd // Count length of the cmd
for (i = 0; h[i + 4] !== 0 && i < 12; i++); for (i = 0; h[i + 4] !== 0 && i < 12; i++);
@ -108,6 +110,9 @@ Parser.prototype.parseHeader = function parseHeader(h) {
cmd = h.slice(4, 4 + i).toString('ascii'); cmd = h.slice(4, 4 + i).toString('ascii');
this.waiting = utils.readU32(h, 16); this.waiting = utils.readU32(h, 16);
if (this.waiting > constants.maxMessage)
return this._error('Packet length too large: %dmb', utils.mb(this.waiting));
return { return {
cmd: cmd, cmd: cmd,
length: this.waiting, length: this.waiting,
@ -216,6 +221,10 @@ Parser.parseVersion = function parseVersion(p) {
return { return {
v: v, v: v,
services: services, services: services,
network: (services & constants.services.network) !== 0,
getutxo: (services & constants.services.getutxo) !== 0,
bloom: (services & constants.services.bloom) !== 0,
witness: (services & constants.services.witness) !== 0,
ts: ts, ts: ts,
local: recv, local: recv,
remote: from, remote: from,
@ -800,6 +809,10 @@ Parser.parseAddress = function parseAddress(p, off, full) {
return { return {
ts: ts, ts: ts,
services: services, services: services,
network: (services & constants.services.network) !== 0,
getutxo: (services & constants.services.getutxo) !== 0,
bloom: (services & constants.services.bloom) !== 0,
witness: (services & constants.services.witness) !== 0,
ipv6: utils.array2ip(ip, 6), ipv6: utils.array2ip(ip, 6),
ipv4: utils.array2ip(ip, 4), ipv4: utils.array2ip(ip, 4),
port: port port: port