Skip to content

Commit

Permalink
temp
Browse files Browse the repository at this point in the history
  • Loading branch information
apoorv-2204 committed Feb 15, 2023
1 parent df2ea06 commit d09e84e
Show file tree
Hide file tree
Showing 12 changed files with 514 additions and 121 deletions.
66 changes: 36 additions & 30 deletions lib/archethic.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,14 @@ defmodule Archethic do
Provides high level functions serving the API and the Explorer
"""

alias __MODULE__.Account
alias __MODULE__.BeaconChain
alias __MODULE__.Crypto
alias __MODULE__.Election
alias __MODULE__.P2P
alias __MODULE__.P2P.Node
alias __MODULE__.P2P.Message.Balance
alias __MODULE__.P2P.Message.GetBalance
alias __MODULE__.P2P.Message.GetCurrentSummaries
alias __MODULE__.P2P.Message.GetTransactionSummary
alias __MODULE__.P2P.Message.TransactionSummaryMessage
alias __MODULE__.P2P.Message.NewTransaction
alias __MODULE__.P2P.Message.NotFound
alias __MODULE__.P2P.Message.Ok
alias __MODULE__.P2P.Message.StartMining
alias __MODULE__.P2P.Message.TransactionSummaryList

alias __MODULE__.TransactionChain
alias __MODULE__.TransactionChain.Transaction
alias __MODULE__.TransactionChain.TransactionInput
alias __MODULE__.TransactionChain.TransactionSummary
alias __MODULE__.{Account, BeaconChain, Crypto, Election, P2P, P2P.Node, P2P.Message}
alias __MODULE__.{SelfRepair.Resync, TransactionChain}

alias Message.{NewTransaction, NotFound, StartMining, TransactionSummaryList}
alias Message.{Balance, GetBalance, GetCurrentSummaries, GetTransactionSummary}
alias Message.{StartMining, Ok, TransactionSummaryMessage}

alias TransactionChain.{Transaction, TransactionInput, TransactionSummary}

require Logger

Expand Down Expand Up @@ -60,17 +47,36 @@ defmodule Archethic do
tx = %Transaction{},
welcome_node_key \\ Crypto.first_node_public_key()
) do
if P2P.authorized_and_available_node?() do
do_send_transaction(tx, welcome_node_key)
else
P2P.authorized_and_available_nodes()
|> Enum.filter(&Node.locally_available?/1)
|> P2P.nearest_nodes()
|> forward_transaction(tx)
handle_new_tx(tx, welcome_node_key)
end

def handle_new_tx(tx, welcome_node_key)

def handle_new_tx(tx, welcome_node_key) do
cond do
!P2P.authorized_and_available_node?() ->
# node not authorized
forward_transaction(tx)

!P2P.is_synced_node?() ->
# node out of sync
Resync.node_out_of_sync()
forward_transaction(tx)

true ->
# node authorized and synced
do_send_transaction(tx, welcome_node_key)
end
end

defp forward_transaction([node | rest], tx) do
defp forward_transaction(
tx,
nodes \\ P2P.authorized_and_available_nodes()
|> Enum.filter(&Node.locally_available?/1)
|> P2P.nearest_nodes()
)

defp forward_transaction(tx, [node | rest]) do
case P2P.send_message(node, %NewTransaction{transaction: tx}) do
{:ok, %Ok{}} ->
:ok
Expand All @@ -80,7 +86,7 @@ defmodule Archethic do
end
end

defp forward_transaction([], _), do: {:error, :network_issue}
defp forward_transaction(_, []), do: {:error, :network_issue}

defp do_send_transaction(tx = %Transaction{type: tx_type}, welcome_node_key) do
current_date = DateTime.utc_now()
Expand Down
24 changes: 10 additions & 14 deletions lib/archethic/p2p.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,11 @@ defmodule Archethic.P2P do
@moduledoc """
Handle P2P node discovery and messaging
"""
alias Archethic.Crypto
alias Archethic.{Crypto, SharedSecrets, TaskSupervisor, TransactionChain}

alias __MODULE__.BootstrappingSeeds
alias __MODULE__.Client
alias __MODULE__.GeoPatch
alias __MODULE__.MemTable
alias __MODULE__.MemTableLoader
alias __MODULE__.Message
alias __MODULE__.Node
alias Archethic.{TransactionChain.Transaction, Utils}

alias Archethic.TaskSupervisor

alias Archethic.TransactionChain
alias Archethic.TransactionChain.Transaction

alias Archethic.Utils
alias __MODULE__.{BootstrappingSeeds, Client, GeoPatch, MemTable, MemTableLoader, Message, Node}

require Logger

Expand Down Expand Up @@ -761,4 +750,11 @@ defmodule Archethic.P2P do
conflict_resolver.(distinct_elems)
end
end

@doc """
Whether a node is synchronised or not is determined by whether the protocol chain node shared secrets are in sync.
When a new node renewal tx is produced, it is feasible that a node does not have that tx, resulting in an anomaly in election.
"""
@spec is_synced_node?() :: boolean()
def is_synced_node?(), do: SharedSecrets.is_synchronized?(:node_shared_secrets)
end
100 changes: 94 additions & 6 deletions lib/archethic/shared_secrets.ex
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,9 @@ defmodule Archethic.SharedSecrets do
|> Utils.previous_date(date_from)
end

@nss_gen_key :node_shared_secrets_gen_addr
@persistent_keys %{nss: :node_shared_secrets_gen_addr, origin: :origin_gen_addr}
def genesis_address_keys(), do: @persistent_keys

@spec persist_gen_addr(:node_shared_secrets) :: :ok | :error
def persist_gen_addr(:node_shared_secrets) do
try do
Expand All @@ -154,7 +156,7 @@ defmodule Archethic.SharedSecrets do
:error

addr ->
:persistent_term.put(@nss_gen_key, TransactionChain.get_genesis_address(addr))
:persistent_term.put(@persistent_keys.nss, TransactionChain.get_genesis_address(addr))
:ok
end
rescue
Expand All @@ -164,7 +166,6 @@ defmodule Archethic.SharedSecrets do
end
end

@origin_gen_key :origin_gen_addr
@spec persist_gen_addr(:origin) :: :ok
def persist_gen_addr(:origin) do
try do
Expand All @@ -186,7 +187,12 @@ defmodule Archethic.SharedSecrets do
|> elem(0)
|> Crypto.derive_address()

:persistent_term.put(@origin_gen_key, [software_gen_addr, usb_gen_addr, biometric_gen_addr])
:persistent_term.put(@persistent_keys.origin, [
software_gen_addr,
usb_gen_addr,
biometric_gen_addr
])

:ok
rescue
error ->
Expand All @@ -197,12 +203,12 @@ defmodule Archethic.SharedSecrets do

@spec genesis_address(:origin) :: binary() | nil
def genesis_address(:origin) do
:persistent_term.get(@origin_gen_key, nil)
:persistent_term.get(@persistent_keys.origin, nil)
end

@spec genesis_address(:node_shared_secrets) :: binary() | nil
def genesis_address(:node_shared_secrets) do
:persistent_term.get(@nss_gen_key, nil)
:persistent_term.get(@persistent_keys.nss, nil)
end

@doc """
Expand All @@ -212,4 +218,86 @@ defmodule Archethic.SharedSecrets do
def origin_family_from_public_key(<<_curve_id::8, origin_id::8, _public_key::binary>>) do
get_origin_family_from_origin_id(origin_id)
end

