Múltiplos Propósitos
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.