Plutus

De ALDEA WIKI
Ir a la navegación Ir a la búsqueda
Plutus Logo Oficial

Plutus es el lenguaje nativo para escribir contratos inteligentes en Cardano. Está escrito en Haskell y es considerado “Turing complete” [1]. Al ser basado en Haskell, el lenguaje de programación funcional por excelencia, asegura un ambiente completo de desarrollo y programación en donde la seguridad es una de sus principales ventajas ya que muestra de una manera más sencilla y robusta si el contrato inteligente es correcto identificando más fácilmente posibles vulnerabilidades. Plutus entonces permite una integración más nativa entre la programación de contratos y el desarrollo de aplicaciones descentralizadas de forma más segura que alternativas predecesoras.

Plutus fue concebido bajo la idea de que la programación funcional es mucho más adecuada para verificar y probar programas que las tradicionales formas de programación por objetos o programación imperativa.

Los contratos inteligentes escritos en Plutus están compuestos de dos partes: el código en línea que corre en la blockchain, compilado por Plutus Core, y el código fuera de línea o código del cliente que corre en la máquina del usuario, compilado por GHC (Glasgow Haskell Compiler).

En una definición más amplia, Plutus se refiere al conjunto de herramientas que permiten generar, compilar y ejecutar lógicas complejas en la blockchain de Cardano. A este conjunto de herramientas se le conoce como la Plataforma de Plutus la cual está compuesta de la siguiente forma.

Plutus Fundacional

Plutus Core

Es un lenguaje funcional con muchas cosas comunes a Haskell y una variante del cálculo lambda [2], de tal forma que gran parte de las funcionalidades de Haskell se pueden utilizar por el Plutus Core. Sin embargo, Plutus Core es generado por un plugin (Plutus Tx) que compila el código escrito en Haskell. Una vez generado el script en Plutus Core, los nodos en Cardano lo ejecutan durante la validación en línea.

Plutus Tx

Es un plugin que permite la compilación de script desde Haskell a Plutus Core. Su nombre es Tx que indica que estos componentes van asociados a una transacción o que pueden ser insertados en una transacción de acuerdo a lo estipulado por el modelo eUTXO.

En realidad, en el camino de la compilación del código escrito en Haskell hasta la ejecución en Plutus Core existen varias etapas intermedias que producen los llamados IRs (representaciones intermedias de un lenguaje). Para un entendimiento mayor del concepto de IRs referirse a [3]. En detalle las etapas de compilación son las siguientes:

  1. GHC: Haskell -> GHC Core
  2. Plutus Tx compiler: GHC Core -> Plutus IR
  3. Plutus IR compiler: Plutus IR -> Typed Plutus Core
  4. Type eraser: Typed Plutus Core -> Untyped Plutus Core

Al final lo que Plutus Core arroja, listo para ser ejecutado on-chain en la blockchain, es un “bytestring” que contiene de forma serializada la representación del programa. Su objetivo último, es permitir que el usuario escriba código en Haskell, entendible por el ser humano, y utilizarlo de manera indistinta a nivel “on-chain” y “off-chain”.

Framework de aplicación de Plutus

Son todas las aplicaciones de usuario que permiten la configuración de contratos inteligentes en Cardano.

PAB ( Plutus Application Backend)

Gestiona todo el código ejecutado fuera de línea. Se encarga de manejar la interacción entre el backend de la billetera, las entradas de usuarios, la sección del contrato que se refiere al código fuera de línea y comunicar estas interacciones al nodo sincronizado con la blockchain para ejecutar el script en línea y también obtener información del estado de las transacciones asociadas al script.  

Esta no es la única manera de interactuar con el ambiente de contratos inteligentes escritos en Plutus en Cardano, ya que muchos desarrolladores actualmente lo que hacen es construir su propio API (interfaz de programación de aplicaciones) para interactuar directamente cubriendo las funcionalidades que proclama el mismo PAB.

Plutus Playground

