🇪🇸 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.