@doc """
Determines syncronisation of the protocol chain "node shared secrets"
How? ====>
mathematical || manual verification
When already in sync will return true
CurrentTime: (15thJan 23:58)
expected last_scheduling_date 15thJan 23:50
observed validation timestamp 15thJan 23:50
validation_timestamp > last_scheduling_date
true
When not in sync will return false
CurrentTime: (16thJan 23:58)
expected last_scheduling_date 16thJan 23:50
observed validation timestamp 15thJan 23:50
validation_timestamp > last_scheduling_date
false
Validation time is same as time at which tx was created.
manual:
Quorum last address from the network and compare locally
"""
@spec is_synchronized?(:node_shared_secrets) :: boolean
def is_synchronized?(:node_shared_secrets) do
validate_scheduling_time() || validate_last_address()
end

@spec validate_scheduling_time() :: boolean()
def validate_scheduling_time() do
last_scheduling_date =
DateTime.utc_now()
|> __MODULE__.get_last_scheduling_date()

case genesis_address(:node_shared_secrets) do
nil ->
false

genesis_address ->
tx =
genesis_address
|> TransactionChain.get_last_transaction(validation_stamp: [:timestamp])
|> elem(1)

case tx do
%{__struct__: _, validation_stamp: %{__struct__: _, timestamp: validation_timestamp}} ->
validation_timestamp >= last_scheduling_date

_ ->
false
end
end
end

@spec validate_last_address() :: boolean()
def validate_last_address() do
case genesis_address(:node_shared_secrets) do
nil ->
false

genesis_address ->
quroum_last_address =
genesis_address
|> TransactionChain.resolve_last_address()
|> elem(1)

local_last_address =
genesis_address
|> TransactionChain.get_last_address()
|> elem(0)

