@@ -58,24 +58,27 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
58
58
59
59
Logger . info ( "[Validator] Initialized #{ Enum . count ( validators ) } validators" )
60
60
61
- { :ok , proposers } = Duties . compute_proposers_for_epoch ( beacon , epoch , validators )
62
- { :ok , attesters } = Duties . compute_attesters_for_epoch ( beacon , epoch , validators )
63
-
64
- Logger . info ( "[Validator] Proposers: #{ inspect ( proposers , pretty: true ) } " )
65
- Logger . info ( "[Validator] Attesters: #{ inspect ( attesters , pretty: true ) } " )
61
+ duties = compute_duties_for_epoch! ( beacon , epoch , validators )
66
62
67
63
% __MODULE__ {
68
64
epoch: epoch ,
69
65
slot: slot ,
70
66
head_root: head_root ,
71
- duties: % { epoch => % {
72
- proposers: proposers ,
73
- attesters: attesters
74
- } } ,
67
+ duties: % { epoch => duties } ,
75
68
validators: validators
76
69
}
77
70
end
78
71
72
+ defp compute_duties_for_epoch! ( beacon , epoch , validators ) do
73
+ { :ok , proposers } = Duties . compute_proposers_for_epoch ( beacon , epoch , validators )
74
+ { :ok , attesters } = Duties . compute_attesters_for_epoch ( beacon , epoch , validators )
75
+
76
+ Logger . info ( "[Validator] Proposer duties for epoch #{ epoch } are: #{ inspect ( proposers , pretty: true ) } " )
77
+ Logger . info ( "[Validator] Attester duties for epoch #{ epoch } are: #{ inspect ( attesters , pretty: true ) } " )
78
+
79
+ % { proposers: proposers , attesters: attesters }
80
+ end
81
+
79
82
defp fetch_target_state! ( epoch , head_root ) do
80
83
{ :ok , state } = CheckpointStates . compute_target_checkpoint_state ( epoch , head_root )
81
84
state
@@ -86,14 +89,31 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
86
89
"""
87
90
@ spec notify_head ( t ( ) , Types . slot ( ) , Types . root ( ) ) :: t ( )
88
91
def notify_head ( % { validators: validators , epoch: epoch } = set , slot , head_root ) do
92
+ # TODO: Just for testing purposes, remove it later
93
+ Logger . info ( "[Validator] Notifying all Validators with new_head" , root: head_root , slot: slot )
94
+
89
95
set
96
+ |> update_state ( slot , head_root )
90
97
|> attest ( epoch , slot )
91
98
|> build_next_payload ( epoch , slot , head_root )
92
- |> update_state ( slot , head_root )
93
99
end
94
100
95
101
defp update_state ( set , slot , head_root ) do
96
- % { set | slot: slot , head_root: head_root }
102
+ if new_epoch? ( set , slot + 1 ) do
103
+ epoch = Misc . compute_epoch_at_slot ( slot + 1 )
104
+ beacon = fetch_target_state! ( epoch , head_root )
105
+
106
+ duties = compute_duties_for_epoch! ( beacon , epoch , set . validators )
107
+
108
+ % { set | epoch: epoch , slot: slot , head_root: head_root , duties: Map . put ( set . duties , epoch , duties ) }
109
+ else
110
+ % { set | slot: slot , head_root: head_root }
111
+ end
112
+ end
113
+
114
+ defp new_epoch? ( set , slot ) do
115
+ epoch = Misc . compute_epoch_at_slot ( slot )
116
+ epoch > set . epoch
97
117
end
98
118
99
119
defp attest ( set , epoch , slot ) do
@@ -119,7 +139,7 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
119
139
validator = Map . get ( set . validators , validator_index )
120
140
updated_validator = Validator . start_payload_builder ( validator , slot + 1 , head_root )
121
141
122
- % { set | validators: Map . put ( set . validators , updated_validator . validator . index , updated_validator ) }
142
+ % { set | validators: Map . put ( set . validators , updated_validator . validator . index , % { updated_validator | root: head_root } ) }
123
143
end
124
144
end
125
145
@@ -139,12 +159,12 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
139
159
Notify all validators of a new tick.
140
160
"""
141
161
@ spec notify_tick ( t ( ) , tuple ( ) ) :: t ( )
142
- def notify_tick ( % { validators: validators } = set , slot_data ) do
162
+ def notify_tick ( % { validators: validators , head_root: head_root } = set , slot_data ) do
143
163
validators =
144
164
maybe_debug_notify (
145
165
fn ->
146
166
Map . new ( validators , fn { k , v } ->
147
- { k , Validator . handle_tick ( slot_data , v ) }
167
+ { k , Validator . handle_tick ( slot_data , v , head_root ) }
148
168
end )
149
169
end ,
150
170
{ :on_tick , slot_data }
@@ -154,14 +174,14 @@ defmodule LambdaEthereumConsensus.ValidatorSet do
154
174
end
155
175
156
176
defp maybe_debug_notify ( fun , data ) do
157
- if Application . get_env ( :logger , :level ) == :debug do
158
- Logger . debug ( "[Validator] Notifying all Validators with message: #{ inspect ( data ) } " )
177
+ if Application . get_env ( :logger , :level ) == :info do # : debug do
178
+ Logger . info ( "[Validator] Notifying all Validators with message: #{ inspect ( data ) } " )
159
179
160
180
start_time = System . monotonic_time ( :millisecond )
161
181
result = fun . ( )
162
182
end_time = System . monotonic_time ( :millisecond )
163
183
164
- Logger . debug (
184
+ Logger . info (
165
185
"[Validator] #{ inspect ( data ) } notified to all Validators after #{ end_time - start_time } ms"
166
186
)
167
187
0 commit comments