Skip to content

Commit 5e9d766

Browse files
committed
Import protocol in the network package
1 parent 784562c commit 5e9d766

File tree

6 files changed

+39
-14
lines changed

6 files changed

+39
-14
lines changed

src/network/addrthread.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
"""
44
from six.moves import queue
55

6-
6+
# magic imports!
77
import state
88
from helper_random import randomshuffle
9-
from network.assemble import assemble_addr
9+
from protocol import assembleAddrMessage
10+
from queues import addrQueue # FIXME: init with queue
1011
from network.connectionpool import BMConnectionPool
11-
from queues import addrQueue
12+
1213
from threads import StoppableThread
1314

1415

@@ -41,7 +42,7 @@ def run(self):
4142
continue
4243
filtered.append((stream, peer, seen))
4344
if filtered:
44-
i.append_write_buf(assemble_addr(filtered))
45+
i.append_write_buf(assembleAddrMessage(filtered))
4546

4647
addrQueue.iterate()
4748
for i in range(len(chunk)):

src/network/announcethread.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
"""
44
import time
55

6+
# magic imports!
67
import state
78
from bmconfigparser import BMConfigParser
8-
from network.assemble import assemble_addr
9+
from protocol import assembleAddrMessage
910
from network.connectionpool import BMConnectionPool
11+
1012
from node import Peer
1113
from threads import StoppableThread
1214

@@ -40,4 +42,4 @@ def announceSelf():
4042
BMConfigParser().safeGetInt(
4143
'bitmessagesettings', 'port')),
4244
time.time())
43-
connection.append_write_buf(assemble_addr([addr]))
45+
connection.append_write_buf(assembleAddrMessage([addr]))

src/network/bmproto.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
BMObjectInvalidError, BMObjectUnwantedStreamError
2626
)
2727
from network.constants import (
28-
ADDRESS_ALIVE, MAX_MESSAGE_SIZE, MAX_OBJECT_COUNT,
28+
ADDRESS_ALIVE, MAX_MESSAGE_SIZE,
2929
MAX_OBJECT_PAYLOAD_SIZE, MAX_TIME_OFFSET
3030
)
3131
from network.dandelion import Dandelion
@@ -350,7 +350,7 @@ def _command_inv(self, dandelion=False):
350350
"""
351351
items = self.decode_payload_content("l32s")
352352

353-
if len(items) > MAX_OBJECT_COUNT:
353+
if len(items) > protocol.MAX_OBJECT_COUNT:
354354
logger.error(
355355
'Too many items in %sinv message!', 'd' if dandelion else '')
356356
raise BMProtoExcessiveDataError()

src/network/constants.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
#: address is online if online less than this many seconds ago
77
ADDRESS_ALIVE = 10800
8-
#: protocol specification says max 1000 addresses in one addr command
9-
MAX_ADDR_COUNT = 1000
108
#: ~1.6 MB which is the maximum possible size of an inv message.
119
MAX_MESSAGE_SIZE = 1600100
1210
#: 2**18 = 256kB is the maximum size of an object payload

src/network/tcp.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
from helper_random import randomBytes
2121
from inventory import Inventory
2222
from network.advanceddispatcher import AdvancedDispatcher
23-
from network.assemble import assemble_addr
2423
from network.bmproto import BMProto
25-
from network.constants import MAX_OBJECT_COUNT
2624
from network.dandelion import Dandelion
2725
from network.objectracker import ObjectTracker
2826
from network.socks4a import Socks4aConnection
@@ -205,7 +203,7 @@ def sendAddr(self):
205203
for peer, params in addrs[substream]:
206204
templist.append((substream, peer, params["lastseen"]))
207205
if templist:
208-
self.append_write_buf(assemble_addr(templist))
206+
self.append_write_buf(protocol.assembleAddrMessage(templist))
209207

210208
def sendBigInv(self):
211209
"""
@@ -244,7 +242,7 @@ def sendChunk():
244242
# Remove -1 below when sufficient time has passed for users to
245243
# upgrade to versions of PyBitmessage that accept inv with 50,000
246244
# items
247-
if objectCount >= MAX_OBJECT_COUNT - 1:
245+
if objectCount >= protocol.MAX_OBJECT_COUNT - 1:
248246
sendChunk()
249247
payload = b''
250248
objectCount = 0

src/protocol.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from debug import logger
2323
from fallback import RIPEMD160Hash
2424
from helper_sql import sqlExecute
25+
from network.node import Peer
2526
from version import softwareVersion
2627

2728
# Service flags
@@ -55,6 +56,9 @@
5556
OBJECT_I2P = 0x493250
5657
OBJECT_ADDR = 0x61646472
5758

59+
#: protocol specification says max 1000 addresses in one addr command
60+
MAX_ADDR_COUNT = 1000
61+
5862
eightBytesOfRandomDataUsedToDetectConnectionsToSelf = pack(
5963
'>Q', random.randrange(1, 18446744073709551615))
6064

@@ -295,6 +299,28 @@ def CreatePacket(command, payload=b''):
295299
return bytes(b)
296300

297301

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+
298324
def assembleVersionMessage(
299325
remoteHost, remotePort, participatingStreams, server=False, nodeid=None
300326
):

0 commit comments

Comments
 (0)