PyTeal incorpora soporte ABI para contratos inteligentes

PyTeal acaba de recibir una importante actualización, que está convenciendo a los últimos puristas amantes de TEAL para comenzar a usar un poco de “azúcar” en su vida.

Un poco de historia sobre PyTeal

Antes de entrar en detalles, algunos antecedentes para los no iniciados.

La plataforma de contratos inteligentes de Algorand es la Máquina Virtual de Algorand (AVM). El Lenguaje de Aprobación y Ejecución de Transacciones (TEAL) es el código de programación que se compila en AVM. En otras palabras, TEAL es el lenguaje de programación para contratos inteligentes en Algorand.

TEAL es un lenguaje ensamblador. Hay una cierta satisfacción en el trabajo de montaje de bajo nivel: en cada línea individual, sabes exactamente lo que está pasando. Nada se abstrae y esto atrae a muchos desarrolladores cautelosos. Cuando los contratos inteligentes pueden contener millones de valores con respecto al ALGO dentro de su lógica, todos debemos ser escépticos sobre lo que hay debajo de las abstracciones.

Dicho esto, cuando pienso en escribir en lenguaje ensamblador, proyecto en programar un “solucionador de laberintos” como parte de un curso de sistemas en la universidad. El tema del laberinto presentó una analogía perfecta de lo completamente perdidos que nos sentimos cuando tratábamos de encontrar los errores en nuestro código.

Ingrese a PyTeal, o como algunos lo llaman: «azúcar sintáctico para TEAL»

PyTeal está escrito en Python. PyTeal no es Python en sí mismo, pero está compilado en el tiempo de ejecución de Python. Es decir: PyTeal usa la sintaxis de Python, pero la mayor parte de la sintaxis de Python no es exactamente PyTeal.

El código PyTeal crea un árbol de sintaxis abstracta (AST) que describe la lógica del programa que genera el código TEAL correspondiente. Este es un paradigma interesante y algo inusual: está escribiendo código que generará el programa que realmente se ejecutará.

Una de las principales ventajas de PyTeal sobre TEAL, es que los desarrolladores ya no tienen que pensar constantemente en la gestión de la pila, manteniendo la pila en su cabeza mientras recorren los códigos de operación.

Sin embargo, PyTeal logra esto sin dejar de ser fiel a las primitivas AVM. Los desarrolladores de PyTeal entienden cómo AVM procesará su lógica de código. Esto evita sorpresas y les da el control para optimizar sus contratos inteligentes.

Gracias a su arquitectura, los desarrolladores pueden usar código Python junto con PyTeal. El hecho de que pueda componer expresiones a partir de variables de Python, también es una característica bastante poderosa y parte del atractivo de PyTeal.

Una breve introducción a la ABI

Fundamentalmente, ¿cómo uso un contrato inteligente? Lo llamo usando una “transacción de llamada de aplicación”, en la que especifico: el ID de la aplicación, el método de aplicación específico al que estoy llamando y los argumentos necesarios para la llamada. Al procesar la transacción de llamada de la aplicación, el nodo luego evalúa el programa comenzando en la primera línea de TEAL.

¿Cómo sé cuáles son los nombres de los métodos, qué argumentos debo proporcionar y cómo los empaqueto en una llamada de aplicación válida que será interpretada según lo previsto por AVM? ¡Un ABI es cómo!

ABI significa “Application Binary Interface” y es un concepto que el desarrollador típico puede o no haber encontrado anteriormente.

Algorand ABI es un estándar para codificar llamadas de métodos a contratos inteligentes y decodificar los valores de retorno de dichas llamadas. El ABI se introdujo en Algorand en el otoño de 2021 y sigue el estándar ARC-4, que utiliza una codificación JSON. Este estándar permite la interoperabilidad, lo que facilita que cualquiera llame a las aplicaciones. Puedes encontrar una introducción completa a Algorand ABI aquí.

La mayoría de las aplicaciones en desarrollo, hoy en día tienen como objetivo cumplir con ARC-4; el estándar es invaluable y está aquí para quedarse.

