馃嚜馃嚫 Tutoriales de Marlowe: 2. Un primer ejemplo

Un primer ejemplo

Este tutorial presenta un contrato financiero sencillo en pseudoc贸digo, antes de explicar c贸mo se modifica para que funcione en Marlowe, dando el primer ejemplo de un contrato Marlowe.

Un simple contrato de custodia

MT-2-1

Supongamos que alice quiere comprar un gato de bob, pero ninguno de ellos conf铆a en el otro. Afortunadamente, tienen una amiga com煤n carol en quien ambos conf铆an para que sea neutral (pero no lo suficiente como para darle el dinero y actuar como intermediaria). Por lo tanto, acuerdan el siguiente contrato, escrito con un sencillo pseudoc贸digo funcional. Este tipo de contrato es un ejemplo sencillo de custodia .

When aliceChoice
     (When bobChoice
           (If (aliceChosen `ValueEQ` bobChosen)
               agreement
               arbitrate))

El contrato se describe utilizando los constructores de un tipo de datos Haskell. El constructor When m谩s externo tiene dos argumentos: el primero es una observaci贸n y el segundo es otro contrato. El significado que se pretende dar a esto es que cuando la acci贸n ocurre, el segundo contrato se activa.

El segundo contrato es a su vez otro When 鈥 solicitando una decisi贸n de bob 鈥 pero dentro de eso, hay una opci贸n : If alice y bob est谩n de acuerdo en lo que hay que hacer, se hace; si no, se le pide a carol que arbitre y tome una decisi贸n.

En general When ofrece una lista de casos , 1 cada uno con una acci贸n y un contrato correspondiente que se activa cuando esa acci贸n ocurre. Usando esto podemos permitir la opci贸n de que bob haga la primera elecci贸n, en lugar de alice, as铆:

