|
22 | 22 | from debug import logger |
23 | 23 | from fallback import RIPEMD160Hash |
24 | 24 | from helper_sql import sqlExecute |
| 25 | +from network.node import Peer |
25 | 26 | from version import softwareVersion |
26 | 27 |
|
27 | 28 | # Service flags |
|
55 | 56 | OBJECT_I2P = 0x493250 |
56 | 57 | OBJECT_ADDR = 0x61646472 |
57 | 58 |
|
| 59 | +#: protocol specification says max 1000 addresses in one addr command |
| 60 | +MAX_ADDR_COUNT = 1000 |
| 61 | + |
58 | 62 | eightBytesOfRandomDataUsedToDetectConnectionsToSelf = pack( |
59 | 63 | '>Q', random.randrange(1, 18446744073709551615)) |
60 | 64 |
|
@@ -295,6 +299,28 @@ def CreatePacket(command, payload=b''): |
295 | 299 | return bytes(b) |
296 | 300 |
|
297 | 301 |
|
| 302 | +def assembleAddrMessage(peerList): |
| 303 | + """Create address command""" |
| 304 | + if isinstance(peerList, Peer): |
| 305 | + peerList = [peerList] |
| 306 | + if not peerList: |
| 307 | + return b'' |
| 308 | + retval = b'' |
| 309 | + for i in range(0, len(peerList), MAX_ADDR_COUNT): |
| 310 | + payload = encodeVarint(len(peerList[i:i + MAX_ADDR_COUNT])) |
| 311 | + for stream, peer, timestamp in peerList[i:i + MAX_ADDR_COUNT]: |
| 312 | + # 64-bit time |
| 313 | + payload += pack('>Q', timestamp) |
| 314 | + payload += pack('>I', stream) |
| 315 | + # service bit flags offered by this node |
| 316 | + payload += pack('>q', 1) |
| 317 | + payload += encodeHost(peer.host) |
| 318 | + # remote port |
| 319 | + payload += pack('>H', peer.port) |
| 320 | + retval += CreatePacket('addr', payload) |
| 321 | + return retval |
| 322 | + |
| 323 | + |
298 | 324 | def assembleVersionMessage( |
299 | 325 | remoteHost, remotePort, participatingStreams, server=False, nodeid=None |
300 | 326 | ): |
|
0 commit comments