馃嚜馃嚫 Tutoriales de Marlowe: 6. Los tipos de datos Marlowe

Los tipos de datos Marlowe

Este tutorial introduce formalmente a Marlowe como un tipo de datos de Haskell, adem谩s de presentar los diferentes tipos utilizados por el modelo, y discutir una serie de supuestos sobre la infraestructura en la que se ejecutar谩n los contratos. El c贸digo que describimos aqu铆 proviene de los m贸dulos Haskell Semantics.hs y Util.hs.

Marlowe

El lenguaje espec铆fico de dominio (DSL) de Marlowe se modela como una colecci贸n de tipos algebraicos en Haskell, con contratos dados por el tipo Contract :

MT-6-1

En el tutorial anterior vimos lo que hacen estos contratos. En el resto de este tutorial profundizaremos un poco m谩s en los tipos Haskell que se utilizan para representar los distintos componentes de los contratos, incluyendo cuentas, valores, observaciones y acciones. Tambi茅n veremos los tipos que se relacionan con la ejecuci贸n de los contratos, incluyendo las entradas, los estados, el entorno.

Componentes b谩sicos

Para modelar las partes b谩sicas de Marlowe utilizamos una combinaci贸n de Haskell data types, que definen nuevos types, y type sin贸nimos que dan un nuevo nombre a un existente type. 1

Una Cuenta Marlowe contiene importes de m煤ltiples monedas y/o tokens fungibles y no fungibles. Una cantidad concreta est谩 indexada por un Token, que es un par de CurrencySymbol y TokenName. Puedes considerar un Account como un Map Token Integer, donde

MT-6-2

El token Ada de Cardano es Token adaSymbol adaToken. Pero puedes crear tus propias monedas y tokens.

Los tokens de una moneda pueden representar roles en un contrato, por ejemplo, 鈥渃omprador鈥 y 鈥渧endedor鈥. Piensa en un contrato legal en el sentido de 鈥渆n lo sucesivo, el ejecutante/vendedor/artista/consultor鈥. De este modo, podemos desvincular la noci贸n de propiedad de un rol contractual y hacer que sea negociable. As铆, puedes vender tu pr茅stamo o comprar una parte de un rol en alg煤n contrato.

MT-6-3

Aqu铆 account tiene un buyer token de moneda 鈥淭radeRoles鈥, y 1000 lovelace.

Un Party se representa como un hash de clave p煤blica o un nombre de rol.

MT-6-4

Para hacer progresar un contrato Marlowe, una parte debe aportar una evidencia. Para parte PK esto ser铆a una firma v谩lida de una transacci贸n firmada por una clave privada de una clave p煤blica que tiene el hash del PubKeyHash de la parte, similar al mecanismo Pay to Public Key Hash de Bitcoin. Para una parte Role la evidencia es gastar un role token dentro de la misma transacci贸n, normalmente al mismo propietario.

As铆 que, las partes Role se ver谩n como (Role "alice"), (Role "bob") y as铆 sucesivamente. Sin embargo, Haskell nos permite presentar y leer estos valores de forma m谩s concisa (declarando una instancia personalizada de Show y utilizando overloaded strings ) para que estos puedan ser introducidos y le铆dos como "alice", "bob" etc.

Los n煤meros de slot y las cantidades de dinero se tratan de forma similar; con el mismo esquema de show/overload aparecer谩n en los contratos como n煤meros:

MT-6-5

Nota que "alice" es la propietaria en el sentido de que se le devolver谩 el dinero que haya en la cuenta cuando el contrato finalice.

Podemos utilizar overloaded strings para permitirnos abreviar esta cuenta por el nombre de su propietario: en este caso "alice".

Un pago puede hacerse a una de las partes del contrato, o a una de las cuentas del contrato, y esto se refleja en la definici贸n

MT-6-6

Las opciones -de n煤meros enteros- se identifican con ChoiceId que combina un nombre para la elecci贸n con el Party que ha hecho la elecci贸n:

MT-6-7

Los valores, definidos mediante Let are also identified by integers. 2

MT-6-8

Values, observations and actions

Partiendo de los tipos b谩sicos, podemos describir tres componentes de nivel superior de los contratos: un tipo de values, encima un tipo de observations, y tambi茅n un tipo de actions, que desencadenan casos particulares. En primer lugar, observando a Value tenemos

MT-6-9

Los diferentes tipos de values 鈥 que todos ellos son Integer 鈥 se explican por s铆 mismos, pero con el fin de estar completos, tenemos

  • Consulta del valor en una cuenta AvailableMoney, hecha en una elecci贸n ChoiceValue y en un identificador ya definido UseValue.
  • Constantes y operadores aritm茅ticos.
  • Scale multiplica un Value por una constante racional, por ejemplo, 2/3, y redondea el resultado utilizando el redondeo " a medias " o " bancario ". As铆, 14/10 se redondea a 1, tanto 15/10 como 25/10 se redondean a 2.
  • El inicio y el final del intervalo del slot actual; v茅ase m谩s abajo para m谩s informaci贸n sobre esto.
  • Cond representa las expresiones if, es decir, el primer argumento de Cond es una condici贸n (Observation) para chequear, el segundo es un Value para tomar cuando la condici贸n es satisfecha y el 煤ltimo es un Value para la condici贸n insatisfecha; por ejemplo: (Cond FalseObs (Constant 1) (Constant 2)) es equivalente a (Constant 2)

