mirror of
https://github.com/logos-storage/das-research.git
synced 2026-01-10 00:53:10 +00:00
85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
import random
|
|
import time
|
|
|
|
class Config:
|
|
def __init__(self):
|
|
self.networkSize = 100
|
|
self.networkDegree = 8
|
|
self.badBoy = 66
|
|
self.builders = [12, 26, 54, 78, 98]
|
|
self.nbSlots = 10
|
|
|
|
class Node:
|
|
def __init__(self, config):
|
|
self.peers = []
|
|
self.poisoned = 0
|
|
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))
|
|
|
|
|
|
def pickBuilder(config):
|
|
nbBuilders = len(config.builders)
|
|
builder = random.randint(0, nbBuilders-1)
|
|
return builder
|
|
|
|
def executeSlot(config, nodes):
|
|
pastBorder = []
|
|
currentBorder = []
|
|
currentBorder.append(pickBuilder(config))
|
|
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:
|
|
if nodeID == config.badBoy:
|
|
nodes[nodeID].poisoned = 1
|
|
for peer in nodes[nodeID].peers:
|
|
if peer not in pastBorder and peer not in currentBorder:
|
|
currentBorder.append(peer)
|
|
if nodeID == config.badBoy:
|
|
print("Badboy")
|
|
if nodes[nodeID].poisoned == 1:
|
|
nodes[peer].poisoned = 1
|
|
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):
|
|
# Slot starts with noone poisoned
|
|
for n in range(config.networkSize):
|
|
nodes[n].poisoned = 0
|
|
|
|
# Execute slot
|
|
executeSlot(config, nodes)
|
|
|
|
# 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))
|
|
|
|
|
|
sim()
|