Es una herramienta de acceso web para escribir y testear cualquier código escrito en Plutus para construir un contrato inteligente. En el Playground se pueden visualizar los puntos de contacto para permitir a una billetera interactuar con el contrato, como por ejemplo pagar al script o recuperar fondos bloqueados previamente en el mismo. La otra parte importante del Playground es que permite generar el script que será incluido dentro de la transacción de acuerdo al modelo eUTXO. Tanto la ejecución del contrato (motivada por variables como el tiempo y cualquier factor externo), como las acciones del usuario, son simuladas por el Playground y ejecutadas de acuerdo a las definiciones especificadas en el script o contrato inteligente. El Playground no interactúa de ninguna manera con la blockchain de Cardano ni con ninguna billetera. En cambio, usa versiones simuladas llamadas “mockchain” y “mock wallet” respectivamente[9].

Librerías y SDK

Un SDK está disponible para desarrolladores el cual incluye librerías, APIs y toda la documentación necesaria para comenzar a utilizar Plutus en un ambiente local. La versión más actualizada de Plutus se encuentra en su repositorio oficial [4] y [5].

Evolución de Plutus

Plutus y la posibilidad de configurar contratos inteligentes y lógicas programables más elaboradas en la Blockchain de Cardano se introdujeron en septiembre de 2021 con Alonzo con lo que es conocido como Plutus V1. Sin embargo, es importante resaltar que esto no puede ser considerado como un hito puntual sino como una evolución en donde continuamente se han ido introduciendo mejoras con el fin de tener un marco de referencia integral más estable y completamente funcional para los contratos inteligentes. Esto ha sido permitido por un trabajo mancomunado entre los principales actores de la comunidad (IOG y desarrolladores de dApps fundamentalmente).

Con el hardfork de Vasil, se introduce Plutus V2 con una serie de funcionalidades y mejoras sobre la versión anterior como:

  • Los CIPs 31, 32 y 33 que se refieren en términos generales a las entradas de referencia (reference inputs) entre los que se incluyen datums y scripts de referencia. Esta mejora es acerca del acceso a la información necesaria al momento de armar una transacción que involucre la validación de un contrato inteligente. Anteriormente, para acceder a la información contenida en un Datum se tenía que utilizar y gastar el utxo que lo alojaba y para luego recrearlo en un utxo de salida como parte de la transacción. Esto implicaba un aumento en el tamaño de la transacción y por lo tanto en su costo. La propuesta del CIP 32 lo que dice es la de utilizar “inline datums” en donde las transacciones podrán utilizar la información de un datum alojado en un utxo sin gastarlo.

Caso similar sucede con el script o contrato compilado en Plutus Core en donde para poder utilizarlo como validador de una transacción se debe incluir como entrada de la misma, lo que conlleva al mismo problema explicado en la sección de Datum, aunque en este caso, presentando disminuciones en costos y aumentos en eficiencia más dramáticas.

  • Plutus V2 también actualiza el modelo de costos utilizando otros parámetros para el cálculo aunado a que su ejecución es más eficiente, reduciendo a su vez costos asociados a consumo de memoria y CPU.
  • Plutus V2 cambia el uso del colateral. El colateral es un utxo con una cantidad específica de ADAs, únicamente, y que es introducido a la transacción como garantía en el caso en que la ejecución del contrato falle. Cuando esto sucede, el utxo es consumido en su totalidad con el fin de desincentivar ataques como la introducción de scripts fantasmas que consumen recursos de cómputo en ciclos infinitos que ralentizan la ejecución de las transacciones e impactan el rendimiento general. Con Plutus V2, el colateral continúa siendo necesario pero esta vez únicamente la cantidad mínima del colateral es gastada retornando el balance a una dirección de cambio especificada.

Recursos disponibles

La principal referencia para comenzar el aprendizaje en la configuración de contratos inteligentes utilizando Plutus son los cursos libres ofrecidos por Dr Lars Brunjes de IOG conocidos como Plutus Pioneer Program[6]. Actualmente se han realizado 3 iteraciones, la más reciente ofrecida en enero de 2022. Así mismo, existen planes por parte de IOG de ofrecer una cuarta iteración especialmente con el fin de incluir las nuevas funcionalidades que ofrece la última versión Plutus V2.

