Skip to content

Commit

Permalink
Fix the testnet genesis overloading on runtime
Browse files Browse the repository at this point in the history
Use runtime configuration instead of compile configuration
to be able to overload the testnet genesis address and amount.
  • Loading branch information
Samuel committed Sep 21, 2021
1 parent 033991c commit 4d4183e
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 37 deletions.
29 changes: 21 additions & 8 deletions lib/archethic/bootstrap.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ defmodule ArchEthic.Bootstrap do

use Task

@genesis_seed Application.compile_env(:archethic, [NetworkInit, :genesis_seed])
@genesis_pools Application.compile_env(:archethic, [NetworkInit, :genesis_pools])

@doc """
Start the bootstrapping as a task
"""
Expand Down Expand Up @@ -223,17 +220,21 @@ defmodule ArchEthic.Bootstrap do
"""
@spec genesis_address() :: binary()
def genesis_address do
{pub, _} = Crypto.derive_keypair(@genesis_seed, 1)
Crypto.hash(pub)
get_genesis_seed()
|> Crypto.derive_keypair(1)
|> elem(0)
|> Crypto.hash()
end

@doc """
Return the address from the unspent outputs allocation for the genesis transaction
"""
@spec genesis_unspent_output_address() :: binary()
def genesis_unspent_output_address do
{pub, _} = Crypto.derive_keypair(@genesis_seed, 0)
Crypto.hash(pub)
get_genesis_seed()
|> Crypto.derive_keypair(0)
|> elem(0)
|> Crypto.hash()
end

@doc """
Expand All @@ -242,6 +243,18 @@ defmodule ArchEthic.Bootstrap do
@spec genesis_allocation() :: float()
def genesis_allocation do
network_pool_amount = 1.46e9
Enum.reduce(@genesis_pools, network_pool_amount, &(&1.amount + &2))

genesis_pools =
:archethic
|> Application.get_env(NetworkInit)
|> Keyword.fetch!(:genesis_pools)

Enum.reduce(genesis_pools, network_pool_amount, &(&1.amount + &2))
end

defp get_genesis_seed do
:archethic
|> Application.get_env(NetworkInit)
|> Keyword.fetch!(:genesis_seed)
end
end
2 changes: 1 addition & 1 deletion lib/archethic/bootstrap/network_init.ex
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ defmodule ArchEthic.Bootstrap.NetworkInit do

require Logger

@genesis_seed Application.compile_env(:archethic, __MODULE__)[:genesis_seed]
@genesis_seed Application.compile_env(:archethic, [__MODULE__, :genesis_seed])

defp get_genesis_pools do
Application.get_env(:archethic, __MODULE__) |> Keyword.get(:genesis_pools, [])
Expand Down
95 changes: 68 additions & 27 deletions lib/archethic/utils/benchmarks/balance.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,42 @@ defmodule ArchEthic.Benchmark.Balance do
require Logger

alias ArchEthic.Benchmark

alias ArchEthic.Bootstrap.NetworkInit

alias ArchEthic.P2P.Endpoint, as: P2PEndpoint
alias ArchEthic.P2P.Message
alias ArchEthic.P2P.Message.Balance
alias ArchEthic.P2P.Message.GetBalance

alias ArchEthic.Utils

alias ArchEthic.WebClient

alias ArchEthicWeb.Endpoint, as: WebEndpoint

@behaviour Benchmark

def plan([host | _nodes], _opts) do
port = Application.get_env(:archethic, ArchEthic.P2P.Endpoint)[:port]
http = Application.get_env(:archethic, ArchEthicWeb.Endpoint)[:http][:port]
port = Application.get_env(:archethic, P2PEndpoint)[:port]
http = Application.get_env(:archethic, WebEndpoint)[:http][:port]
{:ok, addr} = :inet.getaddr(to_charlist(host), :inet)

{:ok, sock} = :socket.open(:inet, :stream, :tcp)
:ok = :socket.connect(sock, %{family: :inet, port: port, addr: addr})

genesis_balance = get_genesis_balance()
genesis_address = get_genesis_address()