When [ Case aliceChoice
            (When [ Case bobChoice
                        (If (aliceChosen `ValueEQ` bobChosen)
                           agreement
                           arbitrate) ],
      Case bobChoice
            (When [ Case aliceChoice
                        (If (aliceChosen `ValueEQ` bobChosen)
                            agreement
                            arbitrate) ]
     ]

En este contrato, tanto Alice como Bob pueden hacer la primera elecci贸n; entonces el otro hace una elecci贸n. Si est谩n de acuerdo, se hace; si no, Carol arbitra. En el resto del tutorial volveremos a la versi贸n m谩s sencilla en la que alice elige primero.

Ejercicio

Piensa en la ejecuci贸n de este contrato en la pr谩ctica. Supongamos que Alice ya ha comprometido algo de dinero en el contrato. 驴Qu茅 ocurrir谩 si Bob decide no seguir participando?

Hemos supuesto que Alice ya ha comprometido su pago, pero supongamos que queremos dise帽ar un contrato que lo garantice: 驴qu茅 tendr铆amos que hacer para ello?

Custodia en Marlowe

Los contratos de Marlowe incorporan construcciones adicionales para asegurar que progresan correctamente. Cada vez que vemos un When, tenemos que proporcionar dos cosas adicionales:

  • un timeout despu茅s del cual el contrato progresar谩, y
  • el contrato continuation al cual progresa.

Agregando timeouts

En primer lugar, examinemos c贸mo modificar lo que hemos escrito para atender el caso de que la condici贸n del When nunca se hace realidad. Por lo tanto, a帽adimos valores de timeout y de continuation a cada uno de los When que ocurren en el contrato.

When [ Case aliceChoice
            (When [ Case bobChoice
                        (If (aliceChosen `ValueEQ` bobChosen)
                           agreement
                           arbitrate) ]
                  60            -- ADDED
                  arbitrate)    -- ADDED
      ]
      40           -- ADDED
      Close        -- ADDED

El When m谩s externo exige que Alice haga la primera elecci贸n: si Alice no ha hecho una elecci贸n antes del slot 40, el contrato se cierra y se devuelven todos los fondos del contrato.

Close es normalmente el 煤ltimo paso en cada " trayecto" a trav茅s de un contrato Marlowe, y su efecto es devolver el dinero del contrato a los participantes; lo describiremos con m谩s detalle cuando veamos Marlowe paso a paso en un tutorial posterior. En este caso concreto, el reembolso se producir谩 en el slot n煤mero 40.

Observando las construcciones internas, si Alice ha hecho su elecci贸n, entonces esperamos la de Bob. Si no se produce en el slot 60, se llama a Carol para que arbitre. 2

A帽adiendo compromisos

A continuaci贸n, debemos ver c贸mo se compromete el efectivo como primer paso del contrato.

When [Case (Deposit "alice" "alice" ada price)   -- ADDED
 (When [ Case aliceChoice
             (When [ Case bobChoice
                         (If (aliceChosen `ValueEQ` bobChosen)
                            agreement
                            arbitrate) ]
                   60
                   arbitrate)
       ]
       40
       Close)
   ]
   10                                      -- ADDED
   Close                                   -- ADDED

Se pide un dep贸sito de price a "alice": si se da, se guarda en una cuenta, tambi茅n llamada "alice". Las cuentas de este tipo s贸lo existen durante la vigencia del contrato; cada cuenta pertenece a un 煤nico contrato.

Hay un timeout en el slot n煤mero 10 para hacer el dep贸sito; si se llega a 茅l sin que se haya hecho un dep贸sito, el contrato se cierra y se devuelve todo el dinero que ya estaba en el contrato. En este caso, es simplemente el fin del contrato.

Definiciones

M谩s adelante veremos que partes de esta descripci贸n del contrato, como arbitrate, agreement, y price, usan la integraci贸n de Haskell de Marlowe DSL para dar algunas definiciones abreviadas. Tambi茅n utilizamos strings sobrecargados para hacer m谩s concisas algunas descripciones, por ejemplo, de cuentas.

Estos aspectos se analizan con m谩s detalle cuando examinamos Marlowe integrado en Haskell.

Ejercicio

Comenta sobre la elecci贸n de los valores de timeout, y busca alternativas.

Por ejemplo, 驴qu茅 pasar铆a si el timeout de 40 en el When fuera sustituido por 60, y viceversa? 驴Ser铆a sensato tener el mismo timeout, de 100 digamos, en cada When? Si no es as铆, 驴por qu茅 no?

Este ejemplo ha mostrado muchos de los ingredientes del lenguaje contractual de Marlowe; en el pr贸ximo tutorial presentaremos el lenguaje completo.

Notas

  • Mientras que los nombres de las cuentas tienen que ser proporcionados manualmente en el ejemplo aqu铆, estos podr铆an ser generados por los wallets de los usuarios en una versi贸n de Marlowe desplegada en una blockchain.

D贸nde acudir para saber m谩s

Estos documentos cubren el trabajo original sobre el uso de la programaci贸n funcional para describir los contratos financieros.

Composing contracts: an adventure in financial engineering

Certified symbolic management of financial multi-party contracts

1

Las listas en Marlowe se incluyen entre corchetes, como en [2,3,4].

2

Una vez m谩s, describiremos c贸mo funcionan el arbitrate y agreement en Marlowe integrado.

漏 Copyright 2020, IOHK Revision b8f2855c.

Encuentra una copia oficial de este documento aqu铆:

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

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

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

2 Likes

Hola @cobblybear

Desconozco si lo sabe, pero quiz谩s sea 煤til mencionar que si rodea un bloque de c贸digo con tres s铆mbolos de comillas invertidas ( ` ). El lenguaje de markdown que utiliza el foro, asume que usted desea escribir ese bloque de texto como c贸digo y act煤a en consecuencia.

De esta forma, el lector puede copiar con facilidad el texto del c贸digo y este no pierde el formato. El primer ejemplo de este art铆culo quedar铆a as铆:

When aliceChoice
     (When bobChoice
           (If (aliceChosen `ValueEQ` bobChosen)
               agreement
               arbitrate))

Esperando que esta informaci贸n le sea de utilidad:
N谩poles.

1 Like

Hola @Napoles ,
Muchas gracias, no lo sab铆a. Voy a probar eso.
Alex

1 Like

Un placer @cobblybear. Quiz谩s desee tambi茅n leer esto. Si piensa que le pueda ayudar en otra cosa, por favor h谩game saber鈥

Saludos.
N谩poles.

@Napoles , muchas gracias, eso estaba buscando. Ya cambi茅 este art铆culo. Tambi茅n lo traduje as Franc茅s, pero cuando trato de editarlo me da un error al guardarlo, sin mucha informaci贸n. :frowning:

Me alegra que le haya sido de utilidad el art铆culo de markdown.

En cuanto a su traducci贸n al franc茅s: los art铆culos dejan de ser editables (incluso para sus creadores) luego de un tiempo, pero no parece ser el caso, puesto que este tiene apenas dos d铆as.

Poder ver el mensaje de error que se le muestra (aunque contenga poca informaci贸n) me ser铆a de ayuda. Por ahora, solo se me ocurre aconsejarle limpiar la cach茅 de su navegador (en Google Chrome esto se logra presionando las teclas Ctrl + Shift + R) y luego volver a intentar editar el art铆culo.

Tambi茅n podr铆a copiar las secciones de c贸digo es este art铆culo que ya est谩 editado y copiarlo en el otro. Estas son independiente del idioma. En 煤ltima instancia, puede hacer contacto con alg煤n moderador. Si lo logra editarlo, ya sea por una u otra v铆a, por favor h谩game saber.

Saludos.
N谩poles.