quroum_last_address == local_last_address
end
end
end
2 changes: 1 addition & 1 deletion src/c/nat/miniupnp
9 changes: 5 additions & 4 deletions test/archethic/bootstrap_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ defmodule Archethic.BootstrapTest do
Replication,
SharedSecrets,
TransactionChain,
TransactionFactory
TransactionFactory,
SelfRepair.Resync
}

alias Archethic.P2P.Message.{
Expand Down Expand Up @@ -501,7 +502,7 @@ defmodule Archethic.BootstrapTest do
:persistent_term.put(:node_shared_secrets_gen_addr, nil)

assert :ok =
Bootstrap.do_resync_network_chain(
Resync.network_chain(
:node_shared_secrets,
_nodes = P2P.authorized_and_available_nodes()
)
Expand Down Expand Up @@ -529,7 +530,7 @@ defmodule Archethic.BootstrapTest do
end)

assert :ok =
Bootstrap.do_resync_network_chain(
Resync.network_chain(
:node_shared_secrets,
_nodes = P2P.authorized_and_available_nodes()
)
Expand Down Expand Up @@ -600,7 +601,7 @@ defmodule Archethic.BootstrapTest do
end)

assert :ok =
Bootstrap.do_resync_network_chain(
Resync.network_chain(
:node_shared_secrets,
_nodes = P2P.authorized_and_available_nodes()
)
Expand Down
23 changes: 23 additions & 0 deletions test/archethic/oracle_chain/scheduler_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,29 @@ defmodule Archethic.OracleChain.SchedulerTest do

setup do
SelfRepairScheduler.start_link([interval: "0 0 * * *"], [])
nss_genesis_address = "nss_genesis_address"
nss_last_address = "nss_last_address"
:persistent_term.put(:node_shared_secrets_gen_addr, nss_genesis_address)

MockDB
|> stub(:get_last_chain_address, fn ^nss_genesis_address ->
{nss_last_address, DateTime.utc_now()}
end)
|> stub(:get_transaction, fn
^nss_last_address, [validation_stamp: [:timestamp]], :chain ->
{:ok,
%Transaction{
validation_stamp: %{__struct__: :ValidationStamp, timestamp: DateTime.utc_now()}
}}

_, _, _ ->
{:error, :transaction_not_exists}
end)

on_exit(:unpersist_data, fn ->
:persistent_term.put(:node_shared_secrets_gen_addr, nil)
end)

:ok
end

Expand Down
23 changes: 23 additions & 0 deletions test/archethic/reward/scheduler_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,29 @@ defmodule Archethic.Reward.SchedulerTest do

import Mox

setup do
nss_genesis_address = "nss_genesis_address"
nss_last_address = "nss_last_address"
:persistent_term.put(:node_shared_secrets_gen_addr, nss_genesis_address)

MockDB
|> stub(:get_last_chain_address, fn ^nss_genesis_address ->
{nss_last_address, DateTime.utc_now()}
end)
|> stub(:get_transaction, fn ^nss_last_address, [validation_stamp: [:timestamp]], :chain ->
{:ok,
%Transaction{
validation_stamp: %{__struct__: :ValidationStamp, timestamp: DateTime.utc_now()}
}}
end)

on_exit(:unpersist_data, fn ->
:persistent_term.put(:node_shared_secrets_gen_addr, nil)
end)

:ok
end

describe "Trigger mint Reward" do
test "should initiate the reward scheduler and trigger mint reward" do
P2P.add_and_connect_node(%Node{
Expand Down
20 changes: 20 additions & 0 deletions test/archethic/shared_secrets/node_renewal_scheduler_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,26 @@ defmodule Archethic.SharedSecrets.NodeRenewalSchedulerTest do
SelfRepairScheduler.start_link([interval: "0 0 0 * *"], [])
start_supervised!({BeaconSlotTimer, interval: "0 * * * * *"})
Enum.each(BeaconChain.list_subsets(), &Registry.register(SubsetRegistry, &1, []))

nss_genesis_address = "nss_genesis_address"
nss_last_address = "nss_last_address"
:persistent_term.put(:node_shared_secrets_gen_addr, nss_genesis_address)

MockDB
|> stub(:get_last_chain_address, fn ^nss_genesis_address ->
{nss_last_address, DateTime.utc_now()}
end)
|> stub(:get_transaction, fn ^nss_last_address, [validation_stamp: [:timestamp]], :chain ->
{:ok,
%Transaction{
validation_stamp: %{__struct__: :ValidationStamp, timestamp: DateTime.utc_now()}
}}
end)

on_exit(:unpersist_data, fn ->
:persistent_term.put(:node_shared_secrets_gen_addr, nil)
end)

:ok
end

Expand Down
Loading

0 comments on commit d09e84e

Please sign in to comment.