Packages
elixium_core
0.6.3
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
The core package for the Elixium blockchain, containing all the modules needed to run the chain
Current section
Files
Jump to
Current section
Files
lib/store/peer.ex
defmodule Elixium.Store.Peer do
use Elixium.Store
@moduledoc """
Store and load data related to peers that a node has communicated with.
This includes authentication data
"""
@store_dir "peers"
def initialize do
initialize(@store_dir)
end
def reorder_peers(ip) do
transact @store_dir do
fn ref ->
{:ok, peers} = Exleveldb.get(ref, "known_peers")
peers = :erlang.binary_to_term(peers)
peer = Enum.find(peers, &(elem(&1, 0) == ip))
Exleveldb.put(ref, "known_peers", :erlang.term_to_binary([peer | peers -- [peer]]))
end
end
end
@spec save_known_peer({charlist, integer}) :: none
def save_known_peer(peer) do
transact @store_dir do
fn ref ->
case Exleveldb.get(ref, "known_peers") do
{:ok, peers} ->
peers = Enum.uniq([peer | :erlang.binary_to_term(peers)])
Exleveldb.put(ref, "known_peers", :erlang.term_to_binary(peers))
:not_found ->
Exleveldb.put(ref, "known_peers", :erlang.term_to_binary([peer]))
end
end
end
end
def load_known_peers do
transact @store_dir do
fn ref ->
case Exleveldb.get(ref, "known_peers") do
{:ok, peers} -> :erlang.binary_to_term(peers)
:not_found -> []
end
end
end
end
@spec find_potential_peers :: List | :not_found
def find_potential_peers do
case load_known_peers() do
[] -> seed_peers()
peers -> peers
end
end
@doc """
Returns a list of seed peers based on config
"""
@spec seed_peers :: List
def seed_peers do
:elixium_core
|> Application.get_env(:seed_peers)
|> Enum.map(&peerstring_to_tuple/1)
end
# Converts from a colon delimited string to a tuple containing the
# ip and port. "127.0.0.1:3000" becomes {'127.0.0.1', 3000}
defp peerstring_to_tuple(peer) do
[ip, port] = String.split(peer, ":")
ip = String.to_charlist(ip)
port =
case Integer.parse(port) do
{port, _} -> port
:error -> nil
end
{ip, port}
end
end