@@ -10,13 +10,15 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
10
10
require Logger
11
11
12
12
alias LambdaEthereumConsensus.StateTransition.Misc
13
+ alias LambdaEthereumConsensus.Store.CheckpointStates
13
14
alias LambdaEthereumConsensus.Validator
15
+ alias LambdaEthereumConsensus.Validator.Duties
14
16
15
- @ type validators :: % { atom ( ) => list ( Validator . state ( ) ) }
17
+ @ type validators :: % { atom ( ) => % { } | [ ] }
16
18
@ type t :: % __MODULE__ {
17
- epoch: Types . epoch ( ) ,
18
- slot: Types . slot ( ) ,
19
- head_root: Types . root ( ) ,
19
+ epoch: Types . epoch ( ) | nil ,
20
+ slot: Types . slot ( ) | nil ,
21
+ head_root: Types . root ( ) | nil ,
20
22
validators: validators ( )
21
23
}
22
24
@@ -44,18 +46,33 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
44
46
defp setup_validators ( slot , head_root , keystore_dir , keystore_pass_dir ) do
45
47
validator_keys = decode_validator_keys ( keystore_dir , keystore_pass_dir )
46
48
47
- validators = Enum . map ( validator_keys , & Validator . new ( { slot , head_root , & 1 } ) )
49
+ epoch = Misc . compute_epoch_at_slot ( slot )
50
+ beacon = fetch_target_state! ( epoch , head_root )
51
+
52
+ validators = Map . new ( validator_keys , fn validator_key ->
53
+ validator = Validator . new ( validator_key , epoch , slot , head_root , beacon )
54
+ { validator . validator . index , validator }
55
+ end )
48
56
49
57
Logger . info ( "[Validator] Initialized #{ Enum . count ( validators ) } validators" )
50
58
59
+ proposers = Duties . compute_proposers_for_epoch ( beacon , epoch , validators )
60
+
51
61
% __MODULE__ {
52
- epoch: Misc . compute_epoch_at_slot ( slot ) ,
62
+ epoch: epoch ,
53
63
slot: slot ,
54
64
head_root: head_root ,
55
- validators: % { uninitialized: validators }
65
+ validators: % {
66
+ proposers: proposers ,
67
+ uninitialized: validators }
56
68
}
57
69
end
58
70
71
+ defp fetch_target_state! ( epoch , head_root ) do
72
+ { :ok , state } = CheckpointStates . compute_target_checkpoint_state ( epoch , head_root )
73
+ state
74
+ end
75
+
59
76
@ doc """
60
77
Notify all validators of a new head.
61
78
"""
@@ -64,7 +81,9 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
64
81
uninitialized_validators =
65
82
maybe_debug_notify (
66
83
fn ->
67
- Enum . map ( validators , & Validator . handle_new_head ( slot , head_root , & 1 ) )
84
+ Map . new ( validators , fn { k , v } ->
85
+ { k , Validator . handle_new_head ( slot , head_root , v ) }
86
+ end )
68
87
end ,
69
88
{ :new_head , slot , head_root }
70
89
)
@@ -80,7 +99,9 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
80
99
uninitialized_validators =
81
100
maybe_debug_notify (
82
101
fn ->
83
- Enum . map ( validators , & Validator . handle_tick ( slot_data , & 1 ) )
102
+ Map . new ( validators , fn { k , v } ->
103
+ { k , Validator . handle_tick ( slot_data , v ) }
104
+ end )
84
105
end ,
85
106
{ :on_tick , slot_data }
86
107
)
0 commit comments