Guide du langage Marlowe

Marlowe est conçu pour créer les éléments constitutifs des contrats financiers : paiements et dépôts des participants, choix des participants et informations du monde réel.

Marlowe est un petit langage, avec une poignée de constructions différentes qui, pour chaque contrat, décrivent un comportement impliquant un ensemble fixe et fini de rôles. Lorsqu'un contrat est exécuté, les rôles qu'il implique sont remplis par des participants, qui sont des identités sur la blockchain. Chaque rôle est représenté par un jeton sur la chaîne et les rôles peuvent être transférés pendant l'exécution du contrat, ce qui signifie qu'ils peuvent essentiellement être échangés.

Les contrats peuvent être construits en rassemblant un petit nombre de ces constructions qui, combinées, peuvent être utilisées pour décrire et modéliser de nombreux types différents de contrats financiers. Parmi les exemples, citons un contrat qui peut effectuer un paiement à un rôle ou à une clé publique, un contrat qui peut attendre une action de l'un des rôles, comme un dépôt de monnaie, ou un choix parmi un ensemble d'options. Voir l'exemple de Contrat de Séquestre ci-dessous.

Il est important de noter qu'un contrat ne peut pas attendre indéfiniment une action : si aucune action n'a été initiée avant un temps donné (le temps d'attente), le contrat continuera avec un comportement alternatif, par exemple, en prenant une action corrective comme le remboursement des fonds du contrat.

Les contrats Marlowe peuvent se ramifier sur la base d'alternatives et ont une durée de vie limitée, au terme de laquelle tout argent restant est restitué aux participants. Cette caractéristique signifie que l'argent ne peut pas être bloqué pour toujours dans un contrat. En fonction de l'état actuel d'un contrat, celui-ci peut faire un choix entre deux possibilités d'actions futures, qui sont elles-mêmes des contrats. Lorsque aucune autre action n'est requise, le contrat se ferme, et toute monnaie restante dans le contrat est remboursée.

Utilisation des Types de Haskell

Des Types Haskell sont utilisés pour représenter les différents composants du contrat, notamment les comptes, les valeurs, les observations et les actions. Ces éléments Marlowe sont utilisés pour fournir des informations et des entrées externes à un contrat en cours d'exécution afin de contrôler son évolution.

Pour modéliser les parties de base de Marlowe, une combinaison de Haskell data types sont utilisés, qui définissent des nouveaux types, et type synonymes qui donnent un nouveau nom à un type existant.

Outre la rédaction de contrats dans la version textuelle de Marlowe, vous pouvez également utiliser l'un des environnements de programmation visuelle suivants :

  1. Utilisant Blockly
  2. Utilisant JavaScript
  3. Utilisant Haskell

 

A quoi ressemble un contrat Marlowe ?

Un contrat est construit dans Marlowe en combinant un petit nombre de blocs de construction pour décrire de nombreux types de contrats financiers différents, comme effectuer un paiement, faire une observation, attendre qu'une certaine condition devienne vraie, etc. Le contrat est ensuite exécuté sur une blockchain, comme Cardano, et il interagit avec le monde extérieur.

Marlowe lui-même est intégré dans Haskell et est modélisé comme une collection de types de données algébriques en Haskell, avec des contrats définis par le type Contract :

data Contract = Close

              | Pay Party Payee Token Value Contract

              | If Observation Contract Contract

              | When [Case] Timeout Contract

              | Let ValueId Value Contract

              | Assert Observation Contract

Marlowe a six façons de construire des contrats. Cinq de ces méthodes – PayLetIfWhen, et Assert – construisent un contrat complexe à partir de contrats plus simples, et la cinquième méthode, Close, est un contrat simple. À chaque étape de l'exécution, en plus de renvoyer un nouvel état et un contrat de continuation, il est possible que des effets - paiements - et des avertissements soient également générés.

Pay

Un contrat de paiement Pay a p t v cont fera un paiement de valeur v de token t depuis le compte a à un bénéficiaire p, qui sera l'un des participants au contrat ou un autre compte du contrat. Des avertissements seront générés si la valeur v n'est pas positive, ou s'il n'y a pas assez d'argent sur le compte pour effectuer le paiement dans son intégralité (même s'il y a des soldes positifs d'autres jetons sur le compte). Dans ce dernier cas, un paiement partiel (de tout l'argent disponible) est effectué. Le contrat de continuation est celui donné dans le contrat : cont.

