|
|
|
@ -3,6 +3,7 @@ Manipulations with knownNodes dictionary.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
|
import logging
|
|
|
|
|
import os
|
|
|
|
|
import pickle
|
|
|
|
|
import threading
|
|
|
|
@ -10,28 +11,33 @@ import time
|
|
|
|
|
|
|
|
|
|
import state
|
|
|
|
|
from bmconfigparser import BMConfigParser
|
|
|
|
|
from debug import logger
|
|
|
|
|
from network.node import Peer
|
|
|
|
|
|
|
|
|
|
knownNodesLock = threading.Lock()
|
|
|
|
|
"""Thread lock for knownnodes modification"""
|
|
|
|
|
knownNodes = {stream: {} for stream in range(1, 4)}
|
|
|
|
|
"""The dict of known nodes for each stream"""
|
|
|
|
|
|
|
|
|
|
knownNodesTrimAmount = 2000
|
|
|
|
|
"""trim stream knownnodes dict to this length"""
|
|
|
|
|
|
|
|
|
|
# forget a node after rating is this low
|
|
|
|
|
knownNodesForgetRating = -0.5
|
|
|
|
|
"""forget a node after rating is this low"""
|
|
|
|
|
|
|
|
|
|
knownNodesActual = False
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger('default')
|
|
|
|
|
|
|
|
|
|
DEFAULT_NODES = (
|
|
|
|
|
state.Peer('5.45.99.75', 8444),
|
|
|
|
|
state.Peer('75.167.159.54', 8444),
|
|
|
|
|
state.Peer('95.165.168.168', 8444),
|
|
|
|
|
state.Peer('85.180.139.241', 8444),
|
|
|
|
|
state.Peer('158.222.217.190', 8080),
|
|
|
|
|
state.Peer('178.62.12.187', 8448),
|
|
|
|
|
state.Peer('24.188.198.204', 8111),
|
|
|
|
|
state.Peer('109.147.204.113', 1195),
|
|
|
|
|
state.Peer('178.11.46.221', 8444)
|
|
|
|
|
Peer('5.45.99.75', 8444),
|
|
|
|
|
Peer('75.167.159.54', 8444),
|
|
|
|
|
Peer('95.165.168.168', 8444),
|
|
|
|
|
Peer('85.180.139.241', 8444),
|
|
|
|
|
Peer('158.222.217.190', 8080),
|
|
|
|
|
Peer('178.62.12.187', 8448),
|
|
|
|
|
Peer('24.188.198.204', 8111),
|
|
|
|
|
Peer('109.147.204.113', 1195),
|
|
|
|
|
Peer('178.11.46.221', 8444)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -57,19 +63,17 @@ def json_deserialize_knownnodes(source):
|
|
|
|
|
for node in json.load(source):
|
|
|
|
|
peer = node['peer']
|
|
|
|
|
info = node['info']
|
|
|
|
|
peer = state.Peer(str(peer['host']), peer.get('port', 8444))
|
|
|
|
|
peer = Peer(str(peer['host']), peer.get('port', 8444))
|
|
|
|
|
knownNodes[node['stream']][peer] = info
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
not (knownNodesActual or info.get('self')) and
|
|
|
|
|
peer not in DEFAULT_NODES
|
|
|
|
|
):
|
|
|
|
|
if not (knownNodesActual
|
|
|
|
|
or info.get('self')) and peer not in DEFAULT_NODES:
|
|
|
|
|
knownNodesActual = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def pickle_deserialize_old_knownnodes(source):
|
|
|
|
|
"""
|
|
|
|
|
Unpickle source and reorganize knownnodes dict if it's in old format
|
|
|
|
|
Unpickle source and reorganize knownnodes dict if it has old format
|
|
|
|
|
the old format was {Peer:lastseen, ...}
|
|
|
|
|
the new format is {Peer:{"lastseen":i, "rating":f}}
|
|
|
|
|
"""
|
|
|
|
@ -129,7 +133,7 @@ def readKnownNodes():
|
|
|
|
|
if onionhostname and ".onion" in onionhostname:
|
|
|
|
|
onionport = config.safeGetInt('bitmessagesettings', 'onionport')
|
|
|
|
|
if onionport:
|
|
|
|
|
self_peer = state.Peer(onionhostname, onionport)
|
|
|
|
|
self_peer = Peer(onionhostname, onionport)
|
|
|
|
|
addKnownNode(1, self_peer, is_self=True)
|
|
|
|
|
state.ownAddresses[self_peer] = True
|
|
|
|
|
|
|
|
|
@ -182,7 +186,7 @@ def dns():
|
|
|
|
|
"""Add DNS names to knownnodes"""
|
|
|
|
|
for port in [8080, 8444]:
|
|
|
|
|
addKnownNode(
|
|
|
|
|
1, state.Peer('bootstrap%s.bitmessage.org' % port, port))
|
|
|
|
|
1, Peer('bootstrap%s.bitmessage.org' % port, port))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cleanupKnownNodes():
|
|
|
|
@ -208,8 +212,8 @@ def cleanupKnownNodes():
|
|
|
|
|
del knownNodes[stream][node]
|
|
|
|
|
continue
|
|
|
|
|
# scrap old nodes (age > 3 hours) with low rating
|
|
|
|
|
if (age > 10800 and knownNodes[stream][node]["rating"] <=
|
|
|
|
|
knownNodesForgetRating):
|
|
|
|
|
if (age > 10800 and knownNodes[stream][node]["rating"]
|
|
|
|
|
<= knownNodesForgetRating):
|
|
|
|
|
needToWriteKnownNodesToDisk = True
|
|
|
|
|
del knownNodes[stream][node]
|
|
|
|
|
continue
|
|
|
|
|