1
1
import random
2
2
from typing import List
3
3
4
+
4
5
class Validator :
5
6
"""
6
7
Represents a validator in a Proof of Stake system.
7
-
8
+
8
9
Attributes:
9
10
name (str): The name of the validator.
10
11
stake (int): The amount of stake (coins) the validator holds.
11
12
"""
13
+
12
14
def __init__ (self , name : str , stake : int ):
13
15
"""
14
16
Initializes a new validator with a given name and stake.
15
-
17
+
16
18
Args:
17
19
name (str): The name of the validator.
18
20
stake (int): The amount of stake the validator has.
19
21
"""
20
22
self .name = name
21
23
self .stake = stake
22
24
25
+
23
26
def choose_validator (validators : List [Validator ]) -> Validator :
24
27
"""
25
28
Selects a validator to create the next block based on the weight of their stake.
26
-
29
+
27
30
The higher the stake, the greater the chance to be selected.
28
-
31
+
29
32
Args:
30
33
validators (List[Validator]): A list of Validator objects.
31
-
34
+
32
35
Returns:
33
36
Validator: The selected validator based on weighted random selection.
34
-
37
+
35
38
Example:
36
39
>>> validators = [Validator("Alice", 50), Validator("Bob", 30), Validator("Charlie", 20)]
37
40
>>> chosen = choose_validator(validators)
@@ -40,6 +43,7 @@ def choose_validator(validators: List[Validator]) -> Validator:
40
43
"""
41
44
total_stake = sum (v .stake for v in validators )
42
45
weighted_validators = [(v , v .stake / total_stake ) for v in validators ]
43
- selected = random .choices ([v [0 ] for v in weighted_validators ],
44
- weights = [v [1 ] for v in weighted_validators ])
46
+ selected = random .choices (
47
+ [v [0 ] for v in weighted_validators ], weights = [v [1 ] for v in weighted_validators ]
48
+ )
45
49
return selected [0 ]
0 commit comments