add connect_peers()

This commit is contained in:
Arunima Chaudhuri 2025-02-19 22:28:23 +05:30
parent 2a42c17a1f
commit 254c6d67b2
5 changed files with 59 additions and 46 deletions

View File

@ -81,13 +81,14 @@ class Node:
self.logger = logger self.logger = logger
self.validators = validators self.validators = validators
self.received_gossip = defaultdict(list) self.received_gossip = defaultdict(list)
self.peer_connections = set()
# query methods # query methods
self.exponential_growth = True self.exponential_growth = False
self.linear_growth = False self.linear_growth = False
self.linear_constant_growth = False self.linear_constant_growth = False
self.hybrid_growth = False self.hybrid_growth = False
self.exponential_constant_growth = False self.exponential_constant_growth = True
self.linear_growth_constant = 10 self.linear_growth_constant = 10
# query results # query results
@ -722,57 +723,28 @@ class Node:
query_times.append(0) query_times.append(0)
all_original_retries.append(0) all_original_retries.append(0)
else: else:
row_neighbors_copy = {row: list(neighbors) for row, neighbors in self.rowNeighbors.items()}
column_neighbors_copy = {col: list(neighbors) for col, neighbors in self.columnNeighbors.items()}
row_peer_ids = list({node_id for neighbors in row_neighbors_copy.values() for node_id in neighbors})
col_peer_ids = list({node_id for neighbors in column_neighbors_copy.values() for node_id in neighbors})
peers_with_custody = set() peers_with_custody = set()
for peer_id in row_peer_ids: for peer_id in self.peer_connections:
if (sample_row in simulator.validators[peer_id].rowIDs or if (sample_row in simulator.validators[peer_id].rowIDs or
sample_col in simulator.validators[peer_id].columnIDs or sample_col in simulator.validators[peer_id].columnIDs or
len(simulator.validators[peer_id].rowIDs) >= self.shape.nbRowsK or len(simulator.validators[peer_id].rowIDs) >= self.shape.nbRowsK or
len(simulator.validators[peer_id].columnIDs) >= self.shape.nbColsK): len(simulator.validators[peer_id].columnIDs) >= self.shape.nbColsK):
peers_with_custody.update({peer_id}) peers_with_custody.update({peer_id})
for peer_id in col_peer_ids:
if (sample_row in simulator.validators[peer_id].rowIDs or
sample_col in simulator.validators[peer_id].columnIDs or
len(simulator.validators[peer_id].rowIDs) >= self.shape.nbRowsK or
len(simulator.validators[peer_id].columnIDs) >= self.shape.nbColsK):
peers_with_custody.update({peer_id})
peers_with_custody = list(peers_with_custody) peers_with_custody = list(peers_with_custody)
peers_with_custody_level_2 = []
row_neighbors_l2 = set()
col_neighbors_l2 = set()
for p in row_peer_ids:
for neighbors in simulator.validators[p].rowNeighbors.values():
row_neighbors_l2.update(neighbors)
for neighbors in simulator.validators[p].columnNeighbors.values():
row_neighbors_l2.update(neighbors)
for p in col_peer_ids:
for neighbors in simulator.validators[p].rowNeighbors.values():
col_neighbors_l2.update(neighbors)
for neighbors in simulator.validators[p].columnNeighbors.values():
col_neighbors_l2.update(neighbors)
neighbors_level_2 = list(row_neighbors_l2.union(col_neighbors_l2))
peers_with_custody_level_2 = set() peers_with_custody_level_2 = set()
for p in neighbors_level_2: for p in self.peer_connections:
if (sample_row in simulator.validators[p].rowIDs or for peer_l2 in simulator.validators[p].peer_connections:
sample_col in simulator.validators[p].columnIDs or if (sample_row in simulator.validators[peer_l2].rowIDs or
len(simulator.validators[p].rowIDs) >= self.shape.nbRowsK or sample_col in simulator.validators[peer_l2].rowIDs or
len(simulator.validators[p].columnIDs) >= self.shape.nbColsK): len(simulator.validators[peer_l2].rowIDs) >= self.shape.nbRowsK or
peers_with_custody_level_2.update({p}) len(simulator.validators[peer_l2].columnIDs) >= self.shape.nbColsK):
peers_with_custody_level_2.update({peer_l2})
peers_with_custody_level_2 = list(peers_with_custody_level_2) peers_with_custody_level_2 = list(peers_with_custody_level_2)
if self.ID in peers_with_custody: if self.ID in peers_with_custody:

View File

@ -3,7 +3,7 @@
class Shape: class Shape:
"""This class represents a set of parameters for a specific simulation.""" """This class represents a set of parameters for a specific simulation."""
def __init__(self, nbCols, nbColsK, nbRows, nbRowsK, def __init__(self, nbCols, nbColsK, nbRows, nbRowsK,
numberNodes, failureModel, failureRate, maliciousNodes, custodyRows, custodyCols, minCustodyRows, minCustodyCols, netDegree, bwUplinkProd, run, nodeTypes): numberNodes, failureModel, failureRate, maliciousNodes, custodyRows, custodyCols, minCustodyRows, minCustodyCols, netDegree, numPeersMin, numPeersMax, bwUplinkProd, run, nodeTypes):
"""Initializes the shape with the parameters passed in argument.""" """Initializes the shape with the parameters passed in argument."""
self.run = run self.run = run
self.numberNodes = numberNodes self.numberNodes = numberNodes
@ -15,6 +15,7 @@ class Shape:
self.failureRate = failureRate self.failureRate = failureRate
self.maliciousNodes = maliciousNodes self.maliciousNodes = maliciousNodes
self.netDegree = netDegree self.netDegree = netDegree
self.numPeers = [numPeersMin, numPeersMax]
self.custodyRows = custodyRows self.custodyRows = custodyRows
self.custodyCols = custodyCols self.custodyCols = custodyCols
self.minCustodyRows = minCustodyRows self.minCustodyRows = minCustodyRows
@ -43,6 +44,7 @@ class Shape:
shastr += "-r-"+str(self.run) shastr += "-r-"+str(self.run)
shastr += "-mn-"+str(self.maliciousNodes) shastr += "-mn-"+str(self.maliciousNodes)
shastr += "-ntypes-"+str(self.nodeTypes['group']) shastr += "-ntypes-"+str(self.nodeTypes['group'])
shastr += "-np-"+str(self.numPeers)
return shastr return shastr
def setSeed(self, seed): def setSeed(self, seed):

View File

@ -236,6 +236,27 @@ class Simulator:
self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format) self.logger.debug("Val %d : rowN %s", i, self.validators[i].rowNeighbors, extra=self.format)
self.logger.debug("Val %d : colN %s", i, self.validators[i].columnNeighbors, extra=self.format) self.logger.debug("Val %d : colN %s", i, self.validators[i].columnNeighbors, extra=self.format)
def connect_peers(self):
connections_range = self.shape.numPeers
for peer in self.validators:
num_connections = random.randint(connections_range[0], connections_range[1])
available_peers = [i for i in range(self.shape.numberNodes)]
for neighbor_dict in [peer.rowNeighbors, peer.columnNeighbors]:
for inner_dict in neighbor_dict.values():
for peers in inner_dict.values():
peer.peer_connections.add(peers.node.ID)
available_peers = list(set(available_peers) - peer.peer_connections)
random.shuffle(available_peers)
while len(peer.peer_connections) < num_connections and available_peers:
other_peer = available_peers.pop()
if other_peer != peer.ID and len(self.validators[other_peer].peer_connections) < num_connections:
peer.peer_connections.add(other_peer)
self.validators[other_peer].peer_connections.add(peer.ID)
def initLogger(self): def initLogger(self):
"""It initializes the logger.""" """It initializes the logger."""
logging.TRACE = 5 logging.TRACE = 5
@ -429,4 +450,5 @@ class Simulator:
self.result.addMetric("progress", progress.to_dict(orient='list')) self.result.addMetric("progress", progress.to_dict(orient='list'))
self.result.populate(self.shape, self.config, missingVector) self.result.populate(self.shape, self.config, missingVector)
self.result.copyValidators(self.validators) self.result.copyValidators(self.validators)
print(self.validators[1].statsTxPerSlot)
return self.result return self.result

