diff --git a/config/test.exs b/config/test.exs index 246a9b92fa..0a3e5262b9 100755 --- a/config/test.exs +++ b/config/test.exs @@ -170,7 +170,6 @@ config :archethic, Archethic.SharedSecrets.NodeRenewalScheduler, application_interval: "0 0 * * * * *" config :archethic, Archethic.TransactionChain.MemTables.PendingLedger, enabled: false -config :archethic, Archethic.TransactionChain.MemTables.KOLedger, enabled: false config :archethic, Archethic.TransactionChain.MemTablesLoader, enabled: false config :archethic, Archethic.TransactionChain.DBLedger, MockTransactionLedger diff --git a/lib/archethic.ex b/lib/archethic.ex index 8a7bde0aac..43455076c0 100644 --- a/lib/archethic.ex +++ b/lib/archethic.ex @@ -55,11 +55,8 @@ defmodule Archethic do Search a transaction by its address Check locally and fallback to a quorum read """ - @spec search_transaction(address :: binary()) :: - {:ok, Transaction.t()} - | {:error, :transaction_not_exists} - | {:error, :invalid_transaction} - | {:error, :network_issue} + @spec search_transaction(address :: Crypto.prepended_hash()) :: + {:ok, Transaction.t()} | {:error, :transaction_not_exists} | {:error, :network_issue} def search_transaction(address) when is_binary(address) do storage_nodes = Election.chain_storage_nodes(address, P2P.authorized_and_available_nodes()) @@ -292,11 +289,8 @@ defmodule Archethic do @doc """ Retrieve the last transaction for a chain from the closest nodes """ - @spec get_last_transaction(address :: binary()) :: - {:ok, Transaction.t()} - | {:error, :transaction_not_exists} - | {:error, :invalid_transaction} - | {:error, :network_issue} + @spec get_last_transaction(address :: Crypto.prepended_hash()) :: + {:ok, Transaction.t()} | {:error, :transaction_not_exists} | {:error, :network_issue} def get_last_transaction(address) when is_binary(address) do case get_last_transaction_address(address) do {:ok, last_address} -> diff --git a/lib/archethic/contracts/interpreter/legacy/library.ex b/lib/archethic/contracts/interpreter/legacy/library.ex index 2084f66d9f..d92ec16703 100644 --- a/lib/archethic/contracts/interpreter/legacy/library.ex +++ b/lib/archethic/contracts/interpreter/legacy/library.ex @@ -241,9 +241,6 @@ defmodule Archethic.Contracts.Interpreter.Legacy.Library do {:ok, {:error, :transaction_not_exists}} -> {:error, "Transaction not exists"} - {:ok, {:error, :invalid_transaction}} -> - {:error, "Transaction invalid"} - {:error, :decode_error} -> {:error, "Error in decoding transaction"} diff --git a/lib/archethic/mining/pending_transaction_validation.ex b/lib/archethic/mining/pending_transaction_validation.ex index ed047461d5..9616d69802 100644 --- a/lib/archethic/mining/pending_transaction_validation.ex +++ b/lib/archethic/mining/pending_transaction_validation.ex @@ -909,9 +909,6 @@ defmodule Archethic.Mining.PendingTransactionValidation do {:ok, {:error, :transaction_not_exists}} -> {:error, "Invalid token transaction - token_reference not found"} - {:ok, {:error, :invalid_transaction}} -> - {:error, "Invalid token transaction - token_reference is invalid"} - {:ok, {:error, :network_issue}} -> {:error, "A network issue was raised, please retry later"} diff --git a/lib/archethic/p2p/message/get_last_transaction.ex b/lib/archethic/p2p/message/get_last_transaction.ex index 7d1dc2177e..36b7166416 100644 --- a/lib/archethic/p2p/message/get_last_transaction.ex +++ b/lib/archethic/p2p/message/get_last_transaction.ex @@ -19,14 +19,8 @@ defmodule Archethic.P2P.Message.GetLastTransaction do @spec process(__MODULE__.t(), Crypto.key()) :: NotFound.t() | Error.t() | Transaction.t() def process(%__MODULE__{address: address}, _) do case TransactionChain.get_last_transaction(address) do - {:ok, tx} -> - tx - - {:error, :transaction_not_exists} -> - %NotFound{} - - {:error, :invalid_transaction} -> - %Error{reason: :invalid_transaction} + {:ok, tx} -> tx + {:error, :transaction_not_exists} -> %NotFound{} end end diff --git a/lib/archethic/p2p/message/get_transaction.ex b/lib/archethic/p2p/message/get_transaction.ex index 41f559181f..8741d63c71 100644 --- a/lib/archethic/p2p/message/get_transaction.ex +++ b/lib/archethic/p2p/message/get_transaction.ex @@ -19,14 +19,8 @@ defmodule Archethic.P2P.Message.GetTransaction do @spec process(__MODULE__.t(), Crypto.key()) :: NotFound.t() | Error.t() | Transaction.t() def process(%__MODULE__{address: tx_address}, _) do case TransactionChain.get_transaction(tx_address) do - {:ok, tx} -> - tx - - {:error, :transaction_not_exists} -> - %NotFound{} - - {:error, :invalid_transaction} -> - %Error{reason: :invalid_transaction} + {:ok, tx} -> tx + {:error, :transaction_not_exists} -> %NotFound{} end end diff --git a/lib/archethic/replication.ex b/lib/archethic/replication.ex index 090c53c721..410bdcde4b 100644 --- a/lib/archethic/replication.ex +++ b/lib/archethic/replication.ex @@ -96,8 +96,6 @@ defmodule Archethic.Replication do ) %ValidationContext{mining_error: error} -> - :ok = TransactionChain.write_ko_transaction(tx) - Logger.warning("Invalid transaction for replication - #{inspect(error)}", transaction_address: Base.encode16(address), transaction_type: type @@ -270,8 +268,6 @@ defmodule Archethic.Replication do else: synchronize_io_transaction(tx, genesis_address, opts) %ValidationContext{mining_error: error} -> - :ok = TransactionChain.write_ko_transaction(tx) - Logger.warning("Invalid transaction for replication - #{inspect(error)}", transaction_address: Base.encode16(address), transaction_type: type diff --git a/lib/archethic/transaction_chain.ex b/lib/archethic/transaction_chain.ex index b5fc3b905a..46fac4a020 100644 --- a/lib/archethic/transaction_chain.ex +++ b/lib/archethic/transaction_chain.ex @@ -46,9 +46,7 @@ defmodule Archethic.TransactionChain do FirstTransactionAddress } - alias __MODULE__.MemTables.KOLedger alias __MODULE__.MemTables.PendingLedger - # alias __MODULE__.MemTablesLoader alias __MODULE__.Transaction alias __MODULE__.TransactionData @@ -160,28 +158,17 @@ defmodule Archethic.TransactionChain do @doc """ Get a transaction - - A lookup is performed into the KO ledger to determine if the transaction is invalid """ @spec get_transaction(binary(), fields :: list()) :: - {:ok, Transaction.t()} - | {:error, :transaction_not_exists} - | {:error, :invalid_transaction} - def get_transaction(address, fields \\ [], storage_type \\ :chain) when is_list(fields) do - if KOLedger.has_transaction?(address) do - {:error, :invalid_transaction} - else - DB.get_transaction(address, fields, storage_type) - end - end + {:ok, Transaction.t()} | {:error, :transaction_not_exists} + def get_transaction(address, fields \\ [], storage_type \\ :chain) when is_list(fields), + do: DB.get_transaction(address, fields, storage_type) @doc """ Get the last transaction from a given chain address """ @spec get_last_transaction(binary(), list()) :: - {:ok, Transaction.t()} - | {:error, :transaction_not_exists} - | {:error, :invalid_transaction} + {:ok, Transaction.t()} | {:error, :transaction_not_exists} def get_last_transaction(address, fields \\ []) when is_binary(address) and is_list(fields) do {address, _} = get_last_address(address) get_transaction(address, fields) @@ -258,13 +245,6 @@ defmodule Archethic.TransactionChain do @spec get_size(binary()) :: non_neg_integer() defdelegate get_size(address), to: DB, as: :chain_size - @doc """ - Get the details from a ko transaction address - """ - @spec get_ko_details(binary()) :: - {ValidationStamp.t(), inconsistencies :: list(), errors :: list()} - defdelegate get_ko_details(address), to: KOLedger, as: :get_details - @doc """ List of all the counter signatures regarding a given transaction """ @@ -365,11 +345,7 @@ defmodule Archethic.TransactionChain do address :: Crypto.prepended_hash(), storage_nodes :: list(Node.t()), opts :: search_options() - ) :: - {:ok, Transaction.t()} - | {:error, :transaction_not_exists} - | {:error, :invalid_transaction} - | {:error, :network_issue} + ) :: {:ok, Transaction.t()} | {:error, :transaction_not_exists} | {:error, :network_issue} def fetch_transaction(address, nodes, opts \\ []) do with :hybrid <- Keyword.get(opts, :search_mode, :hybrid), {:ok, tx} <- get_transaction(address) do @@ -424,14 +400,8 @@ defmodule Archethic.TransactionChain do timeout: timeout, acceptance_resolver: acceptance_resolver ) do - {:ok, %NotFound{}} -> - {:error, :transaction_not_exists} - - {:ok, %Error{}} -> - {:error, :invalid_transaction} - - res -> - res + {:ok, %NotFound{}} -> {:error, :transaction_not_exists} + res -> res end end end @@ -1064,30 +1034,18 @@ defmodule Archethic.TransactionChain do storage_type \\ :chain ) do DB.write_transaction(tx, storage_type) - |> tap(fn _ -> - KOLedger.remove_transaction(address) + |> tap(fn + :ok -> + Logger.info("Transaction stored", + transaction_address: Base.encode16(address), + transaction_type: type + ) - Logger.info("Transaction stored", - transaction_address: Base.encode16(address), - transaction_type: type - ) + _ -> + :skip end) end - @doc """ - Write an invalid transaction - """ - @spec write_ko_transaction(transaction :: Transaction.t(), errors :: list()) :: :ok - defdelegate write_ko_transaction(tx, additional_errors \\ []), - to: KOLedger, - as: :add_transaction - - @doc """ - Determine if the transaction already be validated and is invalid - """ - @spec transaction_ko?(address :: binary()) :: boolean() - defdelegate transaction_ko?(address), to: KOLedger, as: :has_transaction? - @doc """ Determine if a transaction address has already sent a counter signature (approval) to another transaction """ diff --git a/lib/archethic/transaction_chain/mem_tables/ko_ledger.ex b/lib/archethic/transaction_chain/mem_tables/ko_ledger.ex deleted file mode 100644 index 4164926e38..0000000000 --- a/lib/archethic/transaction_chain/mem_tables/ko_ledger.ex +++ /dev/null @@ -1,162 +0,0 @@ -defmodule Archethic.TransactionChain.MemTables.KOLedger do - @moduledoc """ - Represents an memory table will all the invalid transactions and their reasons - """ - - @table_name :archethic_ko_ledger - - alias Archethic.TransactionChain.Transaction - alias Archethic.TransactionChain.Transaction.ValidationStamp - - use GenServer - @vsn 1 - - require Logger - - @doc """ - Initialize the memory table for the invalid transactions (KO) - - ## Examples - - iex> {:ok, _} = KOLedger.start_link() - ...> :ets.info(:archethic_ko_ledger)[:type] - :set - """ - @spec start_link(list()) :: {:ok, pid()} - def start_link(args \\ []) do - GenServer.start_link(__MODULE__, args, name: __MODULE__) - end - - def init(_args) do - Logger.info("Initialize InMemory KO Ledger...") - - :ets.new(@table_name, [:set, :named_table, :public, read_concurrency: true]) - {:ok, []} - end - - @doc """ - Determine if the transaction address is registered as KO - - ## Examples - - iex> KOLedger.start_link() - ...> - ...> :ok = - ...> KOLedger.add_transaction(%Transaction{ - ...> address: "@Alice1", - ...> validation_stamp: %ValidationStamp{}, - ...> cross_validation_stamps: [%CrossValidationStamp{inconsistencies: [:proof_of_work]}] - ...> }) - ...> - ...> KOLedger.has_transaction?("@Alice1") - true - """ - @spec has_transaction?(binary()) :: boolean() - def has_transaction?(address) when is_binary(address) do - case :ets.lookup(@table_name, address) do - [] -> - false - - _ -> - true - end - end - - @doc """ - Retrieve the KO details for a transaction which has not been validated - - ## Examples - - iex> KOLedger.start_link() - ...> - ...> :ok = - ...> KOLedger.add_transaction(%Transaction{ - ...> address: "@Alice1", - ...> validation_stamp: %ValidationStamp{}, - ...> cross_validation_stamps: [%CrossValidationStamp{inconsistencies: [:proof_of_work]}] - ...> }) - ...> - ...> KOLedger.get_details("@Alice1") - {%ValidationStamp{}, [:proof_of_work], []} - """ - @spec get_details(binary()) :: - {ValidationStamp.t(), inconsistencies :: list(), errors :: list()} - def get_details(address) when is_binary(address) do - case :ets.lookup(@table_name, address) do - [{_, stamp, inconsistencies, errors}] -> - {stamp, inconsistencies, errors} - - _ -> - {nil, []} - end - end - - @doc """ - Remove a transaction being KO - - ## Examples - - iex> KOLedger.start_link() - ...> - ...> :ok = - ...> KOLedger.add_transaction(%Transaction{ - ...> address: "@Alice1", - ...> validation_stamp: %ValidationStamp{}, - ...> cross_validation_stamps: [%CrossValidationStamp{inconsistencies: [:proof_of_work]}] - ...> }) - ...> - ...> :ok = KOLedger.remove_transaction("@Alice1") - ...> KOLedger.has_transaction?("@Alice1") - false - """ - @spec remove_transaction(binary()) :: :ok - def remove_transaction(address) when is_binary(address) do - :ets.delete(@table_name, address) - :ok - end - - @doc """ - Mark a transaction as KO and include details of the invalidation with its - validation stamp, inconsistencies from the cross validation nodes and any additional errors - - ## Examples - - iex> KOLedger.start_link() - ...> - ...> :ok = - ...> KOLedger.add_transaction(%Transaction{ - ...> address: "@Alice1", - ...> validation_stamp: %ValidationStamp{}, - ...> cross_validation_stamps: [%CrossValidationStamp{inconsistencies: [:proof_of_work]}] - ...> }) - ...> - ...> :ets.tab2list(:archethic_ko_ledger) - [ - {"@Alice1", %ValidationStamp{}, [:proof_of_work], []} - ] - """ - @spec add_transaction(Transaction.t(), list()) :: :ok - def add_transaction( - %Transaction{ - address: tx_address, - validation_stamp: validation_stamp, - cross_validation_stamps: stamps - }, - additional_errors \\ [] - ) do - inconsistencies = - stamps - |> Enum.map(& &1.inconsistencies) - |> Enum.flat_map(& &1) - |> Enum.uniq() - - true = - :ets.insert( - @table_name, - {tx_address, validation_stamp, inconsistencies, additional_errors} - ) - - Logger.info("KO transaction #{Base.encode16(tx_address)}") - :ok - end -end diff --git a/lib/archethic/transaction_chain/supervisor.ex b/lib/archethic/transaction_chain/supervisor.ex index 12c94bdc3b..f21aafddbc 100644 --- a/lib/archethic/transaction_chain/supervisor.ex +++ b/lib/archethic/transaction_chain/supervisor.ex @@ -4,9 +4,7 @@ defmodule Archethic.TransactionChain.Supervisor do use Supervisor alias Archethic.TransactionChain.DBLedger.Supervisor, as: DBLedgerSupervisor - alias Archethic.TransactionChain.MemTables.KOLedger alias Archethic.TransactionChain.MemTables.PendingLedger - # alias Archethic.TransactionChain.MemTablesLoader alias Archethic.Utils @@ -17,8 +15,6 @@ defmodule Archethic.TransactionChain.Supervisor do def init(_args) do optional_children = [ PendingLedger, - KOLedger, - # MemTablesLoader, DBLedgerSupervisor ] diff --git a/lib/archethic_web/aeweb/controllers/web_hosting_controller.ex b/lib/archethic_web/aeweb/controllers/web_hosting_controller.ex index 44ac58d029..e8d0303375 100644 --- a/lib/archethic_web/aeweb/controllers/web_hosting_controller.ex +++ b/lib/archethic_web/aeweb/controllers/web_hosting_controller.ex @@ -94,17 +94,10 @@ defmodule ArchethicWeb.AEWeb.WebHostingController do Resources.load(reference_transaction, url_path, cache_headers) do {:ok, file_content, encoding, mime_type, cached?, etag} else - er when er in [:error, false] -> - {:error, :invalid_address} - - {:error, %Jason.DecodeError{}} -> - {:error, :invalid_content} - - {:error, reason} when reason in [:transaction_not_exists, :invalid_transaction] -> - {:error, :website_not_found} - - error -> - error + er when er in [:error, false] -> {:error, :invalid_address} + {:error, %Jason.DecodeError{}} -> {:error, :invalid_content} + {:error, :transaction_not_exists} -> {:error, :website_not_found} + error -> error end end diff --git a/lib/archethic_web/api/graphql/schema/resolver.ex b/lib/archethic_web/api/graphql/schema/resolver.ex index 92c20f6298..a0a24d788e 100644 --- a/lib/archethic_web/api/graphql/schema/resolver.ex +++ b/lib/archethic_web/api/graphql/schema/resolver.ex @@ -69,9 +69,6 @@ defmodule ArchethicWeb.API.GraphQL.Schema.Resolver do {:ok, {:error, :transaction_not_exists}} -> {:error, "Transaction not exists"} - {:ok, {:error, :invalid_transaction}} -> - {:error, "Transaction invalid"} - {:error, :decode_error} -> {:error, "Error in decoding transaction"} diff --git a/lib/archethic_web/api/jsonrpc/methods/call_contract_function.ex b/lib/archethic_web/api/jsonrpc/methods/call_contract_function.ex index dc60245675..ee9b72e5d3 100644 --- a/lib/archethic_web/api/jsonrpc/methods/call_contract_function.ex +++ b/lib/archethic_web/api/jsonrpc/methods/call_contract_function.ex @@ -96,9 +96,6 @@ defmodule ArchethicWeb.API.JsonRPC.Method.CallContractFunction do defp format_reason(:transaction_not_exists), do: {:error, :transaction_not_exists, "Contract transaction does not exist"} - defp format_reason(:invalid_transaction), - do: {:error, :invalid_transaction, "Contract transaction is invalid"} - defp format_reason(:network_issue), do: {:error, :internal_error, "Cannot fetch contract transaction"} diff --git a/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex b/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex index 9a40a5c1db..edf0751cec 100644 --- a/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex +++ b/lib/archethic_web/api/jsonrpc/methods/simulate_contract_execution.ex @@ -138,9 +138,6 @@ defmodule ArchethicWeb.API.JsonRPC.Method.SimulateContractExecution do defp format_reason(:transaction_not_exists), do: {:custom_error, :transaction_not_exists, "Contract transaction does not exist"} - defp format_reason(:invalid_transaction), - do: {:custom_error, :invalid_transaction, "Contract transaction is invalid"} - defp format_reason(:network_issue), do: {:internal_error, "Cannot fetch contract transaction"} diff --git a/lib/archethic_web/api/rest/controllers/transaction_controller.ex b/lib/archethic_web/api/rest/controllers/transaction_controller.ex index 6f3222c8cb..4d79b2dd84 100644 --- a/lib/archethic_web/api/rest/controllers/transaction_controller.ex +++ b/lib/archethic_web/api/rest/controllers/transaction_controller.ex @@ -258,9 +258,6 @@ defmodule ArchethicWeb.API.REST.TransactionController do {:error, :transaction_not_exists} -> {:error, "There is no transaction at recipient address."} - {:error, :invalid_transaction} -> - {:error, "The transaction is marked as invalid."} - {:error, :network_issue} -> {:error, "Network issue, please try again later."} diff --git a/lib/archethic_web/explorer/live/transaction_details_live.ex b/lib/archethic_web/explorer/live/transaction_details_live.ex index 13a1a0dc58..3dd5f84738 100644 --- a/lib/archethic_web/explorer/live/transaction_details_live.ex +++ b/lib/archethic_web/explorer/live/transaction_details_live.ex @@ -53,9 +53,6 @@ defmodule ArchethicWeb.Explorer.TransactionDetailsLive do {:error, :transaction_not_exists} -> PubSub.register_to_new_transaction_by_address(addr) {:noreply, handle_not_existing_transaction(socket, addr)} - - {:error, :invalid_transaction} -> - {:noreply, handle_invalid_transaction(socket, addr)} end else _ -> @@ -325,12 +322,6 @@ defmodule ArchethicWeb.Explorer.TransactionDetailsLive do |> assign(:error, :invalid_address) end - defp handle_invalid_transaction(socket, address) do - socket - |> assign(:address, address) - |> assign(:ko?, true) - end - def print_state(%UnspentOutput{encoded_payload: encoded_state}) do encoded_state |> State.deserialize() |> elem(0) |> State.format() end diff --git a/test/archethic/governance/pools/mem_table_loader_test.exs b/test/archethic/governance/pools/mem_table_loader_test.exs index 60c1762325..1d3a82c885 100644 --- a/test/archethic/governance/pools/mem_table_loader_test.exs +++ b/test/archethic/governance/pools/mem_table_loader_test.exs @@ -4,11 +4,9 @@ defmodule Archethic.Governance.Pools.MemTableLoaderTest do alias Archethic.Governance.Pools.MemTable alias Archethic.Governance.Pools.MemTableLoader - alias Archethic.TransactionChain.MemTables.KOLedger alias Archethic.TransactionChain.Transaction setup do - start_supervised!(KOLedger) start_supervised!(MemTable) :ok diff --git a/test/archethic/transaction_chain/mem_tables/ko_ledger_test.exs b/test/archethic/transaction_chain/mem_tables/ko_ledger_test.exs deleted file mode 100644 index 7e2fb07380..0000000000 --- a/test/archethic/transaction_chain/mem_tables/ko_ledger_test.exs +++ /dev/null @@ -1,11 +0,0 @@ -defmodule Archethic.TransactionChain.MemTables.KOLedgerTest do - use ExUnit.Case - - alias Archethic.TransactionChain.MemTables.KOLedger - - alias Archethic.TransactionChain.Transaction - alias Archethic.TransactionChain.Transaction.CrossValidationStamp - alias Archethic.TransactionChain.Transaction.ValidationStamp - - doctest KOLedger -end diff --git a/test/support/template.ex b/test/support/template.ex index 7cb0aeda1e..39f154bc70 100644 --- a/test/support/template.ex +++ b/test/support/template.ex @@ -13,7 +13,6 @@ defmodule ArchethicCase do alias TransactionChain.{ Transaction, TransactionData, - MemTables.KOLedger, MemTables.PendingLedger } @@ -234,7 +233,6 @@ defmodule ArchethicCase do [] end) - start_supervised!(KOLedger) start_supervised!(PendingLedger) start_supervised!(OriginKeyLookup) start_supervised!(P2PMemTable)