From 7506a3452a44ccc626fc12306caf559a678567b7 Mon Sep 17 00:00:00 2001 From: Neylix Date: Mon, 6 Nov 2023 00:36:28 +0100 Subject: [PATCH] Add encoded_state in LedgerOperation struct --- lib/archethic/bootstrap/network_init.ex | 2 +- lib/archethic/mining/validation_context.ex | 6 +++--- .../replication/transaction_validator.ex | 19 ++++++++----------- .../validation_stamp/ledger_operations.ex | 10 +++++----- test/archethic/mining/fee_test.exs | 10 +++------- test/support/transaction_factory.ex | 17 +++++++++-------- 6 files changed, 29 insertions(+), 35 deletions(-) diff --git a/lib/archethic/bootstrap/network_init.ex b/lib/archethic/bootstrap/network_init.ex index 4b151b322b..8f013456ba 100644 --- a/lib/archethic/bootstrap/network_init.ex +++ b/lib/archethic/bootstrap/network_init.ex @@ -188,7 +188,7 @@ defmodule Archethic.Bootstrap.NetworkInit do transaction_movements: Transaction.get_movements(tx), tokens_to_mint: LedgerOperations.get_utxos_from_transaction(tx, timestamp) } - |> LedgerOperations.consume_inputs(tx.address, unspent_outputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, unspent_outputs, timestamp) |> elem(1) validation_stamp = diff --git a/lib/archethic/mining/validation_context.ex b/lib/archethic/mining/validation_context.ex index 2710df51d4..28ecff4ff3 100644 --- a/lib/archethic/mining/validation_context.ex +++ b/lib/archethic/mining/validation_context.ex @@ -829,13 +829,13 @@ defmodule Archethic.Mining.ValidationContext do %LedgerOperations{ fee: fee, transaction_movements: resolved_movements, - tokens_to_mint: LedgerOperations.get_utxos_from_transaction(tx, validation_time) + tokens_to_mint: LedgerOperations.get_utxos_from_transaction(tx, validation_time), + encoded_state: encoded_state } |> LedgerOperations.consume_inputs( tx.address, unspent_outputs, - validation_time |> DateTime.truncate(:millisecond), - encoded_state + validation_time |> DateTime.truncate(:millisecond) ) end diff --git a/lib/archethic/replication/transaction_validator.ex b/lib/archethic/replication/transaction_validator.ex index b7b6332808..955a845a3a 100644 --- a/lib/archethic/replication/transaction_validator.ex +++ b/lib/archethic/replication/transaction_validator.ex @@ -388,17 +388,14 @@ defmodule Archethic.Replication.TransactionValidator do inputs, encoded_state ) do - case LedgerOperations.consume_inputs( - %LedgerOperations{ - fee: fee, - transaction_movements: transaction_movements, - tokens_to_mint: LedgerOperations.get_utxos_from_transaction(tx, timestamp) - }, - address, - inputs, - timestamp, - encoded_state - ) do + ops = %LedgerOperations{ + fee: fee, + transaction_movements: transaction_movements, + tokens_to_mint: LedgerOperations.get_utxos_from_transaction(tx, timestamp), + encoded_state: encoded_state + } + + case LedgerOperations.consume_inputs(ops, address, inputs, timestamp) do {false, _} -> {:error, :insufficient_funds} diff --git a/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations.ex b/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations.ex index 819e841e62..cba10539ad 100644 --- a/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations.ex +++ b/lib/archethic/transaction_chain/transaction/validation_stamp/ledger_operations.ex @@ -11,6 +11,7 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation defstruct transaction_movements: [], unspent_outputs: [], tokens_to_mint: [], + encoded_state: nil, fee: 0 alias Archethic.Contracts.Contract.State @@ -36,6 +37,7 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation transaction_movements: list(TransactionMovement.t()), unspent_outputs: list(UnspentOutput.t()), tokens_to_mint: list(UnspentOutput.t()), + encoded_state: State.encoded() | nil, fee: non_neg_integer() } @@ -201,16 +203,14 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation ledger_operations :: t(), change_address :: binary(), inputs :: list(UnspentOutput.t() | TransactionInput.t()), - timestamp :: DateTime.t(), - encoded_state :: State.encoded() | nil + timestamp :: DateTime.t() ) :: {boolean(), t()} def consume_inputs( - ops = %__MODULE__{tokens_to_mint: tokens_to_mint}, + ops = %__MODULE__{tokens_to_mint: tokens_to_mint, encoded_state: encoded_state}, change_address, inputs, - timestamp, - encoded_state + timestamp ) when is_binary(change_address) and is_list(inputs) and not is_nil(timestamp) do # Since AEIP-19 we can consume from minted tokens diff --git a/test/archethic/mining/fee_test.exs b/test/archethic/mining/fee_test.exs index dfd2c8d822..c9349c0054 100644 --- a/test/archethic/mining/fee_test.exs +++ b/test/archethic/mining/fee_test.exs @@ -3,7 +3,6 @@ defmodule Archethic.Mining.FeeTest do alias Archethic.Mining.Fee alias Archethic.P2P alias Archethic.P2P.Node - alias Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperations.UnspentOutput alias Archethic.TransactionChain.TransactionData alias Archethic.TransactionChain.TransactionData.Ledger alias Archethic.TransactionChain.TransactionData.Recipient @@ -313,10 +312,7 @@ defmodule Archethic.Mining.FeeTest do fee_without_state = Fee.calculate(tx, nil, 0.2, DateTime.utc_now(), nil, current_protocol_version()) - state_utxo = %UnspentOutput{ - type: :state, - encoded_payload: :crypto.strong_rand_bytes(1000) - } + encoded_state = :crypto.strong_rand_bytes(10) fee_with_state = Fee.calculate( @@ -324,8 +320,8 @@ defmodule Archethic.Mining.FeeTest do nil, 0.2, DateTime.utc_now(), - ArchethicCase.current_protocol_version(), - state_utxo + encoded_state, + current_protocol_version() ) assert fee_with_state > fee_without_state diff --git a/test/support/transaction_factory.ex b/test/support/transaction_factory.ex index dfe4324eed..67b9f3a24e 100644 --- a/test/support/transaction_factory.ex +++ b/test/support/transaction_factory.ex @@ -81,9 +81,10 @@ defmodule Archethic.TransactionFactory do ledger_operations = %LedgerOperations{ fee: Fee.calculate(tx, nil, 0.07, timestamp, encoded_state, current_protocol_version()), - transaction_movements: Transaction.get_movements(tx) + transaction_movements: Transaction.get_movements(tx), + encoded_state: encoded_state } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, encoded_state) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) poi = @@ -133,7 +134,7 @@ defmodule Archethic.TransactionFactory do %LedgerOperations{ fee: Fee.calculate(tx, nil, 0.07, timestamp, nil, current_protocol_version()) } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp = @@ -168,7 +169,7 @@ defmodule Archethic.TransactionFactory do %LedgerOperations{ fee: Fee.calculate(tx, nil, 0.07, timestamp, nil, current_protocol_version()) } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp = %ValidationStamp{ @@ -204,7 +205,7 @@ defmodule Archethic.TransactionFactory do %LedgerOperations{ fee: Fee.calculate(tx, nil, 0.07, timestamp, nil, current_protocol_version()) } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp = %ValidationStamp{ @@ -234,7 +235,7 @@ defmodule Archethic.TransactionFactory do %LedgerOperations{ fee: 1_000_000_000 } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp = @@ -269,7 +270,7 @@ defmodule Archethic.TransactionFactory do %TransactionMovement{to: "@Bob4", amount: 30_330_000_000, type: :UCO} ] } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp = @@ -319,7 +320,7 @@ defmodule Archethic.TransactionFactory do fee: Fee.calculate(tx, nil, 0.07, timestamp, nil, current_protocol_version()), transaction_movements: Transaction.get_movements(tx) } - |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp, nil) + |> LedgerOperations.consume_inputs(tx.address, inputs, timestamp) |> elem(1) validation_stamp =