Pular para o conteúdo

Múltiplos Propósitos

Por volta de 2 min

O Cardano permite transações mais complexas. Até agora, você viu vários tipos de transações: script simples, emissão, staking, delegação, etc. Mas o Cardano oferece a flexibilidade para criar transações mais complexas e misturar todos os tipos de transações necessárias. Por exemplo, adicionar metadados a transações de emissão, ou adicionar um componente de staking a uma transação de script simples. Este tutorial mostra como enviar uma transação com múltiplos propósitos.

Neste tutorial, você aprenderá a:

  • Retirar fundos de um script
  • Emitir um token
  • Retirar fundos delegados
  • Definir metadados para a transação

Como mencionado no tutorial de emissão, uma maneira de emitir um token é criando um script derivado de um keyHash. Para isso, primeiro você precisa gerar novas chaves e um hash de chave usando os seguintes comandos:

cardano-cli address key-gen \
    --verification-key-file script.vkey \
    --signing-key-file script.skey

cardano-cli address key-hash --payment-verification-key-file script.vkey
54a318b79a805f4f4cf0562a27302e93ed5b2e657cccdf4f6a8330ef

Tendo o hash da chave, você pode criar o script da seguinte forma:

cat payment.script
{
    "keyHash": "54a318b79a805f4f4cf0562a27302e93ed5b2e657cccdf4f6a8330ef",
    "type": "sig"
}

Você também precisa criar o endereço e o ID da política do script:

cardano-cli address build --payment-script-file payment.script 
addr_test1wzgd97kc864w62ulela5ykw8m64z2nu4wjejacyfp6u7qwqyz9v9m
cardano-cli transaction policyid --script-file payment.script
90d2fad83eaaed2b9fcffb4259c7deaa254f9574b32ee0890eb9e038

Primeira Transação

Primeiramente, você precisa financiar o endereço do script usando os fundos de payment.addr:

cardano-cli query utxo --address $(cat payment.addr)
                           TxHash                                 TxIx        Amount
--------------------------------------------------------------------------------------
12bc01bca615bb4cbe5f36b06d86092ad3c8a10e6a37e09f94a5f006f3aaf230     0        10040283782 lovelace + TxOutDatumNone

Nesta transação, o exemplo define um arquivo tx-out-inline-datum que contém apenas o número 42. Isso é essencial, pois você não poderia obter os fundos do script se ele não tivesse um datum:

cardano-cli transaction build --tx-in 12bc01bca615bb4cbe5f36b06d86092ad3c8a10e6a37e09f94a5f006f3aaf230#0 --tx-out $(cat payment.script.addr)+10000000 --change-address $(cat payment.addr) --tx-out-inline-datum-file datum.json --out-file 1st.tx

cat datum.json
{
  "constructor": 0,
    "fields": [{"int": 42}]
}

Segunda Transação

Nesta transação, você pode consultar os detalhes da UTXO:

cardano-cli query utxo --address $(cat  payment.script.addr)
                           TxHash                                 TxIx        Amount
--------------------------------------------------------------------------------------
04dfd8feaf87f82c8ec771954179879b22b5f693ed86d78a749111eed2de7879     0        10000000 lovelace + TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra (HashableScriptData "\216y\159\CAN*\255" (ScriptDataConstructor 0 [ScriptDataNumber 42]))
cardano-cli query utxo --address $(cat  payment.addr)
                           TxHash                                 TxIx        Amount
--------------------------------------------------------------------------------------
04dfd8feaf87f82c8ec771954179879b22b5f693ed86d78a749111eed2de7879     1        10030116301 lovelace + TxOutDatumNone

Você também pode verificar se possui recompensas disponíveis:

cardano-cli query stake-address-info --address $(cat stake.addr)
[
    {
        "address": "stake_test1uq954t492tmusk2dy9z505g3cz3sfpnh0swsqjmzk47rasqyn8uqp",
        "delegation": "pool1vzqtn3mtfvvuy8ghksy34gs9g97tszj5f8mr3sn7asy5vk577ec",
        "rewardAccountBalance": 15192167
    }
]

Agora você pode construir a transação com múltiplos propósitos:

cardano-cli transaction build \
    --tx-in 04dfd8feaf87f82c8ec771954179879b22b5f693ed86d78a749111eed2de7879#1 \
    --tx-in 04dfd8feaf87f82c8ec771954179879b22b5f693ed86d78a749111eed2de7879#0 \
    --tx-in-script-file payment.script \
    --change-address $(cat payment.addr) \
    --mint "1 $(cat payment.script.policyid).746F6B656E" \
    --mint-script-file payment.script \
    --withdrawal $(cat stake.addr)+15192167 \
    --metadata-json-file metadata.json \
    --out-file 2nd.tx

Você pode ver várias coisas acontecendo nesta transação:

  • Há dois UTXOs para serem gastos
    • Um é de um script, e o outro é de um pagamento
  • Você está emitindo um token e isso só pode ser feito definindo o mint-script-file - as regras para emitir esse token
  • Você está retirando fundos da delegação
  • Por fim, você está configurando um arquivo de metadados

Finalmente, você pode verificar o resultado da assinatura e envio da transação:

O endereço de pagamento agora possui:

  • O novo token emitido
  • Fundos que estavam no endereço do script
  • Recompensas da delegação
cardano-cli query utxo --address $(cat payment.addr)
                           TxHash                                 TxIx        Amount
--------------------------------------------------------------------------------------
c260ebce5868a56ce559f5277e6ca2d47b0eecb5b851b957fcb40a2194f67b29     0        10055118943 lovelace + 1 90d2fad83eaaed2b9fcffb4259c7deaa254f9574b32ee0890eb9e038.746f6b656e + TxOutDatumNone

O endereço do script não possui mais nenhum fundo.

cardano-cli query utxo --address $(cat payment.script.addr)
                           TxHash                                 TxIx        Amount
--------------------------------------------------------------------------------------

Não temos mais recompensas da delegação:

cardano-cli query stake-address-info --address $(cat stake.addr)
[
    {
        "address": "stake_test1uq954t492tmusk2dy9z505g3cz3sfpnh0swsqjmzk47rasqyn8uqp",
        "delegation": "pool1vzqtn3mtfvvuy8ghksy34gs9g97tszj5f8mr3sn7asy5vk577ec",
        "rewardAccountBalance": 0
    }
]

E a melhor parte, tudo isso foi feito em apenas uma transação.

Última atualização:
Contribuidores: cauechianca