diff --git a/bin/spvnode b/bin/spvnode index 6ed8d844..c3a2fcd9 100755 --- a/bin/spvnode +++ b/bin/spvnode @@ -18,5 +18,12 @@ node.open(function(err) { if (err) throw err; + if (process.argv.indexOf('--test') !== -1) { + node.pool.watchAddress('1VayNert3x1KzbpzMGt2qdqrAThiRovi8'); + node.on('tx', function(tx) { + utils.print(tx); + }); + } + node.startSync(); }); diff --git a/lib/bcoin/bloom.js b/lib/bcoin/bloom.js index 23dc0f8f..e25bf871 100644 --- a/lib/bcoin/bloom.js +++ b/lib/bcoin/bloom.js @@ -369,58 +369,50 @@ RollingFilter.prototype.added = function added(val, enc) { */ function murmur3(data, seed) { + var tail = data.length - (data.length % 4); var c1 = 0xcc9e2d51; var c2 = 0x1b873593; - var r1 = 15; - var r2 = 13; - var m = 5; - var n = 0xe6546b64; - var hash = seed; - var i, w, r, j; + var h1 = seed; + var i, k1; - assert(Buffer.isBuffer(data)); - - for (i = 0; i + 4 <= data.length; i += 4) { - w = data[i] - | (data[i + 1] << 8) + for (i = 0; i < tail; i += 4) { + k1 = (data[i + 3] << 24) | (data[i + 2] << 16) - | (data[i + 3] << 24); - - w = mul32(w, c1); - w = rotl32(w, r1); - w = mul32(w, c2); - - hash ^= w; - hash = rotl32(hash, r2); - hash = mul32(hash, m); - hash = sum32(hash, n); + | (data[i + 1] << 8) + | data[i]; + k1 = mul32(k1, c1); + k1 = rotl32(k1, 15); + k1 = mul32(k1, c2); + h1 ^= k1; + h1 = rotl32(h1, 13); + h1 = sum32(mul32(h1, 5), 0xe6546b64); } - if (i !== data.length) { - r = 0; - for (j = data.length - 1; j >= i; j--) - r = (r << 8) | data[j]; - - r = mul32(r, c1); - r = rotl32(r, r1); - if (r < 0) - r += 0x100000000; - r = mul32(r, c2); - - hash ^= r; + k1 = 0; + switch (data.length & 3) { + case 3: + k1 ^= data[tail + 2] << 16; + case 2: + k1 ^= data[tail + 1] << 8; + case 1: + k1 ^= data[tail + 0]; + k1 = mul32(k1, c1); + k1 = rotl32(k1, 15); + k1 = mul32(k1, c2); + h1 ^= k1; } - hash ^= data.length; - hash ^= hash >>> 16; - hash = mul32(hash, 0x85ebca6b); - hash ^= hash >>> 13; - hash = mul32(hash, 0xc2b2ae35); - hash ^= hash >>> 16; + h1 ^= data.length; + h1 ^= h1 >>> 16; + h1 = mul32(h1, 0x85ebca6b); + h1 ^= h1 >>> 13; + h1 = mul32(h1, 0xc2b2ae35); + h1 ^= h1 >>> 16; - if (hash < 0) - hash += 0x100000000; + if (h1 < 0) + h1 += 0x100000000; - return hash; + return h1; } function mul32(a, b) { diff --git a/test/bloom-test.js b/test/bloom-test.js index 6a0b601c..241a1b0c 100644 --- a/test/bloom-test.js +++ b/test/bloom-test.js @@ -14,10 +14,32 @@ describe('Bloom', function() { it('should do proper murmur3', function() { var murmur3 = bcoin.bloom.murmur3; - assert.equal(murmur3(new Buffer('', 'ascii'), 0), 0); - assert.equal(murmur3(new Buffer('', 'ascii'), 0xfba4c795), 0x6a396f08); - assert.equal(murmur3(new Buffer('00', 'ascii'), 0xfba4c795), 0x2a101837); - assert.equal(murmur3(new Buffer('hello world', 'ascii'), 0), 0x5e928f0f); + + function mm(str, seed, expect, enc) { + assert.equal(murmur3(new Buffer(str, enc || 'ascii'), seed), expect); + } + + mm('', 0, 0); + mm('', 0xfba4c795, 0x6a396f08); + mm('00', 0xfba4c795, 0x2a101837); + mm('hello world', 0, 0x5e928f0f); + + mm('', 0x00000000, 0x00000000, 'hex'); + mm('', 0xfba4c795, 0x6a396f08, 'hex'); + mm('', 0xffffffff, 0x81f16f39, 'hex'); + + mm('00', 0x00000000, 0x514e28b7, 'hex'); + mm('00', 0xfba4c795, 0xea3f0b17, 'hex'); + mm('ff', 0x00000000, 0xfd6cf10d, 'hex'); + + mm('0011', 0x00000000, 0x16c6b7ab, 'hex'); + mm('001122', 0x00000000, 0x8eb51c3d, 'hex'); + mm('00112233', 0x00000000, 0xb4471bf8, 'hex'); + mm('0011223344', 0x00000000, 0xe2301fa8, 'hex'); + mm('001122334455', 0x00000000, 0xfc2e4a15, 'hex'); + mm('00112233445566', 0x00000000, 0xb074502c, 'hex'); + mm('0011223344556677', 0x00000000, 0x8034d2a0, 'hex'); + mm('001122334455667788', 0x00000000, 0xb4698def, 'hex'); }); it('should test and add stuff', function() {