Skip to content

Commit 339c4f7

Browse files
committed
Merge pull request #98
41a88ee fixed bug in bloom filter deserialization (Antoine Le Calvez)
2 parents 78fef29 + 41a88ee commit 339c4f7

2 files changed

Lines changed: 17 additions & 9 deletions

File tree

bitcoin/bloom.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ def MurmurHash3(nHashSeed, vDataToHash):
5656
# tail
5757
k1 = 0
5858
j = (len(vDataToHash) // 4) * 4
59-
import sys
6059
bord = ord
6160
if sys.version > '3':
6261
# In Py3 indexing bytes returns numbers, not characters
@@ -123,6 +122,7 @@ def bloom_hash(self, nHashNum, vDataToHash):
123122
return MurmurHash3(((nHashNum * 0xFBA4C795) + self.nTweak) & 0xFFFFFFFF, vDataToHash) % (len(self.vData) * 8)
124123

125124
__bit_mask = bytearray([0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80])
125+
126126
def insert(self, elem):
127127
"""Insert an element in the filter.
128128
@@ -164,18 +164,20 @@ def IsRelevantAndUpdate(tx, tx_hash):
164164
raise NotImplementedError
165165

166166
__struct = struct.Struct(b'<IIB')
167+
167168
@classmethod
168169
def stream_deserialize(cls, f):
169-
vData = bitcoin.core.serialize.BytesSerializer.stream_deserialize(f)
170+
vData = bytearray(bitcoin.core.serialize.BytesSerializer.stream_deserialize(f))
170171
(nHashFuncs,
171172
nTweak,
172-
nFlags) = self.__struct.unpack(_ser_read(f, self.__struct.size))
173-
self = cls()
174-
self.vData = vData
175-
self.nHashFuncs = nHashFuncs
176-
self.nTweak = nTweak
177-
self.nFlags = nFlags
178-
return self
173+
nFlags) = CBloomFilter.__struct.unpack(bitcoin.core.ser_read(f, CBloomFilter.__struct.size))
174+
# These arguments can be fake, the real values are set just after
175+
deserialized = cls(1, 0.01, 0, CBloomFilter.UPDATE_ALL)
176+
deserialized.vData = vData
177+
deserialized.nHashFuncs = nHashFuncs
178+
deserialized.nTweak = nTweak
179+
deserialized.nFlags = nFlags
180+
return deserialized
179181

180182
def stream_serialize(self, f):
181183
if sys.version > '3':

bitcoin/tests/test_bloom.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ def F(elem):
6363
T('b9300670b4c5366e95b2699e8b18bc75e5f729c5')
6464

6565
self.assertEqual(filter.serialize(), x('03614e9b050000000000000001'))
66+
deserialized = CBloomFilter.deserialize(x('03614e9b050000000000000001'))
67+
68+
self.assertTrue(deserialized.contains(x('99108ad8ed9bb6274d3980bab5a85c048f0950c8')))
69+
self.assertFalse(deserialized.contains(x('19108ad8ed9bb6274d3980bab5a85c048f0950c8')))
70+
self.assertTrue(deserialized.contains(x('b5a2c786d9ef4658287ced5914b37a1b4aa32eee')))
71+
self.assertTrue(deserialized.contains(x('b9300670b4c5366e95b2699e8b18bc75e5f729c5')))
6672

6773
def test_create_insert_serialize_with_tweak(self):
6874
# Same test as bloom_create_insert_serialize, but we add a nTweak of 100

0 commit comments

Comments
 (0)