@@ -65,7 +65,7 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
65
65
66
66
@ type init_arg ::
67
67
{ :genesis_time , Types . uint64 ( ) }
68
- | { :validators , % { } }
68
+ | { :validator_set , ValidatorSet . t ( ) }
69
69
| { :listen_addr , [ String . t ( ) ] }
70
70
| { :enable_discovery , boolean ( ) }
71
71
| { :discovery_addr , String . t ( ) }
@@ -388,7 +388,7 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
388
388
@ impl GenServer
389
389
def init ( args ) do
390
390
{ genesis_time , args } = Keyword . pop! ( args , :genesis_time )
391
- { validators , args } = Keyword . pop ( args , :validators , % { } )
391
+ { validator_set , args } = Keyword . pop ( args , :validator_set , % { } )
392
392
{ join_init_topics , args } = Keyword . pop ( args , :join_init_topics , false )
393
393
{ enable_request_handlers , args } = Keyword . pop ( args , :enable_request_handlers , false )
394
394
@@ -416,7 +416,7 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
416
416
{ :ok ,
417
417
% {
418
418
genesis_time: genesis_time ,
419
- validators: validators ,
419
+ validator_set: validator_set ,
420
420
slot_data: nil ,
421
421
port: port ,
422
422
subscribers: % { } ,
@@ -514,11 +514,11 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
514
514
end
515
515
516
516
@ impl GenServer
517
- def handle_info ( { :new_head , slot , head_root } , % { validators: validators } = state ) do
518
- updated_validators =
519
- ValidatorSet . notify_head ( validators , slot , head_root )
517
+ def handle_info ( { :new_head , slot , head_root } , % { validator_set: validator_set } = state ) do
518
+ updated_validator_set =
519
+ ValidatorSet . notify_head ( validator_set , slot , head_root )
520
520
521
- { :noreply , % { state | validators: updated_validators } }
521
+ { :noreply , % { state | validator_set: updated_validator_set } }
522
522
end
523
523
524
524
@ impl GenServer
@@ -540,18 +540,20 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
540
540
end
541
541
542
542
@ impl GenServer
543
- def handle_call ( :get_keystores , _from , % { validators: validators } = state ) ,
544
- do: { :reply , Enum . map ( validators , fn { _pubkey , validator } -> validator . keystore end ) , state }
543
+ def handle_call ( :get_keystores , _from , % { validator_set: validator_set } = state ) ,
544
+ do: { :reply , Enum . map ( validator_set . validators , fn { _index , validator } -> validator . keystore end ) , state }
545
545
546
546
@ impl GenServer
547
- def handle_call ( { :delete_validator , pubkey } , _from , % { validators: validators } = state ) do
548
- case Map . fetch ( validators , pubkey ) do
549
- { :ok , validator } ->
550
- Logger . warning ( "[Libp2pPort] Deleting validator with index #{ inspect ( validator . index ) } ." )
551
-
552
- { :reply , :ok , % { state | validators: Map . delete ( validators , pubkey ) } }
553
-
554
- :error ->
547
+ def handle_call ( { :delete_validator , pubkey } , _from , % { validator_set: validator_set } = state ) do
548
+ validator_set . validators
549
+ |> Enum . find ( fn { _index , validator } -> validator . keystore . pubkey == pubkey end )
550
+ |> case do
551
+ { index , validator } ->
552
+ Logger . warning ( "[Libp2pPort] Deleting validator with index #{ inspect ( index ) } ." )
553
+ updated_validators = Map . delete ( validator_set . validators , index )
554
+ { :reply , :ok , Map . put ( state . validator_set , :validators , updated_validators ) }
555
+
556
+ _ ->
555
557
{ :error , "Pubkey #{ inspect ( pubkey ) } not found." }
556
558
end
557
559
end
@@ -560,26 +562,16 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
560
562
def handle_call (
561
563
{ :add_validator , % Keystore { pubkey: pubkey } = keystore } ,
562
564
_from ,
563
- % { validators: validators } = state
565
+ % { validator_set: % { head_root: head_root } = validator_set , slot_data: { slot , _third } } = state
564
566
) do
565
567
# TODO (#1263): handle 0 validators
566
- first_validator = validators |> Map . values ( ) |> List . first ( )
567
- validator = Validator . new ( { first_validator . slot , first_validator . root , keystore } )
568
+ validator = Validator . new ( keystore , slot , head_root )
568
569
569
570
Logger . warning (
570
571
"[Libp2pPort] Adding validator with index #{ inspect ( validator . index ) } . head_slot: #{ inspect ( validator . slot ) } ."
571
572
)
572
573
573
- { :reply , :ok ,
574
- % {
575
- state
576
- | validators:
577
- Map . put (
578
- validators ,
579
- pubkey ,
580
- validator
581
- )
582
- } }
574
+ { :reply , :ok , put_in ( state . validator_set , [ :validators , validator . index ] , validator ) }
583
575
end
584
576
585
577
######################
@@ -799,10 +791,10 @@ defmodule LambdaEthereumConsensus.Libp2pPort do
799
791
if slot_data == new_slot_data do
800
792
state
801
793
else
802
- updated_validators =
803
- ValidatorSet . notify_tick ( state . validators , new_slot_data )
794
+ updated_validator_set =
795
+ ValidatorSet . notify_tick ( state . validator_set , new_slot_data )
804
796
805
- % { state | slot_data: new_slot_data , validators: updated_validators }
797
+ % { state | slot_data: new_slot_data , validator_set: updated_validator_set }
806
798
end
807
799
808
800
maybe_log_new_slot ( slot_data , new_slot_data )
0 commit comments