Close

Le contrat Close permet de clôturer (ou de résilier) le contrat. La seule action qu'il effectue consiste à rembourser les propriétaires des comptes qui présentent un solde positif. Cette action est effectuée pour un compte par étape, mais tous les comptes seront remboursés en une seule transaction.

Avant de passer à d'autres formes de contrats, nous devons présenter les valuesobservations, et actions:

  • Values - incluent des quantités qui changent avec le temps, notamment "l'intervalle actuel des slots", "le solde actuel d'un jeton sur un compte", et tout choix qui a déjà été fait (valeurs volatiles). Les valeurs peuvent également être combinées par addition, soustraction et négation, et peuvent être conditionnées par une observation.
  • Observations - sont des valeurs booléennes obtenues en comparant des valeurs, et peuvent être combinées à l'aide des opérateurs booléens standard. Il est également possible d'observer si un choix a été fait (pour un choix particulier identifié). Les observations auront une valeur à chaque étape de l'exécution.
  • Actions - se produisent à des moments particuliers de l'exécution, par exemple :
    • le dépôt de l'argent
    • faire un choix entre diverses alternatives, y compris une valeur d'oracle
    • notifier au contrat qu'une observation est devenue vraie
  • Oracles - sont en cours de développement pour la blockchain Cardano, et seront disponibles pour être utilisés dans Marlowe sur Cardano. En attendant, nous avons présenté un prototype d'oracle, qui est mis en œuvre dans le Marlowe Playground. Nous modélisons les oracles comme des choix qui sont faits par un participant ayant un rôle spécifique d'Oracle, "kraken".

If

Le conditionnel If obs cont1 cont2 continuera comme cont1 ou cont2, en fonction de la valeur booléenne de l'observation obs lorsque cette construction est exécutée.

When

Ceci est le constructeur le plus complexe pour les contrats, avec la forme When cases timeout cont. C'est un contrat qui est déclenché par des actions, qui peuvent se produire ou non à un slot donné : ce qui se passe lorsque diverses actions se produisent est décrit par les cas du contrat.

Dans le contrat When cases timeout cont, la liste cases contient une collection de cas. Chaque cas a la forme Case ac co où ac est une action et co une continuation (un autre contrat). Lorsqu'une action particulière, par exemple, ac, se produit, l'état est mis à jour en conséquence et le contrat se poursuit comme la continuation correspondante co.

Afin de s'assurer que le contrat progresse éventuellement, le contrat When cases timeout cont continuera comme cont une fois que le timeout, un numéro de slot, est atteint.

Let

Un contrat let Let id val cont permet à un contrat d'enregistrer une valeur, à un moment donné, et de lui donner un nom à l'aide d'un identifiant. Dans ce cas, l'expression val est évaluée, et stockée avec le nom id. Le contrat continue ensuite comme cont.

Outre le fait qu'il nous permet d'utiliser des abréviations, ce mécanisme signifie également que nous pouvons capturer et sauvegarder des valeurs volatiles susceptibles d'évoluer dans le temps, par exemple le prix actuel du pétrole ou le numéro de slot actuel, à un moment particulier de l'exécution du contrat, pour les utiliser ultérieurement dans l'exécution du contrat.

Assert

Le contrat assert Assert obs cont n'a pas d'effet sur l'état du contrat, il continue immédiatement comme cont, mais il émet un avertissement lorsque l'observation obs est fausse. Il peut être utilisée pour s'assurer qu'une propriété tient en tout point du contrat, puisque l'analyse statique échouera si une exécution quelconque fait en sorte qu'un assert soit faux.

