From c16b71fda376a4bb5afbf16fa951d2bd85c1474e Mon Sep 17 00:00:00 2001 From: bchamagne Date: Thu, 14 Dec 2023 18:58:28 +0100 Subject: [PATCH] resolved_addresses is now a map --- lib/archethic/mining/validation_context.ex | 10 ++++--- lib/archethic/transaction_chain.ex | 26 +++---------------- .../ledger_operations/transaction_movement.ex | 5 +--- .../methods/estimate_transaction_fee.ex | 6 +++-- .../mining/validation_context_test.exs | 12 ++++----- .../transaction_movement_test.exs | 18 ++++++------- 6 files changed, 28 insertions(+), 49 deletions(-) diff --git a/lib/archethic/mining/validation_context.ex b/lib/archethic/mining/validation_context.ex index 7e5acedf1..ac59b973f 100644 --- a/lib/archethic/mining/validation_context.ex +++ b/lib/archethic/mining/validation_context.ex @@ -11,7 +11,7 @@ defmodule Archethic.Mining.ValidationContext do :validation_stamp, :validation_time, :contract_context, - resolved_addresses: [], + resolved_addresses: %{}, unspent_outputs: [], cross_validation_stamps: [], cross_validation_nodes_confirmation: <<>>, @@ -76,7 +76,7 @@ defmodule Archethic.Mining.ValidationContext do transaction: Transaction.t(), previous_transaction: nil | Transaction.t(), unspent_outputs: list(UnspentOutput.t()), - resolved_addresses: list({original_address :: binary(), resolved_address :: binary()}), + resolved_addresses: %{Crypto.prepended_hash() => Crypto.prepended_hash()}, welcome_node: Node.t(), coordinator_node: Node.t(), cross_validation_nodes: list(Node.t()), @@ -1434,7 +1434,9 @@ defmodule Archethic.Mining.ValidationContext do end defp get_resolved_address_for_address(resolved_addresses, address) do - {_to, resolved} = Enum.find(resolved_addresses, fn {to, _resolved} -> to == address end) - resolved + Enum.find_value(resolved_addresses, fn + {^address, resolved} -> resolved + _ -> false + end) end end diff --git a/lib/archethic/transaction_chain.ex b/lib/archethic/transaction_chain.ex index 40b3a8d99..44d214475 100644 --- a/lib/archethic/transaction_chain.ex +++ b/lib/archethic/transaction_chain.ex @@ -55,10 +55,6 @@ defmodule Archethic.TransactionChain do alias __MODULE__.Transaction.ValidationStamp alias __MODULE__.Transaction.ValidationStamp.LedgerOperations - - alias __MODULE__.Transaction.ValidationStamp.LedgerOperations.TransactionMovement.Type, - as: TransactionMovementType - alias __MODULE__.Transaction.ValidationStamp.LedgerOperations.UnspentOutput alias __MODULE__.TransactionSummary alias __MODULE__.TransactionInput @@ -781,10 +777,7 @@ defmodule Archethic.TransactionChain do Resolve all the last addresses from the transaction data """ @spec resolve_transaction_addresses(Transaction.t(), DateTime.t()) :: - list( - {{origin_address :: binary(), type :: TransactionMovementType.t()}, - resolved_address :: binary()} - ) + %{Crypto.prepended_hash() => Crypto.prepended_hash()} def resolve_transaction_addresses( tx = %Transaction{data: %TransactionData{recipients: recipients}}, time = %DateTime{} @@ -796,7 +789,7 @@ defmodule Archethic.TransactionChain do addresses = tx |> Transaction.get_movements() - |> Enum.map(&{&1.to, &1.type}) + |> Enum.map(& &1.to) |> Enum.concat(recipient_addresses) authorized_nodes = P2P.authorized_and_available_nodes() @@ -805,20 +798,6 @@ defmodule Archethic.TransactionChain do TaskSupervisor, addresses, fn - {^burning_address, type} -> - {{burning_address, type}, burning_address} - - {to, type} -> - nodes = Election.chain_storage_nodes(to, authorized_nodes) - - case fetch_last_address(to, nodes, timestamp: time) do - {:ok, resolved} -> - {{to, type}, resolved} - - _ -> - {{to, type}, to} - end - ^burning_address -> {burning_address, burning_address} @@ -837,6 +816,7 @@ defmodule Archethic.TransactionChain do ) |> Stream.filter(&match?({:ok, _}, &1)) |> Enum.map(fn {:ok, res} -> res end) + |> Enum.into(%{}) end @doc """ diff --git a/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement.ex b/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement.ex index e728faa75..6e04ca6d5 100644 --- a/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement.ex +++ b/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement.ex @@ -224,12 +224,9 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation Resolve the addresses of given movements If a movement does not have a resolved address, it is dropped """ - @spec resolve_movements(list(t()), list({Crypto.prepended_hash(), Crypto.prepended_hash()})) :: + @spec resolve_movements(list(t()), %{Crypto.prepended_hash() => Crypto.prepended_hash()}) :: list(t()) def resolve_movements(movements, resolved_addresses) do - # list of pairs into map for ease of use - resolved_addresses = Enum.into(resolved_addresses, %{}) - movements |> Enum.reduce([], fn mvt = %__MODULE__{to: to}, acc -> case Map.get(resolved_addresses, to) do diff --git a/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex b/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex index 255c993cf..820fcb570 100644 --- a/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex +++ b/lib/archethic_web/api/jsonrpc/methods/estimate_transaction_fee.ex @@ -75,7 +75,9 @@ defmodule ArchethicWeb.API.JsonRPC.Method.EstimateTransactionFee do end defp get_resolved_address_for_address(resolved_addresses, address) do - {_to, resolved} = Enum.find(resolved_addresses, fn {to, _resolved} -> to == address end) - resolved + Enum.find_value(resolved_addresses, fn + {^address, resolved} -> resolved + _ -> false + end) end end diff --git a/test/archethic/mining/validation_context_test.exs b/test/archethic/mining/validation_context_test.exs index 28c55a18c..5b4b1a5dc 100644 --- a/test/archethic/mining/validation_context_test.exs +++ b/test/archethic/mining/validation_context_test.exs @@ -57,9 +57,7 @@ defmodule Archethic.Mining.ValidationContextTest do "seed", 0 ), - resolved_addresses: [ - {transfer_address, resolved_address} - ] + resolved_addresses: %{transfer_address => resolved_address} } expected_movements = [ @@ -147,10 +145,10 @@ defmodule Archethic.Mining.ValidationContextTest do validation_context = %ValidationContext{ create_context() - | resolved_addresses: [ - {contract_address1, latest_contract_address}, - {contract_address2, latest_contract_address} - ], + | resolved_addresses: %{ + contract_address1 => latest_contract_address, + contract_address2 => latest_contract_address + }, transaction: Transaction.new( :transfer, diff --git a/test/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement_test.exs b/test/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement_test.exs index 1f18fac80..3e495be62 100644 --- a/test/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement_test.exs +++ b/test/archethic/transaction_chain/transaction/validation_stamp/ledger_operations/transaction_movement_test.exs @@ -17,11 +17,11 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation resolved3_address = random_address() token_address = random_address() - resolved_addresses = [ - {transfer1_address, resolved1_address}, - {transfer2_address, resolved2_address}, - {transfer3_address, resolved3_address} - ] + resolved_addresses = %{ + transfer1_address => resolved1_address, + transfer2_address => resolved2_address, + transfer3_address => resolved3_address + } assert [ %TransactionMovement{ @@ -77,9 +77,9 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation resolved1_address = random_address() token_address = random_address() - resolved_addresses = [ - {transfer1_address, resolved1_address} - ] + resolved_addresses = %{ + transfer1_address => resolved1_address + } assert [ %TransactionMovement{ @@ -146,7 +146,7 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation transfer3_address = random_address() token_address = random_address() - resolved_addresses = [] + resolved_addresses = %{} assert [] = TransactionMovement.resolve_movements(