Tutorial completo em Tutorial Marlowe 3.0 (Parte 9) – Educação Cardano
9. Utilizando Marlowe
Este tutorial mostra como usar o Marlowe a partir do Haskell e, em particular, mostra como exercitar um contrato usando a semântica fornecida anteriormente.
9.1 Marlowe em Haskell
Este tutorial funciona na versão 3.0 do Marlowe, que pode ser encontrada na ramificação principal do repositório:
9.2 Percorrendo contratos
Como vimos anteriormente, a semântica de uma única transação é definida pela função
onde os tipos são definidos assim:
e States são definidos assim, com uma função auxiliar para definir um estado inicialmente vazio:
Podemos usar as instalações da ghci para concluir um contrato, uma transação de cada vez, e, aqui, faremos isso com o contrato de garantia incorporado contido em EscrowSimmpleV2.hs.
Para uma única etapa, você pode trabalhar em ghci como esta, usando o recurso para fazer ligações locais:
Ao fazer isso, correspondemos ao padrão de saída de uma aplicação de computeTransaction, que recebe três entradas: a segunda é um estado inicial (no slot número 0) e a terceira é o contrato de garantia inicial. O primeiro é um TransactionInput que contém um SlotInterval – aqui SlotInterval 0 0 – e um depósito de 450 Lovelace de “alice” em sua conta “alice”, ou seja, IDeposit “alice” “alice” ada 450.
(!) Se você quiser tentar isso sozinho no ghci, copie e cole a partir dos exemplos de código: eles estão nas janelas de rolagem horizontal.
A saída é correspondida com TransactionOutput txWarn1 txPay1 state1 con1, para que possamos examinar os vários componentes separadamente:
Isso mostra que a transação não gera avisos ou pagamentos, mas atualiza o estado para mostrar o saldo da conta “alice” e atualiza o contrato, pronto para receber uma opção de Alice ou Bob.
No próximo estado, o contrato está aguardando a entrada e, se Alice e Bob concordarem em fazer um pagamento a Bob, escolhendo 0, será gerado um pagamento a Bob. Isso é verificado por meio dessa interação no GHCI:
Uma maneira alternativa de fazer isso é adicionar essas definições a um arquivo de trabalho, por exemplo Build.hs, onde essas definições serão preservadas. De fato, seria muito sensato incluir algumas das definições usadas acima nesse arquivo.
9.3 Rotas alternativas através do contrato
As ligações locais são perdidas cada vez que um comando:: load ou: l é executado, o que nos permite reutilizar alguns comandos anteriores. Uma execução alternativa do contrato é dada por
-
Primeiro passo: Alice deposita dinheiro como no exemplo anterior.
-
Segundo passo: Alice e Bob selecionam opções diferentes. Isso pode ser feito assim:
Isso mostra que agora estamos em um contrato em que a escolha é de Carol e que ainda existe o 450 Lovelace na conta “alice”.
- Terceiro passo: Carol faz uma escolha. Se ela escolher 0, o pagamento a Bob será feito. Se ela escolher 1, Alice será reembolsada. Vamos fazer isso agora:
Portanto, agora o contrato está pronto para fechar e, assim, reembolsar qualquer dinheiro restante, mas fica claro pelo state3 que não há contas contendo saldos diferentes de zero e, portanto, o contrato é rescindido.
Por que o passo único é útil? É o equivalente a depuração, e podemos ver o estado interno do contrato em cada estágio, a continuação do contrato, ou seja, o que resta a ser executado e as ações produzidas em cada etapa.
Exercício: Explore outras maneiras de se envolver com o contrato – O que acontece quando Bob e Alice optam por reembolsar o dinheiro para Alice? – O que acontece se Bob e Alice discordam, mas Carol fica do lado de Bob?
9.4 Deve haver uma maneira mais fácil!
Sim existe!
A seguir, analisamos nossa ferramenta, o Marlowe Playground, que capitalizará o fato de estarmos trabalhando em uma DSL para automatizar a escolha das entradas corretas e permitir que os usuários interajam com os contratos.