24
24
from test_framework .test_framework import BitcoinTestFramework
25
25
26
26
27
- class FilterNode (P2PInterface ):
27
+ class P2PBloomFilter (P2PInterface ):
28
28
# This is a P2SH watch-only wallet
29
29
watch_script_pubkey = 'a914ffffffffffffffffffffffffffffffffffffffff87'
30
30
# The initial filter (n=10, fp=0.000001) with just the above scriptPubKey added
@@ -91,38 +91,38 @@ def set_test_params(self):
91
91
def skip_test_if_missing_module (self ):
92
92
self .skip_if_no_wallet ()
93
93
94
- def test_size_limits (self , filter_node ):
94
+ def test_size_limits (self , filter_peer ):
95
95
self .log .info ('Check that too large filter is rejected' )
96
96
with self .nodes [0 ].assert_debug_log (['Misbehaving' ]):
97
- filter_node .send_and_ping (msg_filterload (data = b'\xbb ' * (MAX_BLOOM_FILTER_SIZE + 1 )))
97
+ filter_peer .send_and_ping (msg_filterload (data = b'\xbb ' * (MAX_BLOOM_FILTER_SIZE + 1 )))
98
98
99
99
self .log .info ('Check that max size filter is accepted' )
100
100
with self .nodes [0 ].assert_debug_log ([], unexpected_msgs = ['Misbehaving' ]):
101
- filter_node .send_and_ping (msg_filterload (data = b'\xbb ' * (MAX_BLOOM_FILTER_SIZE )))
102
- filter_node .send_and_ping (msg_filterclear ())
101
+ filter_peer .send_and_ping (msg_filterload (data = b'\xbb ' * (MAX_BLOOM_FILTER_SIZE )))
102
+ filter_peer .send_and_ping (msg_filterclear ())
103
103
104
104
self .log .info ('Check that filter with too many hash functions is rejected' )
105
105
with self .nodes [0 ].assert_debug_log (['Misbehaving' ]):
106
- filter_node .send_and_ping (msg_filterload (data = b'\xaa ' , nHashFuncs = MAX_BLOOM_HASH_FUNCS + 1 ))
106
+ filter_peer .send_and_ping (msg_filterload (data = b'\xaa ' , nHashFuncs = MAX_BLOOM_HASH_FUNCS + 1 ))
107
107
108
108
self .log .info ('Check that filter with max hash functions is accepted' )
109
109
with self .nodes [0 ].assert_debug_log ([], unexpected_msgs = ['Misbehaving' ]):
110
- filter_node .send_and_ping (msg_filterload (data = b'\xaa ' , nHashFuncs = MAX_BLOOM_HASH_FUNCS ))
110
+ filter_peer .send_and_ping (msg_filterload (data = b'\xaa ' , nHashFuncs = MAX_BLOOM_HASH_FUNCS ))
111
111
# Don't send filterclear until next two filteradd checks are done
112
112
113
113
self .log .info ('Check that max size data element to add to the filter is accepted' )
114
114
with self .nodes [0 ].assert_debug_log ([], unexpected_msgs = ['Misbehaving' ]):
115
- filter_node .send_and_ping (msg_filteradd (data = b'\xcc ' * (MAX_SCRIPT_ELEMENT_SIZE )))
115
+ filter_peer .send_and_ping (msg_filteradd (data = b'\xcc ' * (MAX_SCRIPT_ELEMENT_SIZE )))
116
116
117
117
self .log .info ('Check that too large data element to add to the filter is rejected' )
118
118
with self .nodes [0 ].assert_debug_log (['Misbehaving' ]):
119
- filter_node .send_and_ping (msg_filteradd (data = b'\xcc ' * (MAX_SCRIPT_ELEMENT_SIZE + 1 )))
119
+ filter_peer .send_and_ping (msg_filteradd (data = b'\xcc ' * (MAX_SCRIPT_ELEMENT_SIZE + 1 )))
120
120
121
- filter_node .send_and_ping (msg_filterclear ())
121
+ filter_peer .send_and_ping (msg_filterclear ())
122
122
123
123
def test_msg_mempool (self ):
124
124
self .log .info ("Check that a node with bloom filters enabled services p2p mempool messages" )
125
- filter_peer = FilterNode ()
125
+ filter_peer = P2PBloomFilter ()
126
126
127
127
self .log .info ("Create a tx relevant to the peer before connecting" )
128
128
filter_address = self .nodes [0 ].decodescript (filter_peer .watch_script_pubkey )['addresses' ][0 ]
@@ -146,67 +146,67 @@ def test_frelay_false(self, filter_peer):
146
146
# Clear the mempool so that this transaction does not impact subsequent tests
147
147
self .nodes [0 ].generate (1 )
148
148
149
- def test_filter (self , filter_node ):
149
+ def test_filter (self , filter_peer ):
150
150
# Set the bloomfilter using filterload
151
- filter_node .send_and_ping (filter_node .watch_filter_init )
151
+ filter_peer .send_and_ping (filter_peer .watch_filter_init )
152
152
# If fRelay is not already True, sending filterload sets it to True
153
153
assert self .nodes [0 ].getpeerinfo ()[0 ]['relaytxes' ]
154
- filter_address = self .nodes [0 ].decodescript (filter_node .watch_script_pubkey )['addresses' ][0 ]
154
+ filter_address = self .nodes [0 ].decodescript (filter_peer .watch_script_pubkey )['addresses' ][0 ]
155
155
156
156
self .log .info ('Check that we receive merkleblock and tx if the filter matches a tx in a block' )
157
157
block_hash = self .nodes [0 ].generatetoaddress (1 , filter_address )[0 ]
158
158
txid = self .nodes [0 ].getblock (block_hash )['tx' ][0 ]
159
- filter_node .wait_for_merkleblock (block_hash )
160
- filter_node .wait_for_tx (txid )
159
+ filter_peer .wait_for_merkleblock (block_hash )
160
+ filter_peer .wait_for_tx (txid )
161
161
162
162
self .log .info ('Check that we only receive a merkleblock if the filter does not match a tx in a block' )
163
- filter_node .tx_received = False
163
+ filter_peer .tx_received = False
164
164
block_hash = self .nodes [0 ].generatetoaddress (1 , self .nodes [0 ].getnewaddress ())[0 ]
165
- filter_node .wait_for_merkleblock (block_hash )
166
- assert not filter_node .tx_received
165
+ filter_peer .wait_for_merkleblock (block_hash )
166
+ assert not filter_peer .tx_received
167
167
168
168
self .log .info ('Check that we not receive a tx if the filter does not match a mempool tx' )
169
- filter_node .merkleblock_received = False
170
- filter_node .tx_received = False
169
+ filter_peer .merkleblock_received = False
170
+ filter_peer .tx_received = False
171
171
self .nodes [0 ].sendtoaddress (self .nodes [0 ].getnewaddress (), 90 )
172
- filter_node .sync_with_ping ()
173
- filter_node .sync_with_ping ()
174
- assert not filter_node .merkleblock_received
175
- assert not filter_node .tx_received
172
+ filter_peer .sync_with_ping ()
173
+ filter_peer .sync_with_ping ()
174
+ assert not filter_peer .merkleblock_received
175
+ assert not filter_peer .tx_received
176
176
177
177
self .log .info ('Check that we receive a tx if the filter matches a mempool tx' )
178
- filter_node .merkleblock_received = False
178
+ filter_peer .merkleblock_received = False
179
179
txid = self .nodes [0 ].sendtoaddress (filter_address , 90 )
180
- filter_node .wait_for_tx (txid )
181
- assert not filter_node .merkleblock_received
180
+ filter_peer .wait_for_tx (txid )
181
+ assert not filter_peer .merkleblock_received
182
182
183
183
self .log .info ('Check that after deleting filter all txs get relayed again' )
184
- filter_node .send_and_ping (msg_filterclear ())
184
+ filter_peer .send_and_ping (msg_filterclear ())
185
185
for _ in range (5 ):
186
186
txid = self .nodes [0 ].sendtoaddress (self .nodes [0 ].getnewaddress (), 7 )
187
- filter_node .wait_for_tx (txid )
187
+ filter_peer .wait_for_tx (txid )
188
188
189
189
self .log .info ('Check that request for filtered blocks is ignored if no filter is set' )
190
- filter_node .merkleblock_received = False
191
- filter_node .tx_received = False
190
+ filter_peer .merkleblock_received = False
191
+ filter_peer .tx_received = False
192
192
with self .nodes [0 ].assert_debug_log (expected_msgs = ['received getdata' ]):
193
193
block_hash = self .nodes [0 ].generatetoaddress (1 , self .nodes [0 ].getnewaddress ())[0 ]
194
- filter_node .wait_for_inv ([CInv (MSG_BLOCK , int (block_hash , 16 ))])
195
- filter_node .sync_with_ping ()
196
- assert not filter_node .merkleblock_received
197
- assert not filter_node .tx_received
194
+ filter_peer .wait_for_inv ([CInv (MSG_BLOCK , int (block_hash , 16 ))])
195
+ filter_peer .sync_with_ping ()
196
+ assert not filter_peer .merkleblock_received
197
+ assert not filter_peer .tx_received
198
198
199
199
self .log .info ('Check that sending "filteradd" if no filter is set is treated as misbehavior' )
200
200
with self .nodes [0 ].assert_debug_log (['Misbehaving' ]):
201
- filter_node .send_and_ping (msg_filteradd (data = b'letsmisbehave' ))
201
+ filter_peer .send_and_ping (msg_filteradd (data = b'letsmisbehave' ))
202
202
203
203
self .log .info ("Check that division-by-zero remote crash bug [CVE-2013-5700] is fixed" )
204
- filter_node .send_and_ping (msg_filterload (data = b'' , nHashFuncs = 1 ))
205
- filter_node .send_and_ping (msg_filteradd (data = b'letstrytocrashthisnode' ))
204
+ filter_peer .send_and_ping (msg_filterload (data = b'' , nHashFuncs = 1 ))
205
+ filter_peer .send_and_ping (msg_filteradd (data = b'letstrytocrashthisnode' ))
206
206
self .nodes [0 ].disconnect_p2ps ()
207
207
208
208
def run_test (self ):
209
- filter_peer = self .nodes [0 ].add_p2p_connection (FilterNode ())
209
+ filter_peer = self .nodes [0 ].add_p2p_connection (P2PBloomFilter ())
210
210
self .log .info ('Test filter size limits' )
211
211
self .test_size_limits (filter_peer )
212
212
@@ -216,7 +216,7 @@ def run_test(self):
216
216
217
217
self .log .info ('Test BIP 37 for a node with fRelay = False' )
218
218
# Add peer but do not send version yet
219
- filter_peer_without_nrelay = self .nodes [0 ].add_p2p_connection (FilterNode (), send_version = False , wait_for_verack = False )
219
+ filter_peer_without_nrelay = self .nodes [0 ].add_p2p_connection (P2PBloomFilter (), send_version = False , wait_for_verack = False )
220
220
# Send version with fRelay=False
221
221
filter_peer_without_nrelay .wait_until (lambda : filter_peer_without_nrelay .is_connected , timeout = 10 )
222
222
version_without_fRelay = msg_version ()
0 commit comments