From f467cec98a1678f7eabd99d1f8f5fc8df5fb9578 Mon Sep 17 00:00:00 2001 From: DIVYASREE S Date: Thu, 10 Oct 2024 21:12:51 +0530 Subject: [PATCH 1/5] Created proof_of_stake.py --- blockchain/proof_of_stake.py | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 blockchain/proof_of_stake.py diff --git a/blockchain/proof_of_stake.py b/blockchain/proof_of_stake.py new file mode 100644 index 000000000000..8cc451112a75 --- /dev/null +++ b/blockchain/proof_of_stake.py @@ -0,0 +1,50 @@ +import random + +class Validator: + """ + Represents a validator in a Proof of Stake system. + + Attributes: + name (str): The name of the validator. + stake (int): The amount of stake (coins) the validator holds. + """ + def __init__(self, name, stake): + """ + Initializes a new validator with a given name and stake. + + Args: + name (str): The name of the validator. + stake (int): The amount of stake the validator has. + """ + self.name = name + self.stake = stake # Stake defines how much weight the validator has. + +def choose_validator(validators): + """ + 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. + + Args: + validators (list): A list of Validator objects. + + Returns: + Validator: The selected validator based on weighted random selection. + """ + # Total stake of all 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] + + # Randomly select a validator based on their stake weight + selected = random.choices([v[0] for v in weighted_validators], + weights=[v[1] for v in weighted_validators]) + 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}") From 28df0f3c9b0af3b5fd1b7737a575668c3ad786e2 Mon Sep 17 00:00:00 2001 From: DIVYASREE S Date: Thu, 10 Oct 2024 21:17:13 +0530 Subject: [PATCH 2/5] Updated proof_of_stake.py --- blockchain/proof_of_stake.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/blockchain/proof_of_stake.py b/blockchain/proof_of_stake.py index 8cc451112a75..946d7218e9dc 100644 --- a/blockchain/proof_of_stake.py +++ b/blockchain/proof_of_stake.py @@ -1,14 +1,15 @@ import random +from typing import List class Validator: """ Represents a validator in a Proof of Stake system. - + Attributes: name (str): The name of the validator. 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. @@ -17,34 +18,28 @@ def __init__(self, name, stake): stake (int): The amount of stake the validator has. """ 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. The higher the stake, the greater the chance to be selected. Args: - validators (list): A list of Validator objects. + validators (List[Validator]): A list of Validator objects. Returns: 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) - - # Create a list of validators with weights (probability of being chosen) 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], weights=[v[1] for v in weighted_validators]) 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}") From d770fa5bf55a8cfeb632301fdc3d09ad484efa36 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:54:30 +0000 Subject: [PATCH 3/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- blockchain/proof_of_stake.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/blockchain/proof_of_stake.py b/blockchain/proof_of_stake.py index 946d7218e9dc..78dc45c6f05a 100644 --- a/blockchain/proof_of_stake.py +++ b/blockchain/proof_of_stake.py @@ -1,18 +1,20 @@ import random from typing import List + class Validator: """ Represents a validator in a Proof of Stake system. - + Attributes: name (str): The name of the validator. stake (int): The amount of stake (coins) the validator holds. """ + def __init__(self, name: str, stake: int): """ Initializes a new validator with a given name and stake. - + Args: name (str): The name of the validator. stake (int): The amount of stake the validator has. @@ -20,18 +22,19 @@ def __init__(self, name: str, stake: int): self.name = name self.stake = stake + def choose_validator(validators: List[Validator]) -> Validator: """ 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. - + Args: validators (List[Validator]): A list of Validator objects. - + Returns: Validator: The selected validator based on weighted random selection. - + Example: >>> validators = [Validator("Alice", 50), Validator("Bob", 30), Validator("Charlie", 20)] >>> chosen = choose_validator(validators) @@ -40,6 +43,7 @@ def choose_validator(validators: List[Validator]) -> Validator: """ total_stake = sum(v.stake for v in validators) weighted_validators = [(v, v.stake / total_stake) for v in validators] - selected = random.choices([v[0] for v in weighted_validators], - weights=[v[1] for v in weighted_validators]) + selected = random.choices( + [v[0] for v in weighted_validators], weights=[v[1] for v in weighted_validators] + ) return selected[0] From 82064e3a23bbb1fd7dcb115ae255bbc011de17cf Mon Sep 17 00:00:00 2001 From: DIVYASREE S Date: Thu, 10 Oct 2024 21:32:04 +0530 Subject: [PATCH 4/5] Changes to proof_of_stake.py --- blockchain/proof_of_stake.py | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/blockchain/proof_of_stake.py b/blockchain/proof_of_stake.py index 78dc45c6f05a..1cb29ce1e0ef 100644 --- a/blockchain/proof_of_stake.py +++ b/blockchain/proof_of_stake.py @@ -1,17 +1,7 @@ import random -from typing import List - class Validator: - """ - Represents a validator in a Proof of Stake system. - - Attributes: - name (str): The name of the validator. - stake (int): The amount of stake (coins) the validator holds. - """ - - def __init__(self, name: str, stake: int): + def __init__(self, name: str, stake: int) -> None: """ Initializes a new validator with a given name and stake. @@ -22,15 +12,14 @@ def __init__(self, name: str, stake: int): self.name = name self.stake = stake - -def choose_validator(validators: List[Validator]) -> Validator: +def choose_validator(validators: list[Validator]) -> Validator: """ 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. Args: - validators (List[Validator]): A list of Validator objects. + validators (list[Validator]): A list of Validator objects. Returns: Validator: The selected validator based on weighted random selection. @@ -43,7 +32,6 @@ def choose_validator(validators: List[Validator]) -> Validator: """ total_stake = sum(v.stake for v in validators) weighted_validators = [(v, v.stake / total_stake) for v in validators] - selected = random.choices( - [v[0] for v in weighted_validators], weights=[v[1] for v in weighted_validators] - ) + selected = random.choices([v[0] for v in weighted_validators], + weights=[v[1] for v in weighted_validators]) return selected[0] From 2046ea45bcc55f7e76822984f0a3288ecc546a5b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:03:50 +0000 Subject: [PATCH 5/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- blockchain/proof_of_stake.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/blockchain/proof_of_stake.py b/blockchain/proof_of_stake.py index 1cb29ce1e0ef..b988bfe2ff39 100644 --- a/blockchain/proof_of_stake.py +++ b/blockchain/proof_of_stake.py @@ -1,5 +1,6 @@ import random + class Validator: def __init__(self, name: str, stake: int) -> None: """ @@ -12,6 +13,7 @@ def __init__(self, name: str, stake: int) -> None: self.name = name self.stake = stake + def choose_validator(validators: list[Validator]) -> Validator: """ Selects a validator to create the next block based on the weight of their stake. @@ -32,6 +34,7 @@ def choose_validator(validators: list[Validator]) -> Validator: """ total_stake = sum(v.stake for v in validators) weighted_validators = [(v, v.stake / total_stake) for v in validators] - selected = random.choices([v[0] for v in weighted_validators], - weights=[v[1] for v in weighted_validators]) + selected = random.choices( + [v[0] for v in weighted_validators], weights=[v[1] for v in weighted_validators] + ) return selected[0]