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

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.

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ónIf 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í:

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.

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.

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 arbitrateagreement, 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.

 

[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: http://CardanoForTheWorld.com/es-ES