Acercando el ABI a PyTeal

La descripción de ABI hace que suene engañosamente sencillo. En realidad, el enrutamiento de métodos y la codificación o decodificación de valores, han sido algunos de los aspectos que más tiempo han consumido en el desarrollo de contratos inteligentes en Algorand hasta la fecha. ¿Con qué frecuencia te has enfrentado con problemas al intentar obtener un valor en forma legible por humanos?

La última actualización de PyTeal simplifica enormemente este trabajo para los desarrolladores. Se compone de varias características:

  1. El enrutamiento de métodos se maneja esencialmente por ti mismo. Ahora solo tienes que agregar un decorador a tus métodos ABI.
  1. Los tipos ABI se introducen para que ya no tengas que preocuparte por codificar o decodificar los argumentos de tu método. Estos incluyen tipos de datos clásicos como cadenas y booleanos, así como los tipos de argumentos de transacción y referencia específicos de llamadas de la aplicación Algorand.
  1. Y una bonificación útil: el ABI JSON se genera para ti cuando se compila PyTeal.

Para obtener detalles completos sobre el uso, lea la (excelente) guía del usuario aquí.

Veamos un ejemplo para dar una idea de lo que está sucediendo.

Alice está escribiendo una aplicación bancaria que le permite depositar dinero, retirarlo y consultar su saldo.

La aplicación de Alice tiene 3 métodos a los que los clientes llamarán: depositar, retirar y obtener saldo. En su PyTeal, agregará el decorador del enrutador a cada método invocable. Para retirar, se ve así:

@router.method
def withdraw(amount: abi.Uint64, recipient: abi.Account) -> Expr:

El enrutador garantiza que las llamadas a su aplicación se enruten al método correcto, sin que Alice las gestione.

El método de retiro de Alice nombrado anteriormente, toma dos argumentos: la cantidad que desea retirar y la cuenta a la que está enviando los fondos. Alice usa los tipos de datos ABI abi.Uint64 y abi.Account para estos argumentos. Como resultado, no necesitas preocuparte por cómo codificar estos valores a medida que se pasan a tu aplicación.

El contrato inteligente completo de Alice se muestra aquí (solo como ejemplo, no como código auditado).

Ten en cuenta que en este caso de uso, los argumentos son un número entero y una cuenta. Estos no son demasiado difíciles de codificar, ya que TEAL admite tipos similares de forma nativa. PyTeal ABI también admite tipos complejos como Tuples y Arrays que son mucho más complicados de hacer sin él.

Bob quiere usar el contrato inteligente de Alice para su aplicación. Encuentra su descripción ABI JSON publicada que especifica la interfaz de su contrato inteligente.

Bob usa Atomic Transaction Composer (ATC) en el SDK para componer su grupo de transacciones que llama a los métodos del contrato de Alice desde su interfaz. Bob proporciona los argumentos necesarios usando el ATC… ¡y simplemente funciona! Bob ahora está usando el contrato inteligente de Alice, no se necesitan más trucos.

¿Qué sigue para PyTeal?

Inminentemente, PyTeal está lanzando soporte de AVM 7 para que los desarrolladores de PyTeal, puedan comenzar a jugar con “State Proofs” y todas las demás novedades de AVM que llegarán a Betanet.

En cuanto a PyTeal, nuestros esfuerzos ahora se centran en facilitar la depuración. Debido a que PyTeal genera el código TEAL que realmente se ejecuta, existe una cierta desconexión entre los errores informados y el código que se escribió. ¿Qué línea de PyTeal causó el error? Nuestro objetivo es responder a esta pregunta para ti.

Los comentarios siempre son bienvenidos en github o a través de nuestro servidor Discord en el canal #product-feedback.


Este artículo ha sido escrito originalmente por Anne Kenyon, publicado en https://medium.com y traducido por AlgoLatam.

Original Article: https://medium.com/algorand/pyteal-introduces-abi-support-for-smart-contracts-605153e91c5e

Deja una respuesta

Tu dirección de correo electrónico no será publicada.