filterload.
This commit is contained in:
parent
48b3b0b506
commit
da3ce0b4a7
@ -8,6 +8,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var constants = require('./protocol/constants');
|
var constants = require('./protocol/constants');
|
||||||
|
var BufferReader = require('./reader');
|
||||||
|
var BufferWriter = require('./writer');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Constants
|
* Constants
|
||||||
@ -156,6 +158,38 @@ Bloom.prototype.isWithinConstraints = function isWithinConstraints() {
|
|||||||
return true;
|
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.
|
* Create a filter from a false positive rate.
|
||||||
* @param {Number} items - Expeected number of items.
|
* @param {Number} items - Expeected number of items.
|
||||||
|
|||||||
@ -764,19 +764,12 @@ Peer.prototype._flushMerkle = function _flushMerkle() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Peer.prototype._handleFilterLoad = function _handleFilterLoad(payload) {
|
Peer.prototype._handleFilterLoad = function _handleFilterLoad(payload) {
|
||||||
this.spvFilter = new bcoin.bloom(
|
if (!payload.isWithinConstraints()) {
|
||||||
payload.filter,
|
|
||||||
payload.n,
|
|
||||||
payload.tweak,
|
|
||||||
payload.update
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!this.spvFilter.isWithinConstraints()) {
|
|
||||||
this.spvFilter = null;
|
|
||||||
this.setMisbehavior(100);
|
this.setMisbehavior(100);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.spvFilter = payload;
|
||||||
this.relay = true;
|
this.relay = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -541,29 +541,13 @@ Framer.pong = function pong(data) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a filterload packet (without a header).
|
* Create a filterload packet (without a header).
|
||||||
* @param {FilterLoadPacket} data
|
* @param {Bloom} data
|
||||||
* @param {BufferWriter?} writer - A buffer writer to continue writing from.
|
* @param {BufferWriter?} writer - A buffer writer to continue writing from.
|
||||||
* @returns {Buffer} Returns a BufferWriter if `writer` was passed in.
|
* @returns {Buffer} Returns a BufferWriter if `writer` was passed in.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Framer.filterLoad = function filterLoad(data, writer) {
|
Framer.filterLoad = function filterLoad(filter, writer) {
|
||||||
var p = new BufferWriter(writer);
|
return filter.toRaw(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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -250,27 +250,11 @@ Parser.parseGetAddr = function parseGetAddr(p) {
|
|||||||
/**
|
/**
|
||||||
* Parse filterload packet.
|
* Parse filterload packet.
|
||||||
* @param {Buffer|BufferReader} p
|
* @param {Buffer|BufferReader} p
|
||||||
* @returns {Object}
|
* @returns {Bloom}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Parser.parseFilterLoad = function parseFilterLoad(p) {
|
Parser.parseFilterLoad = function parseFilterLoad(p) {
|
||||||
var filter, n, tweak, update;
|
return bcoin.bloom.fromRaw(p);
|
||||||
|
|
||||||
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
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user