Updated proof_of_stake.py

This commit is contained in:
DIVYASREE S 2024-10-10 21:17:13 +05:30 committed by GitHub
parent f467cec98a
commit 28df0f3c9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,14 +1,15 @@
import random import random
from typing import List
class Validator: class Validator:
""" """
Represents a validator in a Proof of Stake system. Represents a validator in a Proof of Stake system.
Attributes: Attributes:
name (str): The name of the validator. name (str): The name of the validator.
stake (int): The amount of stake (coins) the validator holds. stake (int): The amount of stake (coins) the validator holds.
""" """
def __init__(self, name, stake): def __init__(self, name: str, stake: int):
""" """
Initializes a new validator with a given name and stake. Initializes a new validator with a given name and stake.
@ -17,34 +18,28 @@ class Validator:
stake (int): The amount of stake the validator has. stake (int): The amount of stake the validator has.
""" """
self.name = name self.name = name
self.stake = stake # Stake defines how much weight the validator has. self.stake = stake
def choose_validator(validators): def choose_validator(validators: List[Validator]) -> Validator:
""" """
Selects a validator to create the next block based on the weight of their stake. Selects a validator to create the next block based on the weight of their stake.
The higher the stake, the greater the chance to be selected. The higher the stake, the greater the chance to be selected.
Args: Args:
validators (list): A list of Validator objects. validators (List[Validator]): A list of Validator objects.
Returns: Returns:
Validator: The selected validator based on weighted random selection. Validator: The selected validator based on weighted random selection.
Example:
>>> validators = [Validator("Alice", 50), Validator("Bob", 30), Validator("Charlie", 20)]
>>> chosen = choose_validator(validators)
>>> isinstance(chosen, Validator)
True
""" """
# Total stake of all validators
total_stake = sum(v.stake for v in validators) total_stake = sum(v.stake for v in validators)
# Create a list of validators with weights (probability of being chosen)
weighted_validators = [(v, v.stake / total_stake) for v in validators] weighted_validators = [(v, v.stake / total_stake) for v in validators]
# Randomly select a validator based on their stake weight
selected = random.choices([v[0] for v in weighted_validators], selected = random.choices([v[0] for v in weighted_validators],
weights=[v[1] for v in weighted_validators]) weights=[v[1] for v in weighted_validators])
return selected[0] return selected[0]
# Example of validators with different stakes
validators = [Validator("Alice", 50), Validator("Bob", 30), Validator("Charlie", 20)]
# Select a validator based on their stake
chosen_validator = choose_validator(validators)
print(f"Chosen validator: {chosen_validator.name}")