Skip to content

Commit

Permalink
Refactor Contracts functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Neylix committed Jan 13, 2025
1 parent 19c9b0e commit 15909ce
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 24 deletions.
14 changes: 14 additions & 0 deletions lib/archethic/contracts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -788,6 +788,20 @@ defmodule Archethic.Contracts do
end
end

@doc """
Returns a contract instance from a transaction
"""
@spec validate_and_parse_transaction(transaction :: Transaction.t()) ::
{:ok, InterpretedContract.t() | WasmContract.t()} | {:error, String.t()}
def validate_and_parse_transaction(tx = %Transaction{version: version}) when version < 4,
do: InterpretedContract.from_transaction(tx)

def validate_and_parse_transaction(%Transaction{data: %TransactionData{contract: nil}}),
do: {:error, "No contract to parse"}

def validate_and_parse_transaction(%Transaction{data: %TransactionData{contract: contract}}),
do: WasmContract.validate_and_parse(contract)

defp get_condition_constants(
:inherit,
%InterpretedContract{
Expand Down
20 changes: 8 additions & 12 deletions lib/archethic/contracts/wasm/contract.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,6 @@ defmodule Archethic.Contracts.WasmContract do
end
end

@doc """
Parse smart contract json block and return a contract struct
"""
@spec parse(Contract.t()) :: t()
def parse(%Contract{manifest: manifest, bytecode: bytecode}) do
uncompressed_bytes = :zlib.unzip(bytecode)
spec = WasmSpec.from_manifest(manifest)

{:ok, module} = WasmModule.parse(uncompressed_bytes, spec)
%__MODULE__{module: module}
end

@doc """
Validate WASM contract
"""
Expand Down Expand Up @@ -91,6 +79,14 @@ defmodule Archethic.Contracts.WasmContract do
{:ok, %__MODULE__{parse(contract) | state: get_state_from_tx(tx), transaction: tx}}
end

defp parse(%Contract{manifest: manifest, bytecode: bytecode}) do
uncompressed_bytes = :zlib.unzip(bytecode)
spec = WasmSpec.from_manifest(manifest)

{:ok, module} = WasmModule.parse(uncompressed_bytes, spec)
%__MODULE__{module: module}
end

defp get_state_from_tx(%Transaction{
validation_stamp: %ValidationStamp{
ledger_operations: %LedgerOperations{unspent_outputs: utxos}
Expand Down
9 changes: 1 addition & 8 deletions lib/archethic/mining/pending_transaction_validation.ex
Original file line number Diff line number Diff line change
Expand Up @@ -179,19 +179,12 @@ defmodule Archethic.Mining.PendingTransactionValidation do
end

defp parse_contract(tx) do
case validate_and_parse_transaction(tx) do
case Contracts.validate_and_parse_transaction(tx) do
{:ok, contract} -> {:ok, contract}
{:error, reason} -> {:error, "Smart contract invalid #{inspect(reason)}"}
end
end

defp validate_and_parse_transaction(tx = %Transaction{data: %TransactionData{code: code}})
when code != "",
do: Contracts.Interpreter.Contract.from_transaction(tx)

defp validate_and_parse_transaction(%Transaction{data: %TransactionData{contract: contract}}),
do: Contracts.WasmContract.validate_and_parse(contract)

defp validate_contract_ownership(contract, ownerships) do
if Contracts.contains_trigger?(contract),
do: ensure_ownership_in_contract(ownerships),
Expand Down
6 changes: 2 additions & 4 deletions lib/archethic/mining/proof_of_work.ex
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,9 @@ defmodule Archethic.Mining.ProofOfWork do
Smart contract code can defined which family to use (like security level)
"""
# TODO: support WasmContract inherit conditions
@spec list_origin_public_keys_candidates(Transaction.t()) :: list(Crypto.key())
def list_origin_public_keys_candidates(tx = %Transaction{data: %TransactionData{code: code}})
when code != "" do
def list_origin_public_keys_candidates(tx = %Transaction{version: version}) when version < 4 do
case Contracts.from_transaction(tx) do
{:ok,
%InterpretedContract{
Expand All @@ -127,8 +127,6 @@ defmodule Archethic.Mining.ProofOfWork do
when family != :all ->
SharedSecrets.list_origin_public_keys(family)

# TODO: support WasmContract inherit conditions

_ ->
do_list_origin_public_keys_candidates(tx)
end
Expand Down

0 comments on commit 15909ce

Please sign in to comment.