das-research/bandwidthSim.py

85 lines
2.4 KiB
Python
Raw Permalink Normal View History

2023-11-19 19:18:14 +01:00
import random
import time
class Config:
def __init__(self):
self.networkSize = 100
self.networkDegree = 8
self.badBoy = 66
2023-11-20 13:50:48 +01:00
self.builders = [12, 26, 54, 78, 98]
2023-11-19 19:18:14 +01:00
self.nbSlots = 10
class Node:
def __init__(self, config):
self.peers = []
2023-11-20 13:50:48 +01:00
self.poisoned = 0
2023-11-19 19:18:14 +01:00
self.speed = random.randint(0, 10)
self.networkDegree = config.networkDegree
self.networkSize = config.networkSize
for i in range(self.networkDegree):
self.peers.append(random.randint(0, self.networkSize-1))
2023-11-20 13:50:48 +01:00
def pickBuilder(config):
nbBuilders = len(config.builders)
builder = random.randint(0, nbBuilders-1)
return builder
def executeSlot(config, nodes):
2023-11-19 19:18:14 +01:00
pastBorder = []
currentBorder = []
2023-11-20 13:50:48 +01:00
currentBorder.append(pickBuilder(config))
2023-11-19 19:18:14 +01:00
while(True):
#print("Current border size: " + str(len(currentBorder)))
#print("Past border size: " + str(len(pastBorder)))
#print("Nodes size: " + str(len(nodes)))
for nodeID in currentBorder:
2023-11-20 13:50:48 +01:00
if nodeID == config.badBoy:
nodes[nodeID].poisoned = 1
2023-11-19 19:18:14 +01:00
for peer in nodes[nodeID].peers:
if peer not in pastBorder and peer not in currentBorder:
currentBorder.append(peer)
2023-11-20 13:50:48 +01:00
if nodeID == config.badBoy:
print("Badboy")
if nodes[nodeID].poisoned == 1:
nodes[peer].poisoned = 1
2023-11-19 19:18:14 +01:00
pastBorder.append(nodeID)
currentBorder.remove(nodeID)
if len(pastBorder) == len(nodes):
break
#time.sleep(1)
return 0
def sim():
config = Config()
nodes = []
for i in range(config.networkSize):
nodes.append(Node(config))
for slot in range(config.nbSlots):
2023-11-20 13:50:48 +01:00
# Slot starts with noone poisoned
for n in range(config.networkSize):
nodes[n].poisoned = 0
# Execute slot
2023-11-19 19:18:14 +01:00
executeSlot(config, nodes)
2023-11-20 13:50:48 +01:00
# Coubnt poisoned nodes
pois = 0
for n in range(config.networkSize):
pois += nodes[n].poisoned
# Print results
print("Slot finished: "+ str(slot)+" posoned: "+ str(pois))
for i in range(config.networkSize):
print("Node ID " + str(i), end="")
print(" spped "+ str(nodes[i].speed), end="")
print(" poison: "+ str(nodes[i].poisoned), end="")
print(" My peers are "+ str(nodes[i].peers))
2023-11-19 19:18:14 +01:00
sim()