|
15 | 15 | from test_framework.messages import msg_getaddr, msg_ping, msg_verack
|
16 | 16 | from test_framework.mininode import mininode_lock, P2PInterface
|
17 | 17 | from test_framework.test_framework import BitcoinTestFramework
|
18 |
| -from test_framework.util import wait_until |
| 18 | +from test_framework.util import ( |
| 19 | + assert_equal, |
| 20 | + assert_greater_than_or_equal, |
| 21 | + wait_until, |
| 22 | +) |
19 | 23 |
|
20 | 24 | banscore = 10
|
21 | 25 |
|
@@ -90,6 +94,14 @@ def on_version(self, message):
|
90 | 94 | self.send_message(msg_getaddr())
|
91 | 95 |
|
92 | 96 |
|
| 97 | +class P2PVersionStore(P2PInterface): |
| 98 | + version_received = None |
| 99 | + |
| 100 | + def on_version(self, msg): |
| 101 | + super().on_version(msg) |
| 102 | + self.version_received = msg |
| 103 | + |
| 104 | + |
93 | 105 | class P2PLeakTest(BitcoinTestFramework):
|
94 | 106 | def set_test_params(self):
|
95 | 107 | self.num_nodes = 1
|
@@ -127,6 +139,18 @@ def run_test(self):
|
127 | 139 | assert no_version_idlenode.unexpected_msg == False
|
128 | 140 | assert no_verack_idlenode.unexpected_msg == False
|
129 | 141 |
|
| 142 | + self.log.info('Check that the version message does not leak the local address of the node') |
| 143 | + time_begin = int(time.time()) |
| 144 | + p2p_version_store = self.nodes[0].add_p2p_connection(P2PVersionStore()) |
| 145 | + time_end = time.time() |
| 146 | + ver = p2p_version_store.version_received |
| 147 | + assert_greater_than_or_equal(ver.nTime, time_begin) |
| 148 | + assert_greater_than_or_equal(time_end, ver.nTime) |
| 149 | + assert_equal(ver.addrFrom.port, 0) |
| 150 | + assert_equal(ver.addrFrom.ip, '0.0.0.0') |
| 151 | + assert_equal(ver.nStartingHeight, 201) |
| 152 | + assert_equal(ver.nRelay, 1) |
| 153 | + |
130 | 154 |
|
131 | 155 | if __name__ == '__main__':
|
132 | 156 | P2PLeakTest().main()
|
0 commit comments