A continuaci贸n tenemos observations

MT-6-10

Son realmente autoexplicativos: podemos comparar valores para la (in)igualdad y la ordenaci贸n, y combinar observations utilizando las conectivas booleanas. La 煤nica otra construcci贸n ChoseSomething indica si se ha hecho alguna elecci贸n para un determinado ChoiceId.

Los casos y las acciones vienen dados por estos tipos:

MT-6-11

Tres tipos de actions son posibles:

  • Un Deposit n p t v hace un dep贸sito de value v de token t de party p dentro de account n.

  • Se hace una elecci贸n para un id particular con una lista de l铆mites en los valores que son aceptables. Por ejemplo, [Bound 0 0, Bound 3 5] ofrece la posibilidad de elegir una de las siguientes opciones 0, 3, 4 y 5.

  • El contrato es notificado para que se realice una determinada observaci贸n. Normalmente, esto lo har铆a una de las partes, o uno de sus wallets actuando autom谩ticamente.

Esto completa nuestro an谩lisis de los tipos que componen los contratos de Marlowe.

Transactions

Como hemos se帽alado anteriormente, la sem谩ntica de Marlowe consiste en la construcci贸n de transacciones, as铆:

MT-6-1

Una transacci贸n se construye a partir de una serie de pasos, algunos de los cuales consumen un valor de entrada, y otros producen efectos, o pagos. Al describir esto explicamos que una transacci贸n modificaba un contrato (a su continuaci贸n) y el estado, pero m谩s precisamente tenemos una funci贸n

MT-6-13

donde los tipos se definen as铆:

MT-6-14

La notaci贸n utilizada aqu铆 a帽ade los nombres de los campos a los argumentos de los constructores, proporcionando selectores para los datos, as铆 como haciendo m谩s claro el prop贸sito de cada campo.

El tipo TransactionInput tiene dos componentes: el SlotInterval en el que puede a帽adirse v谩lidamente a la blockchain, y una secuencia ordenada de valores de Input que se procesar谩n en esa transacci贸n.

Un value TransactionOutput tiene cuatro componentes: los dos 煤ltimos son el State y el Contract actualizados, mientras que el segundo da una secuencia ordenada de Payments producidos por la transacci贸n. El primer componente contiene una lista de las advertencias producidas por el procesamiento de la transacci贸n.

Series de slots

Esto forma parte de la arquitectura de Cardano/Plutus, que reconoce que no es posible predecir con precisi贸n en qu茅 slot se procesar谩 una transacci贸n concreta. Por lo tanto, a las transacciones se les da un intervalo de slots en el que se espera que se procesen, y esto se traslada a Marlowe: cada paso de un contrato de Marlowe se procesa en el contexto de una serie de slots.

MT-6-15

驴C贸mo afecta esto al procesamiento de un contrato Marlowe? Cada paso se procesa en relaci贸n con un intervalo de slots, y el valor del slot actual tiene que estar dentro de ese intervalo.

Los puntos finales del intervalo son accesibles como los valores SlotIntervalStart y SlotIntervalEnd, y estos pueden ser utilizados en las observaciones. Los timeouts deben procesarse de forma inequ铆voca , de modo que todos los valores del intervalo de slots tienen que haber superado el timeout para que surta efecto, o caer antes del timeout, para que la ejecuci贸n normal surta efecto. En otras palabras, el valor del timeout debe ser menor o igual que SlotIntervalStart (para que el timeout tenga efecto) o ser estrictamente mayor que SlotIntervalEnd (para que la ejecuci贸n normal tenga lugar).

Notas

El modelo hace una serie de suposiciones sobre la infraestructura de blockchain en la que se ejecuta.

  • Se supone que las funciones y operaciones criptogr谩ficas son proporcionadas por una capa externa a Marlowe, por lo que no es necesario modelarlas expl铆citamente.
  • Suponemos que el tiempo es de 鈥済rano grueso鈥 y se mide por n煤mero de bloque o slot, de modo que, en particular, los timeouts se delimitan utilizando n煤meros de bloque/slot.
  • La realizaci贸n de un dep贸sito no es algo que un contrato pueda llevar a cabo; m谩s bien, puede solicitar que se realice un dep贸sito, pero eso entonces tiene que establecerse externamente: de ah铆 la entrada de (una colecci贸n de) dep贸sitos para cada transacci贸n.
  • El modelo administra la devoluci贸n de fondos al propietario de una cuenta particular cuando un contrato alcanza el punto de Close.

1

De hecho, utilizamos declaraciones newtype en vez de data types porque se implementan de manera m谩s eficiente.

2

Esto puede ser modificado en el futuro para permitir que los valores sean nombrados por strings.

漏 Copyright 2020, IOHK Revision 34aa9c32.

Encuentra una copia oficial de este documento aqu铆:

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

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

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