@@ -315,6 +315,8 @@ def _on_data(self):
315315 return
316316 self .recvbuf = self .recvbuf [msglen :]
317317
318+ if msg is None : # ignore decoy messages
319+ return
318320 assert msg # application layer messages (which aren't decoy messages) are non-empty
319321 shortid = msg [0 ] # 1-byte short message type ID
320322 if shortid == 0 :
@@ -364,13 +366,13 @@ def on_message(self, message):
364366
365367 # Socket write methods
366368
367- def send_message (self , message ):
369+ def send_message (self , message , is_decoy = False ):
368370 """Send a P2P message over the socket.
369371
370372 This method takes a P2P payload, builds the P2P header and adds
371373 the message to the send buffer to be sent over the socket."""
372374 with self ._send_lock :
373- tmsg = self .build_message (message )
375+ tmsg = self .build_message (message , is_decoy )
374376 self ._log_message ("send" , message )
375377 return self .send_raw_message (tmsg )
376378
@@ -388,7 +390,7 @@ def maybe_write():
388390
389391 # Class utility methods
390392
391- def build_message (self , message ):
393+ def build_message (self , message , is_decoy = False ):
392394 """Build a serialized P2P message"""
393395 msgtype = message .msgtype
394396 data = message .serialize ()
@@ -400,7 +402,7 @@ def build_message(self, message):
400402 tmsg += msgtype
401403 tmsg += b"\x00 " * (12 - len (msgtype ))
402404 tmsg += data
403- return self .v2_state .v2_enc_packet (tmsg )
405+ return self .v2_state .v2_enc_packet (tmsg , ignore = is_decoy )
404406 else :
405407 tmsg = self .magic_bytes
406408 tmsg += msgtype
@@ -825,7 +827,7 @@ def on_getheaders(self, message):
825827 if response is not None :
826828 self .send_message (response )
827829
828- def send_blocks_and_test (self , blocks , node , * , success = True , force_send = False , reject_reason = None , expect_disconnect = False , timeout = 60 ):
830+ def send_blocks_and_test (self , blocks , node , * , success = True , force_send = False , reject_reason = None , expect_disconnect = False , timeout = 60 , is_decoy = False ):
829831 """Send blocks to test node and test whether the tip advances.
830832
831833 - add all blocks to our block_store
@@ -844,9 +846,11 @@ def send_blocks_and_test(self, blocks, node, *, success=True, force_send=False,
844846
845847 reject_reason = [reject_reason ] if reject_reason else []
846848 with node .assert_debug_log (expected_msgs = reject_reason ):
849+ if is_decoy : # since decoy messages are ignored by the recipient - no need to wait for response
850+ force_send = True
847851 if force_send :
848852 for b in blocks :
849- self .send_message (msg_block (block = b ))
853+ self .send_message (msg_block (block = b ), is_decoy )
850854 else :
851855 self .send_message (msg_headers ([CBlockHeader (block ) for block in blocks ]))
852856 self .wait_until (
0 commit comments