77% % API Function Exports
88% % ------------------------------------------------------------------
99
10- -export ([start_link /0 ,chainstate /0 ,bbyb_sync /3 ,receive_block /2 ,tpiccall /3 ]).
10+ -export ([start_link /0 ,chainstate /0 ,bbyb_sync /3 ,receive_block /2 ,tpiccall /3 , sort_rnd / 1 ]).
1111
1212% % ------------------------------------------------------------------
1313% % gen_server Function Exports
@@ -31,17 +31,27 @@ chainstate() ->
3131 ))++ [{self ,gen_server :call (blockchain_reader ,sync_req )}],
3232% io:format("Cand ~p~n",[Candidates]),
3333 ChainState = lists :foldl ( % first suitable will be the quickest
34- fun ({_ , #{chain := _HisChain ,
34+ fun ({PK0 , #{chain := _HisChain ,
3535 % null:=<<"sync_available">>,
3636 last_hash := Hash ,
3737 last_temp := Tmp ,
3838 % prev_hash:=PHash,
3939 last_height := Heig
4040 }= A
4141 }, Acc ) ->
42+ PK = case PK0 of
43+ self -> nodekey :node_name ();
44+ {HisKey ,_ ,_ } ->
45+ case chainsettings :is_our_node (HisKey ) of
46+ false ->
47+ hex :encode (HisKey );
48+ OurName ->
49+ OurName
50+ end
51+ end ,
4252 PHash = maps :get (prev_hash ,A ,<<0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 >>),
4353 maps :put ({Heig , Hash , PHash , Tmp },
44- maps :get ({Heig , Hash , PHash , Tmp }, Acc , 0 ) + 1 , Acc );
54+ [ PK | maps :get ({Heig , Hash , PHash , Tmp }, Acc , [])] , Acc );
4555 ({_ , _ }, Acc ) ->
4656 Acc
4757 end , #{}, Candidates ),
@@ -54,7 +64,7 @@ chainstate() ->
5464 " :" ,blkid (Has ),
5565 " /" ,blkid (PHas )," :" ,
5666 integer_to_list (if Tmp == false -> 0 ; true -> Tmp end )
57- ]),V ,Acc )
67+ ]),length ( V ) ,Acc )
5868 end , #{}, ChainState )),
5969 ChainState .
6070
@@ -243,11 +253,10 @@ handle_info(runsync, State) ->
243253 Candidates = case maps :get (sync_candidates , State , []) of
244254 [] ->
245255 ? LOG_DEBUG (" use default list of candidates" ),
246- lists :reverse (
247- tpiccall (<<" blockchain" >>,
248- #{null => <<" sync_request" >>},
249- [last_hash , last_height , chain , last_temp ]
250- ));
256+ sort_rnd (tpiccall (<<" blockchain" >>,
257+ #{null => <<" sync_request" >>},
258+ [last_hash , last_height , chain , last_temp ]
259+ ));
251260 SavedCandidates ->
252261 ? LOG_DEBUG (" use saved list of candidates" ),
253262 SavedCandidates
@@ -262,15 +271,15 @@ handle_info({runsync, Candidates}, State) ->
262271 }, hash := MyLastHash }= MyLast = blockchain :last_meta (),
263272
264273 B = tpiccall (<<" blockchain" >>,
265- #{null => <<" sync_request" >>},
266- [last_hash , last_height , chain , last_temp ]
267- ),
274+ #{null => <<" sync_request" >>},
275+ [last_hash , last_height , chain , last_temp ]
276+ ),
268277 Hack_Candidates = lists :foldl (
269278 fun ({{A1 ,B1 ,_ },_ }= Elem , Acc ) ->
270279 maps :put ({A1 ,B1 },Elem ,Acc )
271280 end , #{}, B ),
272281
273- Candidate = lists :foldl ( % first suitable will be the quickest
282+ Candidate = lists :foldl (
274283 fun
275284 ({{A2 ,B2 ,_ }, undefined }, undefined ) ->
276285 case maps :find ({A2 ,B2 },Hack_Candidates ) of
@@ -589,4 +598,10 @@ skip_candidate(default)->
589598skip_candidate (Candidates ) when is_list (Candidates ) ->
590599 tl (Candidates ).
591600
601+ sort_rnd (List ) ->
602+ List0 = [ {rand :uniform (), I } || I <- List ],
603+ List1 = lists :keysort (1 , List0 ),
604+ [ E || {_ ,E } <- List1 ].
605+
606+
592607% % ------------------------------------------------------------------
0 commit comments