From da3ce0b4a73dbd41002637524ef9bdc74e8e2ac2 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 17 Jun 2016 20:41:45 -0700 Subject: [PATCH] filterload. --- lib/bcoin/bloom.js | 34 ++++++++++++++++++++++++++++++++++ lib/bcoin/peer.js | 11 ++--------- lib/bcoin/protocol/framer.js | 22 +++------------------- lib/bcoin/protocol/parser.js | 20 ++------------------ 4 files changed, 41 insertions(+), 46 deletions(-) diff --git a/lib/bcoin/bloom.js b/lib/bcoin/bloom.js index 529064a4..dd74b675 100644 --- a/lib/bcoin/bloom.js +++ b/lib/bcoin/bloom.js @@ -8,6 +8,8 @@ 'use strict'; var constants = require('./protocol/constants'); +var BufferReader = require('./reader'); +var BufferWriter = require('./writer'); /* * Constants @@ -156,6 +158,38 @@ Bloom.prototype.isWithinConstraints = function isWithinConstraints() { return true; }; +Bloom.prototype.toRaw = function toRaw(writer) { + var p = BufferWriter(writer); + + p.writeVarBytes(this.filter); + p.writeU32(this.n); + p.writeU32(this.tweak); + p.writeU8(this.update); + + if (!writer) + p = p.render(); + + return p; +}; + +Bloom.fromRaw = function fromRaw(data, enc) { + var p, filter, n, tweak, update; + + if (typeof data === 'string') + data = new Buffer(data, enc); + + p = BufferReader(data); + + filter = p.readVarBytes(); + n = p.readU32(); + tweak = p.readU32(); + update = p.readU8(); + + assert(constants.filterFlagsByVal[update] != null, 'Bad filter flag.'); + + return new Bloom(filter, n, tweak, update); +}; + /** * Create a filter from a false positive rate. * @param {Number} items - Expeected number of items. diff --git a/lib/bcoin/peer.js b/lib/bcoin/peer.js index cf0684f8..3b432e8f 100644 --- a/lib/bcoin/peer.js +++ b/lib/bcoin/peer.js @@ -764,19 +764,12 @@ Peer.prototype._flushMerkle = function _flushMerkle() { }; Peer.prototype._handleFilterLoad = function _handleFilterLoad(payload) { - this.spvFilter = new bcoin.bloom( - payload.filter, - payload.n, - payload.tweak, - payload.update - ); - - if (!this.spvFilter.isWithinConstraints()) { - this.spvFilter = null; + if (!payload.isWithinConstraints()) { this.setMisbehavior(100); return; } + this.spvFilter = payload; this.relay = true; }; diff --git a/lib/bcoin/protocol/framer.js b/lib/bcoin/protocol/framer.js index 1f40e6a2..e893f10d 100644 --- a/lib/bcoin/protocol/framer.js +++ b/lib/bcoin/protocol/framer.js @@ -541,29 +541,13 @@ Framer.pong = function pong(data) { /** * Create a filterload packet (without a header). - * @param {FilterLoadPacket} data + * @param {Bloom} data * @param {BufferWriter?} writer - A buffer writer to continue writing from. * @returns {Buffer} Returns a BufferWriter if `writer` was passed in. */ -Framer.filterLoad = function filterLoad(data, writer) { - var p = new BufferWriter(writer); - var update = data.update; - - if (typeof update === 'string') - update = constants.filterFlags[update.toUpperCase()]; - - assert(update != null, 'Bad filter flag.'); - - p.writeVarBytes(data.filter); - p.writeU32(data.n); - p.writeU32(data.tweak); - p.writeU8(update); - - if (!writer) - p = p.render(); - - return p; +Framer.filterLoad = function filterLoad(filter, writer) { + return filter.toRaw(writer); }; /** diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index 3498f677..5f86882d 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -250,27 +250,11 @@ Parser.parseGetAddr = function parseGetAddr(p) { /** * Parse filterload packet. * @param {Buffer|BufferReader} p - * @returns {Object} + * @returns {Bloom} */ Parser.parseFilterLoad = function parseFilterLoad(p) { - var filter, n, tweak, update; - - p = new BufferReader(p); - - filter = p.readVarBytes(); - n = p.readU32(); - tweak = p.readU32(); - update = p.readU8(); - - assert(constants.filterFlagsByVal[update] != null, 'Bad filter flag.'); - - return { - filter: filter, - n: n, - tweak: tweak, - update: update - }; + return bcoin.bloom.fromRaw(p); }; /**