Peter Surda
a0bbd21efc
- outbound peers now have a rating - it's also shown in the network status tab - currently it's between -1 to +1, changes by 0.1 steps and uses a hyperbolic function 0.05/(1.0 - rating) to convert rating to probability with which we should connect to that node when randomly chosen - it increases when we successfully establish a full outbound connection to a node, and decreases when we fail to do that - onion nodes have priority when using SOCKS
46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
import pickle
|
|
import threading
|
|
|
|
from bmconfigparser import BMConfigParser
|
|
import state
|
|
|
|
knownNodesLock = threading.Lock()
|
|
knownNodes = {}
|
|
|
|
knownNodesTrimAmount = 2000
|
|
|
|
def saveKnownNodes(dirName = None):
|
|
if dirName is None:
|
|
dirName = state.appdata
|
|
with knownNodesLock:
|
|
with open(dirName + 'knownnodes.dat', 'wb') as output:
|
|
pickle.dump(knownNodes, output)
|
|
|
|
def increaseRating(peer):
|
|
increaseAmount = 0.1
|
|
maxRating = 1
|
|
with knownNodesLock:
|
|
for stream in knownNodes.keys():
|
|
try:
|
|
knownNodes[stream][peer]["rating"] = min(knownNodes[stream][peer]["rating"] + increaseAmount, maxRating)
|
|
except KeyError:
|
|
pass
|
|
|
|
def decreaseRating(peer):
|
|
decreaseAmount = 0.1
|
|
minRating = -1
|
|
with knownNodesLock:
|
|
for stream in knownNodes.keys():
|
|
try:
|
|
knownNodes[stream][peer]["rating"] = max(knownNodes[stream][peer]["rating"] - decreaseAmount, minRating)
|
|
except KeyError:
|
|
pass
|
|
|
|
def trimKnownNodes(recAddrStream = 1):
|
|
if len(knownNodes[recAddrStream]) < BMConfigParser().get("knownnodes", "maxnodes"):
|
|
return
|
|
with knownNodesLock:
|
|
oldestList = sorted(knownNodes[recAddrStream], key=lambda x: x['lastseen'])[:knownNodesTrimAmount]
|
|
for oldest in oldestList:
|
|
del knownNodes[recAddrStream][oldest]
|