Exemple de Contrat d'Entiercement

Supposons que alice veut acheter un chat de bob, mais aucun d'eux ne fait confiance à l'autre. Heureusement, ils ont une amie commune carol à qui ils font tous deux confiance pour être neutre (mais pas assez pour lui donner l'argent et servir d'intermédiaire). Ils se mettent donc d'accord sur le contrat suivant, écrit en utilisant un pseudocode fonctionnel simple. Ce type de contrat est un exemple simple d'entiercement (escrow):

 When aliceChoice

      (When bobChoice

            (If (aliceChosen 'ValueEQ' bobChosen)

                agreement

                arbitrate))

Le contrat est décrit à l'aide des constructeurs d'un type de données Haskell. Le constructeur When le plus externe a deux arguments : le premier est une observation et le second est un autre contrat. Le résultat voulu est que lorsque l'action se produit, le second contrat est activé.

Le second contrat est lui-même un autre When – qui demande une décision de la part de bob - mais à l'intérieur de cela, il y a un choix : Si alice et bob se mettent d'accord sur ce qu'il faut faire, c'est fait ; si ce n'est pas le cas, carol est invité à arbitrer et à prendre une décision.

En general, When propose une liste de cas, chacun avec une action et un contrat correspondant qui est déclenché lorsque cette action se produit. En utilisant cela, nous pouvons permettre à bob de faire le premier choix, plutôt que alice, comme ça:

 When [ Case aliceChoice

              (When [ Case bobChoice

                          (If (aliceChosen 'ValueEQ' bobChosen)

                             agreement

                             arbitrate) ],

               

        Case bobChoice

              (When [ Case aliceChoice

                           (If (aliceChosen 'ValueEQ' bobChosen)

                              agreement

                              arbitrate) ],

       ]

Dans ce contrat, Alice ou Bob peuvent faire le premier choix ; l'autre fait ensuite un choix. S'ils sont d'accord, c'est fait ; sinon, Carol arbitre.

Entiercement en Marlowe

Les contrats Marlowe intègrent des constructions supplémentaires pour garantir leur bon déroulement. Chaque fois que nous voyons un  When, nous devons fournir deux choses supplémentaires :

  • un timeout après lequel le contrat progressera, et
  • le contrat continuation avec lequel il progresse

 

Utilisant Timeouts

Timeouts sont utilisés lorsque la condition du When ne devient jamais vrai. Ainsi, des valeurs de délai d'attente et de continuation sont ajoutées à chaque When dans le contrat:

 When [ Case aliceChoice

              (When [ Case bobChoice

                          (If (aliceChosen 'ValueEQ' bobChosen)

                             agreement

                             arbitrate) ],

                    60              -- ADDED

                    arbitrate       -- ADDED

        ]

        40          -- ADDED

        Close       -- ADDED

Le  When  plus externe demande que le premier choix soit fait par Alice : si Alice n'a pas fait de choix au slot 40, le contrat est fermé et tous les fonds du contrat sont remboursés.

Comptes Marlowe et utilisation des Tokens

Un compte Marlowe contient des montants de plusieurs devises et/ou de tokens fongibles et non fongibles. Un montant concret est indexé par un Token, qui est une paire de CurrencySymbol et TokenName. Vous pouvez considérer un Account comme un Map Token Integer, où: data Token = Token CurrencySymbol TokenName

Le token ada de Cardano est représenté comme suit Token adaSymbol adaToken, cependant, vous pouvez créer vos propres monnaies et tokens.

Vous trouverez une copie officielle de ce document ici :

https://docs.cardano.org/en/latest/marlowe/marlowe-lang-guide.html

 

© Copyright 2020, IOHK Revision d7c21086.

 

Plus de traductions de Cardano à: http://CardanoForTheWorld.com