馃嚜馃嚫 Tutoriales de Marlowe: 15. Uso de Marlowe desde la l铆nea de comandos de ghci

Uso de Marlowe desde la l铆nea de comandos de ghci

Este tutorial muestra c贸mo utilizar Marlowe desde Haskell, y en particular muestra c贸mo ejercer un contrato utilizando la sem谩ntica dada anteriormente.

Marlowe en Haskell

Este tutorial funciona en la versi贸n 3.0 de Marlowe que se encuentra en la rama master del repositorio:

MT-15-1

Atravesar por los contratos

Como hemos visto antes, la sem谩ntica de una transacci贸n individual est谩 definida por la funci贸n

MT-15-2

donde los tipos se definen as铆:

MT-15-3

y States se definen as铆, con una funci贸n de ayuda para definir un estado inicialmente vac铆o:

MT-15-4

Podemos utilizar las prestaciones de ghci para recorrer un contrato transacci贸n por transacci贸n, y, en este caso, lo haremos con el contrato de dep贸sito en garant铆a incluido en EscrowSimmpleV2.hs https://github.com/input-output-hk/marlowe/blob/master/semantics-3.0/src/Language/Marlowe/Examples/EscrowSimpleV2.hs_.

Para ir paso a paso, puedes trabajar en ghci de esta manera, utilizando la facilidad de hacer enlaces locales:

Prelude> :set -XOverloadedStrings

Prelude> :l Language/Marlowe/Examples/EscrowSimpleV2.hs

...

*Lang...V2> **let** (TransactionOutput txWarn1 txPay1 state1 con1) **=** computeTransaction (TransactionInput (0, 0) [IDeposit "alice" "alice" ada 450]) (emptyState 0) contract

Al hacer esto, hemos comparado el patr贸n de salida de una aplicaci贸n de computeTransaction, que toma tres entradas: la segunda es un estado inicial (en el slot n煤mero 0) y la tercera es el contrato de custodia inicial. La primera es un TransactionInput que contiene un SlotInterval 鈥 aqu铆 SlotInterval 0 0 鈥 y un dep贸sito de 450 Lovelace de "alice" a su cuenta "alice" , es decir, IDeposit "alice" "alice" ada 450.

Nota
Si quieres probar esto por ti mismo en ghci, puedes copiar y pegar de los ejemplos de c贸digo en el documento original (ver enlace al final de la p谩gina): est谩n en ventanas de desplazamiento horizontal.

La salida est谩 relacionada con TransactionOutput txWarn1 txPay1 state1 con1 para poder examinar los distintos componentes por separado:

*Lang...V2> txWarn1

[]

*Lang...V2> txPay1

[]

*Lang...V2> state1

State {accounts **=** fromList [("alice", ada), 450)], choices **=** fromList [], boundValues **=** fromList [], minSlot **=** 0}

*Lang...V2> con1

When [Case (Choice (ChoiceId "choice" "alice") [Bound 0 1])

...

Esto muestra que la transacci贸n no genera advertencias ni pagos, pero actualiza el estado para mostrar el saldo en la cuenta "alice", y actualiza el contrato, listo para recibir una elecci贸n de Alice o Bob.

En el siguiente estado el contrato est谩 a la espera de la entrada, y si tanto Alice como Bob est谩n de acuerdo en hacer un pago a Bob eligiendo 0, entonces se genera un pago a Bob. Esto se verifica a trav茅s de esta interacci贸n en GHCI:

*Lang...V2> **let** (TransactionOutput txWarn2 txPay2 state2 con2) **=** computeTransaction (TransactionInput (SlotInterval 0 0) [IChoice (ChoiceId "choice" "alice") 0, IChoice (ChoiceId "choice" "bob") 0]) state1 con1

*Lang...V2> txPay2

[Payment "bob" ada 450]

*Lang...V2> con2

Close

*Lang...V2> state2

State {accounts **=** fromList [], choices **=** fromList [(ChoiceId "choice" "alice",0),(ChoiceId "choice" "bob",0)], boundValues **=** fromList [], minSlot **=** 0}

Una forma alternativa de hacerlo es a帽adir estas definiciones a un archivo de trabajo, por ejemplo Build.hs, donde se conservar谩n estas definiciones. De hecho, ser铆a muy sensato incluir algunas de las definiciones utilizadas anteriormente en dicho archivo.

Rutas alternativas a trav茅s del contrato

Los enlaces locales se pierden cada vez que un comando :load o :l se ejecuta, lo que nos permite reutilizar algunos comandos anteriores. Una ejecuci贸n alternativa del contrato viene dada por

  • Primer paso: Alicia deposita el dinero como en el ejemplo anterior.
  • Segundo paso: Alice y Bob seleccionan diferentes opciones. Esto puede hacerse as铆:
*Lang...V2> **let** (TransactionOutput txWarn2 txPay2 state2 con2) **=** computeTransaction (TransactionInput (SlotInterval 0 0) [IChoice (ChoiceId "choice" "alice") 0, IChoice (ChoiceId "choice" "bob") 1]) state1 con1

*Lang...V2> con2

When [Case (Choice (ChoiceId "choice" "carol") [Bound 1 1]) Close, Case (Choice (ChoiceId "choice" "carol") [Bound 0 0]) (Pay "alice" (Party "bob") ada (Constant 450) Close)] 100 Close

*Lang...V2> state2

State {accounts **=** fromList [("alice", ada), 450)], choices **=** fromList [(ChoiceId "choice" "alice",0),(ChoiceId "choice" "bob",1)], boundValues **=** fromList [] , minSlot **=** 0}

Esto muestra que ahora estamos en un contrato en el que la elecci贸n depende de Carol, y que todav铆a existen los 450 Lovelace en la cuenta "alice" .

  • Tercer paso: Carol hace una elecci贸n. Si elige 0, se paga a Bob. Si elige 1, se devuelve el dinero a Alice. Hagamos esto ahora:
*Lang...V2> **let** (TransactionOutput txWarn3 txPay3 state3 con3) **=** computeTransaction (TransactionInput (SlotInterval 0 0) [IChoice (ChoiceId "choice" "carol") 1]) state2 con2

*Lang...V2> txPay3

[Payment "alice" ada 450]

*Lang...V2> con3

Close

*Lang...V2> state3

State {accounts **=** fromList [], choices **=** fromList [(ChoiceId "choice" "alice",0), (ChoiceId "choice" "bob",1),(ChoiceId "choice" "carol",1)], boundValues **=** fromList [], minSlot **=** 0}

As铆 que ahora el contrato est谩 listo para Close, y as铆 devolver el dinero restante, pero est谩 claro por state3 que no hay cuentas con saldos distintos de cero, por lo que el contrato se termina.

驴Por qu茅 es 煤til ir paso a paso? Es el equivalente a un debugging, y podemos ver el estado interno del contrato en cada etapa, la continuaci贸n del contrato, es decir, lo que queda por ejecutar, y las acciones producidas en cada paso.

Ejercicio

Explora otras formas de abordar el contrato: 驴qu茅 ocurre si Bob y Alice deciden devolver el dinero a Alice? - 驴Qu茅 ocurre si Bob y Alice no est谩n de acuerdo, pero Carol se pone del lado de Bob?

漏 Copyright 2020, IOHK Revision 1b7b1fc1.

Encuentra una copia oficial de este documento aqu铆:

https://alpha.marlowe.iohkdev.io/doc/marlowe/tutorials/using-marlowe.html

https://docs.cardano.org/projects/plutus/en/latest/marlowe/tutorials/using-marlowe.html

M谩s traducciones de Cardano en: Cardano For The World