@@ -3,25 +3,62 @@ defmodule NodeState do
33
44 def init ( ) do
55 % {
6+ challenges: % { } ,
67 }
78 end
89
10+ #TODO: anti local compute dos here
11+ def handle ( :new_phone_who_dis , istate , term ) do
12+ anr = NodeANR . verify_and_unpack ( term . anr )
13+ if ! ! anr and is_integer ( term . challenge ) and istate . peer . ip == anr . ip4 do
14+ sk = Application . fetch_env! ( :ama , :trainer_sk )
15+ pk = Application . fetch_env! ( :ama , :trainer_pk )
16+ sig = BlsEx . sign! ( sk , << pk :: binary , :erlang . integer_to_binary ( term . challenge ) :: binary >> , BLS12AggSig . dst_anr_challenge ( ) )
17+ send ( NodeGen . get_socket_gen ( ) , { :send_to_some , [ istate . peer . ip ] , compress ( NodeProto . what? ( term . challenge , sig ) ) } )
18+ send ( NodeGen , { :handle_sync , :new_phone_who_dis_ns , istate , % { anr: anr } } )
19+ end
20+ end
21+ def handle ( :new_phone_who_dis_ns , istate , term ) do
22+ NodeANR . insert ( term . anr )
23+ istate . ns
24+ end
25+
26+ def handle ( :what? , istate , term ) do
27+ anr = NodeANR . verify_and_unpack ( term . anr )
28+
29+ #signed within 6 seconds
30+ ts = :os . system_time ( 1 )
31+ delta = abs ( ts - term . challenge )
32+
33+ if ! ! anr and istate . peer . ip == anr . ip4 and delta <= 6 do
34+ challenge_bin = :erlang . integer_to_binary ( term . challenge )
35+ if BlsEx . verify? ( anr . pk , term . signature , << anr . pk :: binary , challenge_bin :: binary >> , BLS12AggSig . dst_anr_challenge ( ) ) do
36+ send ( NodeGen , { :handle_sync , :'what?_ns' , istate , % { pk: anr . pk , anr: anr } } )
37+ end
38+ end
39+ end
40+ def handle ( :'what?_ns' , istate , term ) do
41+ NodeANR . insert ( term . anr )
42+ NodeANR . set_handshaked ( term . anr . pk )
43+ istate . ns
44+ end
45+
946 def handle ( :ping , istate , term ) do
1047 temporal = Entry . unpack ( term . temporal )
1148 rooted = Entry . unpack ( term . rooted )
1249 try do
1350 % { error: :ok , hash: hasht } = Entry . validate_signature ( temporal . header , temporal . signature , temporal . header_unpacked . signer , temporal [ :mask ] )
1451 % { error: :ok , hash: hashr } = Entry . validate_signature ( rooted . header , rooted . signature , rooted . header_unpacked . signer , rooted [ :mask ] )
1552
53+ hasPermissionSlip = NodeANR . handshaked_and_valid_ip4 ( istate . peer . signer , istate . peer . ip )
1654 :erlang . spawn ( fn ( ) ->
17- #txs_packed = TXPool.random()
18- #txs_packed && send(NodeGen.get_socket_gen(), {:send_to_some, [istate.peer.ip], compress(NodeProto.txpool(txs_packed))})
19-
20- rng_peers = NodePeers . random ( 6 ) |> Enum . map ( & & 1 . ip )
21- if rng_peers != [ ] , do: send ( NodeGen . get_socket_gen ( ) , { :send_to_some , [ istate . peer . ip ] , compress ( NodeProto . peers ( rng_peers ) ) } )
55+ if hasPermissionSlip do
56+ anrs = NodeANR . get_random_verified ( 3 )
57+ if anrs != [ ] , do: send ( NodeGen . get_socket_gen ( ) , { :send_to_some , [ istate . peer . ip ] , compress ( NodeProto . peers_v2 ( anrs ) ) } )
58+ end
2259 end )
2360
24- term = % { temporal: Map . put ( temporal , :hash , hasht ) , rooted: Map . put ( rooted , :hash , hashr ) , ts_m: term . ts_m }
61+ term = % { temporal: Map . put ( temporal , :hash , hasht ) , rooted: Map . put ( rooted , :hash , hashr ) , ts_m: term . ts_m , hasPermissionSlip: hasPermissionSlip }
2562 send ( NodeGen , { :handle_sync , :ping_ns , istate , term } )
2663 catch
2764 e , { :badmatch , % { error: :wrong_epoch } } -> nil
@@ -30,23 +67,26 @@ defmodule NodeState do
3067 end
3168 def handle ( :ping_ns , istate , term ) do
3269 peer_ip = istate . peer . ip
33- peer = :ets . lookup_element ( NODEPeers , peer_ip , 2 , % { } )
34- peer = Map . merge ( peer , % {
35- ip: peer_ip ,
36- pk: istate . peer . signer , version: istate . peer . version ,
37- last_ping: :os . system_time ( 1000 ) ,
38- last_msg: :os . system_time ( 1000 ) ,
39- temporal: term . temporal , rooted: term . rooted ,
40- } )
41-
42- peer = if ! ! peer [ :shared_secret ] do peer else
43- shared_key = BlsEx . get_shared_secret! ( istate . peer . signer , Application . fetch_env! ( :ama , :trainer_sk ) )
44- Map . put ( peer , :shared_secret , shared_key )
45- end
4670
47- :ets . insert ( NODEPeers , { peer_ip , peer } )
71+ if term . hasPermissionSlip or ( istate . peer . signer in Consensus . trainers_for_height ( Consensus . chain_height ( ) ) ) do
72+ peer = :ets . lookup_element ( NODEPeers , peer_ip , 2 , % { } )
73+ peer = Map . merge ( peer , % {
74+ ip: peer_ip ,
75+ pk: istate . peer . signer , version: istate . peer . version ,
76+ last_ping: :os . system_time ( 1000 ) ,
77+ last_msg: :os . system_time ( 1000 ) ,
78+ temporal: term . temporal , rooted: term . rooted ,
79+ } )
80+
81+ peer = if ! ! peer [ :shared_secret ] do peer else
82+ shared_key = BlsEx . get_shared_secret! ( istate . peer . signer , Application . fetch_env! ( :ama , :trainer_sk ) )
83+ Map . put ( peer , :shared_secret , shared_key )
84+ end
85+
86+ :ets . insert ( NODEPeers , { peer_ip , peer } )
4887
49- :erlang . spawn ( fn ( ) -> send ( NodeGen . get_socket_gen ( ) , { :send_to_some , [ peer_ip ] , compress ( NodeProto . pong ( term . ts_m ) ) } ) end )
88+ :erlang . spawn ( fn ( ) -> send ( NodeGen . get_socket_gen ( ) , { :send_to_some , [ peer_ip ] , compress ( NodeProto . pong ( term . ts_m ) ) } ) end )
89+ end
5090
5191 istate . ns
5292 end
@@ -73,14 +113,15 @@ defmodule NodeState do
73113 TXPool . insert ( good )
74114 end
75115
76- def handle ( :peers , istate , term ) do
77- send ( NodeGen , { :handle_sync , :peers_ns , istate , term } )
116+ def handle ( :peers_v2 , istate , term ) do
117+ anrs = Enum . map ( term . anrs , & NodeANR . verify_and_unpack ( & 1 ) )
118+ |> Enum . filter ( & & 1 )
119+ term = % { anrs: anrs }
120+ send ( NodeGen , { :handle_sync , :peers_v2_ns , istate , term } )
78121 end
79- def handle ( :peers_ns , istate , term ) do
80- Enum . each ( term . ips , fn ( peer_ip ) ->
81- peer = :ets . lookup_element ( NODEPeers , peer_ip , 2 , % { } )
82- peer = Map . merge ( peer , % { ip: peer_ip } )
83- :ets . insert ( NODEPeers , { peer_ip , peer } )
122+ def handle ( :peers_v2_ns , istate , term ) do
123+ Enum . each ( term . anrs , fn ( anr ) ->
124+ NodeANR . insert ( anr )
84125 end )
85126 istate . ns
86127 end
@@ -93,10 +134,7 @@ defmodule NodeState do
93134 sol . epoch != Consensus . chain_epoch ( ) ->
94135 #IO.inspect {:broadcasted_sol_invalid_epoch, sol.epoch, Consensus.chain_epoch()}
95136 nil
96- sol . epoch < 260 and ! BIC.Sol . verify ( term . sol ) ->
97- IO . inspect { :peer_sent_invalid_sol , :TODO_block_malicious_peer }
98- nil
99- sol . epoch >= 260 and ! BIC.Sol . verify ( term . sol , % { vr_b3: :crypto . strong_rand_bytes ( 32 ) } ) ->
137+ ! BIC.Sol . verify ( term . sol , % { vr_b3: :crypto . strong_rand_bytes ( 32 ) } ) ->
100138 IO . inspect { :peer_sent_invalid_sol , :TODO_block_malicious_peer }
101139 nil
102140 ! BlsEx . verify? ( sol . pk , sol . pop , sol . pk , BLS12AggSig . dst_pop ( ) ) ->
0 commit comments