PyTeal acaba de recibir una actualización importante, una actualización que está convenciendo a los últimos puristas amantes de TEAL de comenzar a usar un poco de azúcar en su vida.
Antes de entrar en detalles, algunos antecedentes para los no iniciados.
La plataforma de contrato inteligente de Algorand es la máquina virtual de Algorand (AVM). El lenguaje de aprobación de ejecución de transacciones (TEAL) es el lenguaje 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 valor de Algo dentro de su lógica, todos debemos ser escépticos sobre lo que hay debajo de las abstracciones.
Dicho esto, cuando yo Pienso en escribir lenguaje ensamblador, pienso 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.
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 PyTeal correcta.
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.
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. Puede 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.
La descripción de la ABI anterior hace que suene engañosamente sencillo. En realidad, el enrutamiento de métodos y la codificación y 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 se ha enfrentado con galimatías 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:
El enrutamiento de métodos se maneja esencialmente por usted. Ahora solo tiene que agregar un decorador a sus métodos ABI. Los tipos ABI se introducen para que ya no tenga que preocuparse por codificar o decodificar los argumentos de su método. Estos incluyen tipos de datos clásicos como cadenas y booleanos, así como tipos de argumentos de transacciones y referencias específicas de la llamada de la aplicación Algorand. Y una ventaja útil: el ABI JSON se genera para usted cuando compila su PyTeal.
Para obtener detalles completos sobre el uso, lea la (excelente) guía del usuario aquí.
Veamos un ejemplo para darle una idea de lo que está sucediendo aquí.
Alice está escribiendo una aplicación bancaria que le permite depositar dinero, retirar dinero y consultar su saldo.
La aplicación de Alice tiene 3 métodos a los que llamarán los clientes: depósito, retirary obtenersaldo. En su PyTeal, agrega el decorador del enrutador a cada método invocable. Para retirarse parece a esto:
@router.método
def retirar (cantidad: abi.Uint64, destinatario: abi.Cuenta) -> Expr:
El enrutador garantiza que las llamadas a su aplicación se enruten al método correcto sin que Alice las gestione.
Alicia retirar El método anterior toma dos argumentos: la cantidad que desea retirar y la cuenta a la que está enviando los fondos. Alice usa tipos de datos ABI abi.uint64 y abi.Cuenta por estos argumentos. Como resultado, no necesita preocuparse por cómo codificar estos valores a medida que se pasan a su aplicación.
El contrato inteligente completo de Alice se muestra aquí (solo como ejemplo, no como código auditado).
Tenga 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.
Inminentemente, PyTeal está lanzando soporte para 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 PyTeal que se escribió. ¿Qué línea de PyTeal causó el error? Nuestro objetivo es responder a esta pregunta para usted.
Los comentarios siempre son bienvenidos en github o a través de nuestro servidor Discord en el canal #product-feedback.