Los PPP ofrecidos constan de 10 episodios que tratan de cubrir integralmente las bases mínimas necesarias en la configuración de contratos inteligentes, sin embargo, la configuración real de una aplicación en productivo que integre el uso de contratos inteligentes en Cardano requiere de una formación más integral más allá del conocimiento específico de Plutus.

Detalle del contenido del curso PPP en la iteración 3:

  • Semana 1: Bienvenida e introducción. Comienza con la explicación del modelo eUTxO y se muestra un contrato de gestión de subasta simulado en el “Plutus Playground”.
  • Semana 2:  Primer contrato básico. “AlwaysSucceeds contract” configurado utilizando tipos de datos de bajo nivel y mostrando la diferencia con tipos de datos de Alto nivel.
  • Semana 3: Incluyendo el concepto de tiempo en Plutus. Se usa por primera vez el contexto (Script Context) y se introduce el contrato tipo “vesting”. Se introduce el concepto de contratos parametrizados y por primera vez se interactúa con la blockchain Testnet.
  • Semana 4: Uso de “monads” en Haskell y su relación con Plutus. Se introduce el concepto de “contract monad” y cómo se implementa la sección de validación fuera de línea (offchain) en Plutus. También se realiza la prueba del contrato utilizando la opción EmulatorTrace.
  • Semana 5: Tokens nativos en el contexto Plutus. Se introduce el tipo de datos “Values” que representan los tokens nativos en Cardano incluyendo Ada. Se configura el equivalente de “AlwaysSucceeds” a nivel de minteo, se crea un contrato que valida quién puede crear tokens nativos utilizando una política monetaria básica y se configura un contrato que puede crear NFTs reales en Cardano.
  • Semana 6: Continuación de opciones de minteo en Plutus. Se realiza una política de minteo más compleja y por primera vez se crea un token nativo en la blockchain interactuando con la testnet. Se discuten diferentes escenarios de desarrollo de una aplicación en Plutus y se interactúa por primera vez con el PAB.
  • Semana 7: Concepto de máquinas de estado en Plutus. Se utiliza como ejemplo un contrato que implementa un juego básico y se compara utilizando la metodología de configuración de contrato en Plutus tradicional con el uso de máquinas de estado.
  • Semana 8: Continuación de máquinas de estado. Se continúa profundizando más en el concepto de máquinas de estado y se introduce el uso automatizado de pruebas o testeo automatizado de contratos utilizando funcionalidades más avanzadas con el EmulatorTrace.
  • Semana 9: Introducción a Marlowe. Mención breve de Marlowe y su relación con Plutus.
  • Semana 10: Staking en Plutus. Introducción al staking en Plutus, cómo delegar a pooles utilizando contratos en Plutus.

Otras referencias adicionales:

  • Emurgo Academy[7]: Ofrece cursos pagos en donde en particular el CDP (Cardano Developper Professional) se enfoca en el aprendizaje de Haskell, las herramientas que un desarrollador en Cardano debe conocer y en el aprendizaje de Plutus.
  • Cardano Stack Exchange[8]: Herramienta donde se pueden encontrar preguntas y respuestas a los problemas que otros desarrolladores y público en general encuentran alrededor de Cardano y en particular en Plutus.
  • Explicación introductoria de Plutus[10]: Explicación genérica de Plutus.
  • Librerías de Plutus[11]: Documentación generada por el compilador de Haskell asociada a las librerías que utiliza Plutus en la ejecución de contratos inteligentes.  

Al ser una tecnología tan nueva y en continuo desarrollo existen múltiples y nacientes referencias, cursos y fuentes documentales que no aparecen acá de igual, o mayor valor, a las listadas anteriormente.

Referencias

[1] Turing Complete

[2] Cálculo lambda

[3] Representaciones intermedias

[4] Repositorio Plutus

[5] Repositorio Plutus apps

[6] Plutus Pioneer Program

[7] Emurgo Academy CDP

[8] Stack Overflow Cardano

[9] Playground en Plutus

[10] Introducción a Plutus

[11] Librerías de Plutus


v2.0 - Escrito por MoxiePool, revisado por Amaru - 30-09-2022