{%{
"P2P socket" => fn _ -> get_balance_p2p_socket(addr, port) end,
"P2P gentcp" => fn _ -> get_balance_p2p_gentcp(addr, port) end,
"P2P attach" => fn _ -> get_balance_p2p(sock) end,
"WEB" => fn _ -> get_balance_web(host, http) end
"P2P socket" => fn _ ->
get_balance_p2p_socket(addr, port, genesis_balance, genesis_address)
end,
"P2P gentcp" => fn _ ->
get_balance_p2p_gentcp(addr, port, genesis_balance, genesis_address)
end,
"P2P attach" => fn _ -> get_balance_p2p(sock, genesis_balance, genesis_address) end,
"WEB" => fn _ -> get_balance_web(host, http, genesis_balance, genesis_address) end
},
[
before_scenario: fn _ -> get_vm_status(host, http) end,
Expand Down Expand Up @@ -58,55 +74,80 @@ defmodule ArchEthic.Benchmark.Balance do
|> Enum.into(%{})
end

@genesis Application.compile_env!(:archethic, ArchEthic.Bootstrap.NetworkInit)[:genesis_pools]
@balance Enum.at(@genesis, 0)[:amount]
@address Enum.at(@genesis, 0)[:address]
@message %GetBalance{address: @address} |> Message.encode() |> Utils.wrap_binary()
@msgdata <<byte_size(@message) + 4::32, 1::32, @message::binary>>
defp get_genesis_balance do
get_genesis_pools()
|> Enum.at(0)
|> Map.get(:amount)
end

defp get_genesis_address do
get_genesis_pools()
|> Enum.at(0)
|> Map.get(:address)
end

defp get_genesis_pools do
:archethic
|> Application.get_env(:archethic, NetworkInit)
|> Keyword.fetch!(:genesis_pools)
end

defp message_data(address) do
message_bin =
%GetBalance{address: address}
|> Message.encode()
|> Utils.wrap_binary()

defp get_balance_p2p_socket(addr, port) do
<<byte_size(message_bin) + 4::32, 1::32, message_bin::binary>>
end

defp get_balance_p2p_socket(addr, port, expected_balance, address) do
{:ok, sock} = :socket.open(:inet, :stream, :tcp)
:ok = :socket.connect(sock, %{family: :inet, port: port, addr: addr})
:ok = :socket.send(sock, @msgdata)
:ok = :socket.send(sock, message_data(address))
{:ok, <<_::32, _::32, data::binary>>} = :socket.recv(sock, 0, 1000)
:ok = :socket.close(sock)

{%ArchEthic.P2P.Message.Balance{nft: %{}, uco: @balance}, ""} = Message.decode(data)
{%Balance{nft: %{}, uco: ^expected_balance}, ""} = Message.decode(data)

:ok
end

defp get_balance_p2p(sock) do
:ok = :socket.send(sock, @msgdata)
defp get_balance_p2p(sock, expected_balance, address) do
:ok = :socket.send(sock, message_data(address))
{:ok, <<_::32, _::32, data::binary>>} = :socket.recv(sock, 0, 1000)

{%ArchEthic.P2P.Message.Balance{nft: %{}, uco: @balance}, ""} = Message.decode(data)
{%Balance{nft: %{}, uco: ^expected_balance}, ""} = Message.decode(data)

:ok
end

defp get_balance_p2p_gentcp(addr, port) do
defp get_balance_p2p_gentcp(addr, port, expected_balance, address) do
{:ok, sock} = :gen_tcp.connect(addr, port, [:binary])
:ok = :gen_tcp.send(sock, @msgdata)
:ok = :gen_tcp.send(sock, message_data(address))

receive do
{:tcp, ^sock, <<_::32, _::32, data::binary>>} ->
:ok = :gen_tcp.close(sock)

{%ArchEthic.P2P.Message.Balance{nft: %{}, uco: @balance}, ""} = Message.decode(data)
{%Balance{nft: %{}, uco: ^expected_balance}, ""} = Message.decode(data)

:ok
after
1000 -> raise "timeout"
end
end

@graphql """
query {balance(address: "#{@address |> Base.encode16()}"){uco}}
"""

defp get_balance_web(host, port) do
{:ok, %{"data" => %{"balance" => %{"uco" => @balance}}}} =
WebClient.with_connection(host, port, &WebClient.query(&1, @graphql))
defp get_balance_web(host, port, expected_balance, address) do
query = """
query {
balance(address: "#{Base.encode16(address)}") {
uco
}
}
"""

{:ok, %{"data" => %{"balance" => %{"uco" => ^expected_balance}}}} =
WebClient.with_connection(host, port, &WebClient.query(&1, query))
end
end
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule ArchEthic.MixProject do
def project do
[
app: :archethic,
version: "0.11.1",
version: "0.11.2",
build_path: "_build",
config_path: "config/config.exs",
deps_path: "deps",
Expand Down

0 comments on commit 4d4183e

Please sign in to comment.