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 .
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
Las listas en Marlowe se incluyen entre corchetes, como en [2,3,4].
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