From 5b32ed9c684fa94d729d9033eff8770029dc7758 Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 13:26:05 +0100 Subject: [PATCH 1/9] Added peers refill (sync) --- apps/aecore/config/dev.exs | 3 + apps/aecore/config/prod.exs | 3 + apps/aecore/config/test.exs | 3 + apps/aecore/lib/aecore/peers/scheduler.ex | 7 +- apps/aecore/lib/aecore/peers/sync.ex | 77 +++++++++++++++++++ .../lib/aecore/peers/worker/supervisor.ex | 3 +- 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 apps/aecore/lib/aecore/peers/sync.ex diff --git a/apps/aecore/config/dev.exs b/apps/aecore/config/dev.exs index a8612f40..71a7be73 100644 --- a/apps/aecore/config/dev.exs +++ b/apps/aecore/config/dev.exs @@ -53,3 +53,6 @@ config :aecore, :pow, version: 1, difficulty_target: 1 } + +config :aecore, :peers, + peers_target_count: 2 diff --git a/apps/aecore/config/prod.exs b/apps/aecore/config/prod.exs index a896ff53..b9521292 100644 --- a/apps/aecore/config/prod.exs +++ b/apps/aecore/config/prod.exs @@ -53,3 +53,6 @@ config :aecore, :pow, version: 1, difficulty_target: 1 } + +config :aecore, :peers, + peers_target_count: 25 diff --git a/apps/aecore/config/test.exs b/apps/aecore/config/test.exs index dce2fdae..7c59bab6 100644 --- a/apps/aecore/config/test.exs +++ b/apps/aecore/config/test.exs @@ -51,3 +51,6 @@ config :aecore, :pow, version: 1, difficulty_target: 1 } + +config :aecore, :peers, + peers_target_count: 2 diff --git a/apps/aecore/lib/aecore/peers/scheduler.ex b/apps/aecore/lib/aecore/peers/scheduler.ex index 357bf7ae..64cbfa20 100644 --- a/apps/aecore/lib/aecore/peers/scheduler.ex +++ b/apps/aecore/lib/aecore/peers/scheduler.ex @@ -1,7 +1,7 @@ defmodule Aecore.Peers.Scheduler do use GenServer - alias Aecore.Peers.Worker, as: Peers + alias Aecore.Peers.Sync, as: PeersSync @check_time 60_000 @@ -10,12 +10,13 @@ defmodule Aecore.Peers.Scheduler do end def init(state) do - schedule_work() + Process.send_after(self(), :work, 5_000) {:ok, state} end def handle_info(:work, state) do - Peers.check_peers() + PeersSync.remove_dead() + PeersSync.refill() schedule_work() {:noreply, state} end diff --git a/apps/aecore/lib/aecore/peers/sync.ex b/apps/aecore/lib/aecore/peers/sync.ex new file mode 100644 index 00000000..64179f06 --- /dev/null +++ b/apps/aecore/lib/aecore/peers/sync.ex @@ -0,0 +1,77 @@ +defmodule Aecore.Peers.Sync do + + @peers_target_count Application.get_env(:aecore, :peers)[:peers_target_count] + + alias Aecore.Peers.Worker, as: Peers + alias Aehttpclient.Client, as: HttpClient + + use GenServer + + require Logger + + def start_link(_args) do + GenServer.start_link(__MODULE__, %{}, name: __MODULE__) + end + + def init(state) do + {:ok, state} + end + + def remove_dead do + Peers.check_peers() + end + + @spec refill :: :ok | {:error, term()} + def refill do + GenServer.call(__MODULE__, :refill) + end + + def handle_call(:refill, _from, state) do + all_peers = Map.keys(Peers.all_peers()) + cond do + all_peers == [] -> + Logger.error(fn -> "No peers" end) + {:reply, {:error, "No peers"}, state} + length(all_peers) < @peers_target_count -> + new_count = get_newpeers_and_add(all_peers) + if new_count > 0 do + Logger.info(fn -> "Aquired #{new_count} new peers" end) + {:reply, :ok, state} + else + Logger.error(fn -> "No new peers added when trying to refill peers" end) + {:reply, {:error, "No new peers added"}, state} + end + true -> + {:reply, :ok, state} + end + end + + defp get_newpeers_and_add(known) do + known_count = length(known) + known_set = MapSet.new(known) + known + |> Enum.shuffle + |> Enum.take(@peers_target_count - known_count) + |> Enum.reduce([], fn(peer, acc) -> + case (HttpClient.get_peers(peer)) do + {:ok, list} -> Enum.concat(list, acc) + :error -> acc + end + end) + |> Enum.reduce([], fn(peer, acc) -> + if MapSet.member?(known_set, peer) do + acc + else + [peer | acc] + end + end) + |> Enum.shuffle + |> Enum.take(Enum.min([@peers_target_count - known_count, known_count])) + |> Enum.reduce(0, fn(peer, acc) -> + case Peers.add_peer(peer) do + :ok -> acc+1 + _ -> acc + end + end) + end +end diff --git a/apps/aecore/lib/aecore/peers/worker/supervisor.ex b/apps/aecore/lib/aecore/peers/worker/supervisor.ex index 5d593f2e..20d35c80 100644 --- a/apps/aecore/lib/aecore/peers/worker/supervisor.ex +++ b/apps/aecore/lib/aecore/peers/worker/supervisor.ex @@ -8,7 +8,8 @@ defmodule Aecore.Peers.Worker.Supervisor do def init(:ok) do children = [ Aecore.Peers.Worker, - Aecore.Peers.Scheduler + Aecore.Peers.Scheduler, + Aecore.Peers.Sync ] Supervisor.init(children, strategy: :one_for_one) From 09e076053ab76e8f5a50b78c33fc9c3a902b0b83 Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 14:45:16 +0100 Subject: [PATCH 2/9] Known peers count limit --- apps/aecore/config/dev.exs | 3 +- apps/aecore/config/prod.exs | 3 +- apps/aecore/config/test.exs | 4 +- apps/aecore/lib/aecore/peers/worker.ex | 67 +++++++++++++++++--------- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/apps/aecore/config/dev.exs b/apps/aecore/config/dev.exs index 71a7be73..ede8d3bb 100644 --- a/apps/aecore/config/dev.exs +++ b/apps/aecore/config/dev.exs @@ -55,4 +55,5 @@ config :aecore, :pow, } config :aecore, :peers, - peers_target_count: 2 + peers_target_count: 2, + peers_max_count: 4 diff --git a/apps/aecore/config/prod.exs b/apps/aecore/config/prod.exs index b9521292..11dc49d2 100644 --- a/apps/aecore/config/prod.exs +++ b/apps/aecore/config/prod.exs @@ -55,4 +55,5 @@ config :aecore, :pow, } config :aecore, :peers, - peers_target_count: 25 + peers_target_count: 25, + peers_max_count: 50 diff --git a/apps/aecore/config/test.exs b/apps/aecore/config/test.exs index 7c59bab6..79603cc3 100644 --- a/apps/aecore/config/test.exs +++ b/apps/aecore/config/test.exs @@ -53,4 +53,6 @@ config :aecore, :pow, } config :aecore, :peers, - peers_target_count: 2 + peers_target_count: 2, + peers_max_count: 4 + diff --git a/apps/aecore/lib/aecore/peers/worker.ex b/apps/aecore/lib/aecore/peers/worker.ex index b620e4e6..e93df486 100644 --- a/apps/aecore/lib/aecore/peers/worker.ex +++ b/apps/aecore/lib/aecore/peers/worker.ex @@ -15,6 +15,9 @@ defmodule Aecore.Peers.Worker do require Logger @mersenne_prime 2147483647 + @peers_max_count Application.get_env(:aecore, :peers)[:peers_max_count] + @probability_of_peer_remove_when_max 0.5 + def start_link(_args) do GenServer.start_link(__MODULE__, %{peers: %{}, nonce: :rand.uniform(@mersenne_prime)}, name: __MODULE__) @@ -72,28 +75,48 @@ defmodule Aecore.Peers.Worker do {:ok, initial_peers} end -def handle_call({:add_peer,uri}, _from, %{peers: peers, nonce: own_nonce} = state) do - case(Client.get_info(uri)) do - {:ok, info} -> - case own_nonce == info.peer_nonce do - false -> - if(info.genesis_block_hash == genesis_block_header_hash()) do - updated_peers = Map.put(peers, uri, info.current_block_hash) - Logger.info(fn -> "Added #{uri} to the peer list" end) - {:reply, :ok, %{state | peers: updated_peers}} - else - Logger.error(fn -> - "Failed to add #{uri}, genesis header hash not valid" end) - {:reply, {:error, "Genesis header hash not valid"}, %{state | peers: peers}} - end - true -> - Logger.debug(fn -> - "Failed to add #{uri}, equal peer nonces" end) - {:reply, {:error, "Equal peer nonces"}, %{state | peers: peers}} - end - :error -> - Logger.error("GET /info request error") - {:reply, :error, %{state | peers: peers}} + def handle_call({:add_peer,uri}, _from, %{peers: peers, nonce: own_nonce} = state) do + if Map.has_key?(peers, uri) do + Logger.debug(fn -> + "Skipped adding #{uri}, already known" end) + {:reply, {:error, "Peer already known"}, state} + else + case(Client.get_info(uri)) do + {:ok, info} -> + case own_nonce == info.peer_nonce do + false -> + if(info.genesis_block_hash == genesis_block_header_hash()) do + if map_size(peers) < @peers_max_count + || :rand.uniform() < @probability_of_peer_remove_when_max do + peers_update1 = + if map_size(peers) >= @peers_max_count do + random_peer = Enum.random(Map.keys(peers)) + Logger.debug(fn -> "Max peers reached. #{random_peer} removed" end) + Map.delete(peers, random_peer) + else + peers + end + updated_peers = Map.put(peers_update1, uri, info.current_block_hash) + Logger.info(fn -> "Added #{uri} to the peer list" end) + {:reply, :ok, %{state | peers: updated_peers}} + else + Logger.debug(fn -> "Max peers reached. #{uri} not added" end) + {:reply, :ok, state} + end + else + Logger.error(fn -> + "Failed to add #{uri}, genesis header hash not valid" end) + {:reply, {:error, "Genesis header hash not valid"}, %{state | peers: peers}} + end + true -> + Logger.debug(fn -> + "Failed to add #{uri}, equal peer nonces" end) + {:reply, {:error, "Equal peer nonces"}, %{state | peers: peers}} + end + :error -> + Logger.error("GET /info request error") + {:reply, :error, %{state | peers: peers}} + end end end From 9dc8f5806a08cfc02dc64271f3ecc9b9538d567e Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 15:08:42 +0100 Subject: [PATCH 3/9] Removing peers to introduce variety --- apps/aecore/lib/aecore/peers/scheduler.ex | 1 + apps/aecore/lib/aecore/peers/sync.ex | 24 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/aecore/lib/aecore/peers/scheduler.ex b/apps/aecore/lib/aecore/peers/scheduler.ex index 64cbfa20..39ba1337 100644 --- a/apps/aecore/lib/aecore/peers/scheduler.ex +++ b/apps/aecore/lib/aecore/peers/scheduler.ex @@ -16,6 +16,7 @@ defmodule Aecore.Peers.Scheduler do def handle_info(:work, state) do PeersSync.remove_dead() + PeersSync.introduce_variety() PeersSync.refill() schedule_work() {:noreply, state} diff --git a/apps/aecore/lib/aecore/peers/sync.ex b/apps/aecore/lib/aecore/peers/sync.ex index 64179f06..fae2f5a8 100644 --- a/apps/aecore/lib/aecore/peers/sync.ex +++ b/apps/aecore/lib/aecore/peers/sync.ex @@ -26,13 +26,31 @@ defmodule Aecore.Peers.Sync do GenServer.call(__MODULE__, :refill) end + @spec introduce_variety :: :ok + def introduce_variety do + GenServer.call(__MODULE__, :introduce_variety) + end + + def handle_call(:introduce_variety, _from, state) do + peers_count = map_size(Peers.all_peers()) + if peers_count >= @peers_target_count do + random_peer = Enum.random(Map.keys(Peers.all_peers())) + Logger.info(fn -> "Removing #{random_peer} to introduce variety" end) + Peers.remove_peer(random_peer) + {:reply, :ok, state} + else + {:reply, :ok, state} + end + end + def handle_call(:refill, _from, state) do - all_peers = Map.keys(Peers.all_peers()) + peers_count = map_size(Peers.all_peers()) cond do - all_peers == [] -> + peers_count == 0 -> Logger.error(fn -> "No peers" end) {:reply, {:error, "No peers"}, state} - length(all_peers) < @peers_target_count -> + peers_count < @peers_target_count -> + all_peers = Map.keys(Peers.all_peers()) new_count = get_newpeers_and_add(all_peers) if new_count > 0 do Logger.info(fn -> "Aquired #{new_count} new peers" end) From 32f6ddda09f349ee9da60776c21253afd6b5a94d Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 15:12:48 +0100 Subject: [PATCH 4/9] Merged Peers.Scheduler with Peers.Sync --- apps/aecore/lib/aecore/peers/scheduler.ex | 28 ------------- apps/aecore/lib/aecore/peers/sync.ex | 40 +++++++++++-------- .../lib/aecore/peers/worker/supervisor.ex | 1 - 3 files changed, 23 insertions(+), 46 deletions(-) delete mode 100644 apps/aecore/lib/aecore/peers/scheduler.ex diff --git a/apps/aecore/lib/aecore/peers/scheduler.ex b/apps/aecore/lib/aecore/peers/scheduler.ex deleted file mode 100644 index 39ba1337..00000000 --- a/apps/aecore/lib/aecore/peers/scheduler.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule Aecore.Peers.Scheduler do - use GenServer - - alias Aecore.Peers.Sync, as: PeersSync - - @check_time 60_000 - - def start_link(_args) do - GenServer.start_link(__MODULE__, %{}) - end - - def init(state) do - Process.send_after(self(), :work, 5_000) - {:ok, state} - end - - def handle_info(:work, state) do - PeersSync.remove_dead() - PeersSync.introduce_variety() - PeersSync.refill() - schedule_work() - {:noreply, state} - end - - defp schedule_work() do - Process.send_after(self(), :work, @check_time) - end -end diff --git a/apps/aecore/lib/aecore/peers/sync.ex b/apps/aecore/lib/aecore/peers/sync.ex index fae2f5a8..51d88aec 100644 --- a/apps/aecore/lib/aecore/peers/sync.ex +++ b/apps/aecore/lib/aecore/peers/sync.ex @@ -1,5 +1,6 @@ defmodule Aecore.Peers.Sync do - + + @check_time 60_000 @peers_target_count Application.get_env(:aecore, :peers)[:peers_target_count] alias Aecore.Peers.Worker, as: Peers @@ -14,53 +15,58 @@ defmodule Aecore.Peers.Sync do end def init(state) do + Process.send_after(self(), :work, 5_000) {:ok, state} end - def remove_dead do - Peers.check_peers() + def handle_info(:work, state) do + remove_dead() + introduce_variety() + refill() + schedule_work() + {:noreply, state} end - @spec refill :: :ok | {:error, term()} - def refill do - GenServer.call(__MODULE__, :refill) + defp schedule_work() do + Process.send_after(self(), :work, @check_time) end - @spec introduce_variety :: :ok - def introduce_variety do - GenServer.call(__MODULE__, :introduce_variety) + defp remove_dead do + Peers.check_peers() end - def handle_call(:introduce_variety, _from, state) do + @spec introduce_variety :: :ok + defp introduce_variety do peers_count = map_size(Peers.all_peers()) if peers_count >= @peers_target_count do random_peer = Enum.random(Map.keys(Peers.all_peers())) Logger.info(fn -> "Removing #{random_peer} to introduce variety" end) Peers.remove_peer(random_peer) - {:reply, :ok, state} + :ok else - {:reply, :ok, state} + :ok end end - def handle_call(:refill, _from, state) do + @spec refill :: :ok | {:error, term()} + defp refill do peers_count = map_size(Peers.all_peers()) cond do peers_count == 0 -> Logger.error(fn -> "No peers" end) - {:reply, {:error, "No peers"}, state} + {:error, "No peers"} peers_count < @peers_target_count -> all_peers = Map.keys(Peers.all_peers()) new_count = get_newpeers_and_add(all_peers) if new_count > 0 do Logger.info(fn -> "Aquired #{new_count} new peers" end) - {:reply, :ok, state} + :ok else Logger.error(fn -> "No new peers added when trying to refill peers" end) - {:reply, {:error, "No new peers added"}, state} + {:error, "No new peers added"} end true -> - {:reply, :ok, state} + :ok end end diff --git a/apps/aecore/lib/aecore/peers/worker/supervisor.ex b/apps/aecore/lib/aecore/peers/worker/supervisor.ex index 20d35c80..fba0b3b7 100644 --- a/apps/aecore/lib/aecore/peers/worker/supervisor.ex +++ b/apps/aecore/lib/aecore/peers/worker/supervisor.ex @@ -8,7 +8,6 @@ defmodule Aecore.Peers.Worker.Supervisor do def init(:ok) do children = [ Aecore.Peers.Worker, - Aecore.Peers.Scheduler, Aecore.Peers.Sync ] From bbbdd50e3ce1052cdbfef618d3132b0bdb07fc64 Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 15:29:26 +0100 Subject: [PATCH 5/9] Refactored peer_add --- apps/aecore/lib/aecore/peers/worker.ex | 67 ++++++++++++++------------ 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/apps/aecore/lib/aecore/peers/worker.ex b/apps/aecore/lib/aecore/peers/worker.ex index e93df486..e0dd9a87 100644 --- a/apps/aecore/lib/aecore/peers/worker.ex +++ b/apps/aecore/lib/aecore/peers/worker.ex @@ -81,41 +81,28 @@ defmodule Aecore.Peers.Worker do "Skipped adding #{uri}, already known" end) {:reply, {:error, "Peer already known"}, state} else - case(Client.get_info(uri)) do + case check_peer(uri, own_nonce) do {:ok, info} -> - case own_nonce == info.peer_nonce do - false -> - if(info.genesis_block_hash == genesis_block_header_hash()) do - if map_size(peers) < @peers_max_count - || :rand.uniform() < @probability_of_peer_remove_when_max do - peers_update1 = - if map_size(peers) >= @peers_max_count do - random_peer = Enum.random(Map.keys(peers)) - Logger.debug(fn -> "Max peers reached. #{random_peer} removed" end) - Map.delete(peers, random_peer) - else - peers - end - updated_peers = Map.put(peers_update1, uri, info.current_block_hash) - Logger.info(fn -> "Added #{uri} to the peer list" end) - {:reply, :ok, %{state | peers: updated_peers}} - else - Logger.debug(fn -> "Max peers reached. #{uri} not added" end) - {:reply, :ok, state} - end + if map_size(peers) < @peers_max_count + || :rand.uniform() < @probability_of_peer_remove_when_max do + peers_update1 = + if map_size(peers) >= @peers_max_count do + random_peer = Enum.random(Map.keys(peers)) + Logger.debug(fn -> "Max peers reached. #{random_peer} removed" end) + Map.delete(peers, random_peer) else - Logger.error(fn -> - "Failed to add #{uri}, genesis header hash not valid" end) - {:reply, {:error, "Genesis header hash not valid"}, %{state | peers: peers}} + peers end - true -> - Logger.debug(fn -> - "Failed to add #{uri}, equal peer nonces" end) - {:reply, {:error, "Equal peer nonces"}, %{state | peers: peers}} + updated_peers = Map.put(peers_update1, uri, info.current_block_hash) + Logger.info(fn -> "Added #{uri} to the peer list" end) + {:reply, :ok, %{state | peers: updated_peers}} + else + Logger.debug(fn -> "Max peers reached. #{uri} not added" end) + {:reply, :ok, state} end - :error -> - Logger.error("GET /info request error") - {:reply, :error, %{state | peers: peers}} + {:error, reason} -> + Logger.error(fn -> "Failed to add peer. reason=#{reason}" end) + {:reply, {:error, reason}, state} end end end @@ -183,6 +170,24 @@ defmodule Aecore.Peers.Worker do HttpClient.post(peer, data, uri) end end + + defp check_peer(uri, own_nonce) do + case(Client.get_info(uri)) do + {:ok, info} -> + case own_nonce == info.peer_nonce do + false -> + if(info.genesis_block_hash == genesis_block_header_hash()) do + {:ok, info} + else + {:error, "Genesis header hash not valid"} + end + true -> + {:error, "Equal peer nonces"} + end + :error -> + {:error, "Request error"} + end + end defp prep_data(:new_tx, %{}=data), do: Serialization.tx(data, :serialize) defp prep_data(:new_block, %{}=data), do: Serialization.block(data, :serialize) From f4fbc1fb0ae52a98d93373388cd2ce7097e6b6a7 Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 15:44:25 +0100 Subject: [PATCH 6/9] Added docs and fixed spaces --- apps/aecore/lib/aecore/peers/sync.ex | 19 +++++++++++++++---- apps/aecore/lib/aecore/peers/worker.ex | 13 +++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/apps/aecore/lib/aecore/peers/sync.ex b/apps/aecore/lib/aecore/peers/sync.ex index 51d88aec..2c5c8b6f 100644 --- a/apps/aecore/lib/aecore/peers/sync.ex +++ b/apps/aecore/lib/aecore/peers/sync.ex @@ -20,7 +20,7 @@ defmodule Aecore.Peers.Sync do end def handle_info(:work, state) do - remove_dead() + check_peers() introduce_variety() refill() schedule_work() @@ -31,10 +31,14 @@ defmodule Aecore.Peers.Sync do Process.send_after(self(), :work, @check_time) end - defp remove_dead do + defp check_peers do Peers.check_peers() end + @doc """ + To make sure no peer is more popular in network then others, + we remove one peer at random if we have at least target_count of peers. + """ @spec introduce_variety :: :ok defp introduce_variety do peers_count = map_size(Peers.all_peers()) @@ -48,6 +52,12 @@ defmodule Aecore.Peers.Sync do end end + @doc """ + If our peer count is lower then @peers_target_count, + we request peers list from all known peers and choose at random + min(peers_we_need_to_have_target_count, peers_we_currently_have) + new peers to add. + """ @spec refill :: :ok | {:error, term()} defp refill do peers_count = map_size(Peers.all_peers()) @@ -65,7 +75,7 @@ defmodule Aecore.Peers.Sync do Logger.error(fn -> "No new peers added when trying to refill peers" end) {:error, "No new peers added"} end - true -> + true -> :ok end end @@ -91,7 +101,7 @@ defmodule Aecore.Peers.Sync do end) |> Enum.shuffle |> Enum.take(Enum.min([@peers_target_count - known_count, known_count])) - |> Enum.reduce(0, fn(peer, acc) -> + |> Enum.reduce(0, fn(peer, acc) -> case Peers.add_peer(peer) do :ok -> acc+1 _ -> acc @@ -99,3 +109,4 @@ defmodule Aecore.Peers.Sync do end) end end + diff --git a/apps/aecore/lib/aecore/peers/worker.ex b/apps/aecore/lib/aecore/peers/worker.ex index e0dd9a87..679c84a1 100644 --- a/apps/aecore/lib/aecore/peers/worker.ex +++ b/apps/aecore/lib/aecore/peers/worker.ex @@ -79,14 +79,14 @@ defmodule Aecore.Peers.Worker do if Map.has_key?(peers, uri) do Logger.debug(fn -> "Skipped adding #{uri}, already known" end) - {:reply, {:error, "Peer already known"}, state} + {:reply, {:error, "Peer already known"}, state} else case check_peer(uri, own_nonce) do {:ok, info} -> if map_size(peers) < @peers_max_count || :rand.uniform() < @probability_of_peer_remove_when_max do - peers_update1 = - if map_size(peers) >= @peers_max_count do + peers_update1 = + if map_size(peers) >= @peers_max_count do random_peer = Enum.random(Map.keys(peers)) Logger.debug(fn -> "Max peers reached. #{random_peer} removed" end) Map.delete(peers, random_peer) @@ -170,18 +170,18 @@ defmodule Aecore.Peers.Worker do HttpClient.post(peer, data, uri) end end - + defp check_peer(uri, own_nonce) do case(Client.get_info(uri)) do {:ok, info} -> case own_nonce == info.peer_nonce do - false -> + false -> if(info.genesis_block_hash == genesis_block_header_hash()) do {:ok, info} else {:error, "Genesis header hash not valid"} end - true -> + true -> {:error, "Equal peer nonces"} end :error -> @@ -193,3 +193,4 @@ defmodule Aecore.Peers.Worker do defp prep_data(:new_block, %{}=data), do: Serialization.block(data, :serialize) end + From cd2c8957c66490ab2236ff262c431f9358992ad2 Mon Sep 17 00:00:00 2001 From: cheezus1 Date: Fri, 10 Nov 2017 14:41:25 +0200 Subject: [PATCH 7/9] [GH-#111] Fixed test --- apps/aecore/test/aecore_peers_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/aecore/test/aecore_peers_test.exs b/apps/aecore/test/aecore_peers_test.exs index 41d8a5e7..3353afb5 100644 --- a/apps/aecore/test/aecore_peers_test.exs +++ b/apps/aecore/test/aecore_peers_test.exs @@ -10,7 +10,7 @@ defmodule AecorePeersTest do end test "add peer, get all peers, check peers and remove the peer" do - assert :error = Peers.add_peer("localhost:4000") + assert {:error, _} = Peers.add_peer("localhost:4000") assert Enum.count(Peers.all_peers) == 0 assert :ok = Peers.check_peers assert {:error, "Peer not found"} = From 94dd87d5ffde5c27d47a942c1bab225d24eaa0a6 Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 18:15:52 +0100 Subject: [PATCH 8/9] Moved condition to function --- apps/aecore/lib/aecore/peers/worker.ex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/aecore/lib/aecore/peers/worker.ex b/apps/aecore/lib/aecore/peers/worker.ex index 679c84a1..32093561 100644 --- a/apps/aecore/lib/aecore/peers/worker.ex +++ b/apps/aecore/lib/aecore/peers/worker.ex @@ -83,8 +83,7 @@ defmodule Aecore.Peers.Worker do else case check_peer(uri, own_nonce) do {:ok, info} -> - if map_size(peers) < @peers_max_count - || :rand.uniform() < @probability_of_peer_remove_when_max do + if should_a_peer_be_added(map_size(peers)) do peers_update1 = if map_size(peers) >= @peers_max_count do random_peer = Enum.random(Map.keys(peers)) @@ -189,6 +188,11 @@ defmodule Aecore.Peers.Worker do end end + defp should_a_peer_be_added peers_count do + peers_count < @peers_max_count + || :rand.uniform() < @probability_of_peer_remove_when_max + end + defp prep_data(:new_tx, %{}=data), do: Serialization.tx(data, :serialize) defp prep_data(:new_block, %{}=data), do: Serialization.block(data, :serialize) From c7d98958c2ccb8dcdf1172acf1b481a0c1b776ca Mon Sep 17 00:00:00 2001 From: Artur Puzio Date: Sat, 11 Nov 2017 18:21:14 +0100 Subject: [PATCH 9/9] Changed private function @doc to comment --- apps/aecore/lib/aecore/peers/sync.ex | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/apps/aecore/lib/aecore/peers/sync.ex b/apps/aecore/lib/aecore/peers/sync.ex index 2c5c8b6f..76e80dc3 100644 --- a/apps/aecore/lib/aecore/peers/sync.ex +++ b/apps/aecore/lib/aecore/peers/sync.ex @@ -35,10 +35,8 @@ defmodule Aecore.Peers.Sync do Peers.check_peers() end - @doc """ - To make sure no peer is more popular in network then others, - we remove one peer at random if we have at least target_count of peers. - """ + #To make sure no peer is more popular in network then others, + #we remove one peer at random if we have at least target_count of peers. @spec introduce_variety :: :ok defp introduce_variety do peers_count = map_size(Peers.all_peers()) @@ -52,12 +50,10 @@ defmodule Aecore.Peers.Sync do end end - @doc """ - If our peer count is lower then @peers_target_count, - we request peers list from all known peers and choose at random - min(peers_we_need_to_have_target_count, peers_we_currently_have) - new peers to add. - """ + #If our peer count is lower then @peers_target_count, + #we request peers list from all known peers and choose at random + #min(peers_we_need_to_have_target_count, peers_we_currently_have) + #new peers to add. @spec refill :: :ok | {:error, term()} defp refill do peers_count = map_size(Peers.all_peers())