Skip to content

Commit 7726712

Browse files
committed
test: p2p: check that headers message with invalid proof-of-work disconnects peer
1 parent f227e15 commit 7726712

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

test/functional/p2p_invalid_messages.py

+33-1
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
MAX_HEADERS_RESULTS,
1414
MAX_INV_SIZE,
1515
MAX_PROTOCOL_MESSAGE_LENGTH,
16+
MSG_TX,
17+
from_hex,
1618
msg_getdata,
1719
msg_headers,
1820
msg_inv,
1921
msg_ping,
20-
MSG_TX,
2122
msg_version,
2223
ser_string,
2324
)
@@ -73,6 +74,7 @@ def run_test(self):
7374
self.test_oversized_inv_msg()
7475
self.test_oversized_getdata_msg()
7576
self.test_oversized_headers_msg()
77+
self.test_invalid_pow_headers_msg()
7678
self.test_resource_exhaustion()
7779

7880
def test_buffer(self):
@@ -248,6 +250,36 @@ def test_oversized_headers_msg(self):
248250
size = MAX_HEADERS_RESULTS + 1
249251
self.test_oversized_msg(msg_headers([CBlockHeader()] * size), size)
250252

253+
def test_invalid_pow_headers_msg(self):
254+
self.log.info("Test headers message with invalid proof-of-work is logged as misbehaving and disconnects peer")
255+
blockheader_tip_hash = self.nodes[0].getbestblockhash()
256+
blockheader_tip = from_hex(CBlockHeader(), self.nodes[0].getblockheader(blockheader_tip_hash, False))
257+
258+
# send valid headers message first
259+
assert_equal(self.nodes[0].getblockchaininfo()['headers'], 0)
260+
blockheader = CBlockHeader()
261+
blockheader.hashPrevBlock = int(blockheader_tip_hash, 16)
262+
blockheader.nTime = int(time.time())
263+
blockheader.nBits = blockheader_tip.nBits
264+
blockheader.rehash()
265+
while not blockheader.hash.startswith('0'):
266+
blockheader.nNonce += 1
267+
blockheader.rehash()
268+
peer = self.nodes[0].add_p2p_connection(P2PInterface())
269+
peer.send_and_ping(msg_headers([blockheader]))
270+
assert_equal(self.nodes[0].getblockchaininfo()['headers'], 1)
271+
chaintips = self.nodes[0].getchaintips()
272+
assert_equal(chaintips[0]['status'], 'headers-only')
273+
assert_equal(chaintips[0]['hash'], blockheader.hash)
274+
275+
# invalidate PoW
276+
while not blockheader.hash.startswith('f'):
277+
blockheader.nNonce += 1
278+
blockheader.rehash()
279+
with self.nodes[0].assert_debug_log(['Misbehaving', 'header with invalid proof of work']):
280+
peer.send_message(msg_headers([blockheader]))
281+
peer.wait_for_disconnect()
282+
251283
def test_resource_exhaustion(self):
252284
self.log.info("Test node stays up despite many large junk messages")
253285
conn = self.nodes[0].add_p2p_connection(P2PDataStore())

0 commit comments

Comments
 (0)