Skip to content

Commit c254ea7

Browse files
committed
[GH-#69] GET /info
1 parent fa3544f commit c254ea7

File tree

6 files changed

+59
-19
lines changed

6 files changed

+59
-19
lines changed

apps/aecore/lib/aecore/peers/worker.ex

+18-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule Aecore.Peers.Worker do
22

33
alias Aehttpclient.Client
4+
alias Aecore.Structures.Block
5+
alias Aecore.Utils.Blockchain.BlockValidation
46

57
use GenServer
68

@@ -32,10 +34,21 @@ defmodule Aecore.Peers.Worker do
3234
GenServer.call(__MODULE__, :all_peers)
3335
end
3436

37+
@spec genesis_block_header_hash() :: term()
38+
def genesis_block_header_hash() do
39+
Block.genesis_header()
40+
|> BlockValidation.block_header_hash()
41+
|> Base.encode16()
42+
end
43+
3544
def handle_call({:add_peer,uri}, _from, peers) do
36-
case(Client.ping_uri(uri)) do
37-
:ok ->
38-
{:reply, :ok, [uri | peers]}
45+
case(Client.get_info(uri)) do
46+
{:ok, info} ->
47+
if(Map.get(info,"genesis_block_hash") == genesis_block_header_hash()) do
48+
{:reply, :ok, [uri | peers]}
49+
else
50+
{:reply, :error, peers}
51+
end
3952
:error ->
4053
{:reply, :error, peers}
4154
end
@@ -51,8 +64,8 @@ defmodule Aecore.Peers.Worker do
5164

5265
def handle_call(:check_peers, _from, peers) do
5366
updated_peers = Enum.filter(peers, fn(peer) ->
54-
reply = Client.ping_uri(peer)
55-
:ok = reply
67+
{status, _} = Client.get_info(peer)
68+
:ok = status
5669
end)
5770
{:reply, :ok, updated_peers}
5871
end

apps/aecore/lib/aecore/structures/block.ex

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ defmodule Aecore.Structures.Block do
22
@moduledoc """
33
Structure of the block
44
"""
5-
65
alias Aecore.Structures.Block
76
alias Aecore.Structures.Header
87

apps/aehttpclient/lib/client.ex

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
defmodule Aehttpclient.Client do
22

3-
def ping_uri(uri) do
4-
case(HTTPoison.get(uri <> "/ping")) do
5-
{:ok, %{status_code: status_code}} when status_code == 200 ->
6-
:ok
7-
true ->
3+
def get_info(uri) do
4+
case(HTTPoison.get(uri <> "/info",[recv_timeout: 10000000])) do
5+
{:ok, %{body: body, status_code: 200}} ->
6+
response = Poison.decode!(body)
7+
{:ok, response}
8+
{:ok, %HTTPoison.Response{status_code: 404}} ->
9+
:error
10+
{:error, %HTTPoison.Error{}} ->
811
:error
912
end
1013
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule Aehttpserver.InfoController do
2+
use Aehttpserver.Web, :controller
3+
4+
alias Aecore.Structures.Block
5+
alias Aecore.Chain.Worker, as: Chain
6+
alias Aecore.Utils.Blockchain.BlockValidation
7+
alias Aecore.Peers.Worker, as: Peers
8+
alias Aecore.Keys.Worker, as: Keys
9+
10+
def info(conn, _params) do
11+
latest_block = Chain.latest_block()
12+
latest_block_header = latest_block.header
13+
|> BlockValidation.block_header_hash()
14+
|> Base.encode16()
15+
16+
genesis_block_header = Block.genesis_header()
17+
genesis_block_hash = genesis_block_header
18+
|> BlockValidation.block_header_hash()
19+
|> Base.encode16()
20+
21+
{:ok, pubkey} = Keys.pubkey()
22+
pubkey = Base.encode16(pubkey)
23+
24+
json conn, %{current_block_version: latest_block.header.version,
25+
current_block_height: latest_block.header.height,
26+
current_block_hash: latest_block_header,
27+
genesis_block_hash: genesis_block_hash,
28+
peer_count: Enum.count(Peers.all_peers),
29+
difficulty_target: latest_block.header.difficulty_target,
30+
public_key: pubkey}
31+
end
32+
end

apps/aehttpserver/web/controllers/ping_controller.ex

-7
This file was deleted.

apps/aehttpserver/web/router.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule Aehttpserver.Router do
1717
pipe_through :browser # Use the default browser stack
1818

1919
get "/", PageController, :index
20-
get "/ping", PingController, :index
20+
get "/info", InfoController, :info
2121
end
2222

2323
# Other scopes may use custom stacks.

0 commit comments

Comments
 (0)