View File

@ -68,6 +68,9 @@ heartbeat = 20
# Per-topic mesh neighborhood size # Per-topic mesh neighborhood size
netDegrees = range(8, 9, 2) netDegrees = range(8, 9, 2)
# Number of peers for sampling
numPeers = [[50, 150]]
# How many copies are sent out by the block producer # How many copies are sent out by the block producer
# Note, previously this was set to match netDegree # Note, previously this was set to match netDegree
proposerPublishToR = "shape.netDegree" proposerPublishToR = "shape.netDegree"
@ -169,19 +172,32 @@ def nextShape():
"minCustodyCols": minCustodyCols, "minCustodyCols": minCustodyCols,
"numberNodes": numberNodes, "numberNodes": numberNodes,
"netDegrees": netDegrees, "netDegrees": netDegrees,
"numPeers": numPeers,
"bwUplinksProd": bwUplinksProd, "bwUplinksProd": bwUplinksProd,
"nodeTypesGroup": nodeTypesGroup, "nodeTypesGroup": nodeTypesGroup,
} }
for key, value in params.items(): for key, value in params.items():
if not value: if not value:
logging.warning(f"The parameter '{key}' is empty. Please assign a value and start the simulation.") logging.warning(f"The parameter '{key}' is empty. Please assign a value and start the simulation.")
exit(1) exit(1)
for nbCols, nbColsK, nbRows, nbRowsK, run, fm, fr, mn, chR, chC, minChR, minChC, nn, netDegree, bwUplinkProd, nodeTypes in itertools.product( for (
cols, colsK, rows, rowsK, runs, failureModels, failureRates, maliciousNodes, custodyRows, custodyCols, minCustodyRows, minCustodyCols, numberNodes, netDegrees, bwUplinksProd, nodeTypesGroup): nbCols, nbColsK, nbRows, nbRowsK, run, fm, fr, mn, chR, chC, minChR, minChC,
# Network Degree has to be an even number nn, netDegree, numPeersList, bwUplinkProd, nodeTypes
) in itertools.product(
cols, colsK, rows, rowsK, runs, failureModels, failureRates, maliciousNodes,
custodyRows, custodyCols, minCustodyRows, minCustodyCols, numberNodes,
netDegrees, numPeers, bwUplinksProd, nodeTypesGroup
):
numPeersMin, numPeersMax = numPeersList # Unpack here
# Ensure netDegree is even
if netDegree % 2 == 0: if netDegree % 2 == 0:
shape = Shape(nbCols, nbColsK, nbRows, nbRowsK, nn, fm, fr, mn, chR, chC, minChR, minChC, netDegree, bwUplinkProd, run, nodeTypes) shape = Shape(
nbCols, nbColsK, nbRows, nbRowsK, nn, fm, fr, mn, chR, chC, minChR,
minChC, netDegree, numPeersMin, numPeersMax, bwUplinkProd, run, nodeTypes
)
yield shape yield shape
def evalConf(self, param, shape = None): def evalConf(self, param, shape = None):

View File

@ -43,6 +43,7 @@ def runOnce(config, shape, execID):
sim.initLogger() sim.initLogger()
sim.initValidators() sim.initValidators()
sim.initNetwork() sim.initNetwork()
sim.connect_peers()
result = sim.run() result = sim.run()
sim.logger.info("Shape: %s ... Block Available: %d in %d steps" % (str(sim.shape.__dict__), result.blockAvailable, len(result.missingVector)), extra=sim.format) sim.logger.info("Shape: %s ... Block Available: %d in %d steps" % (str(sim.shape.__dict__), result.blockAvailable, len(result.missingVector)), extra=sim.format)