Blog

May 27, 2020

La arquitectura de los contratos inteligentes de Algorand

By: Silvio Micali

Este artículo se enfoca el componente externo a la cadena de la arquitectura de los contratos inteligentes de Algorand, desarrollado por Jing Chen, Maurice Herlihy, Victor Luchangco, Silvio Micali, y Liuba Shrira. El artículo completo se publicará dentro de poco.

Los contratos inteligentes permiten que las blockchains sean programables. Como una máquina expendedora, un contrato inteligente establece un procedimiento para transferir activos claramente definido. Por ejemplo: Alice quiere comprar tokens emitidos por Bob, entonces, ella envía monedas al contrato inteligente de Bob. El código de este contrato cuenta las monedas y, quizás, comprueba si Alice está en la base de datos de inversores calificados del contrato y entonces transfiere la cantidad correcta de tokens a la cuenta de Alice. El intercambio es transparente: Alice puede examinar el código del contrato y el código se ejecuta sin la participación de Bob.

Este artículo explica la arquitectura de los contratos inteligentes de Algorand y por qué se diferencian de enfoques anteriores en aspectos importantes. Particularmente, la arquitectura de los contratos inteligentes de Algorand incluye muchos tipos diferentes de herramientas debido a que los usuarios de Algorand necesitan resolver muchos tipos diferentes de problemas.

Nuestra arquitectura de dos niveles

En primer lugar, para las necesidades diarias, Algorand ofrece los contratos inteligentes en la primera capa, una ruta rápida y segura para las transacciones diarias y comunes (retomaremos estos contratos inteligentes en un momento). En segundo lugar, Algorand ofrece contratos externos a la cadena (segunda capa) para los contratos inteligentes especializados que requieren más personalización. Estos son los contratos inteligentes que presentaremos en esta entrada de blog.

Comparación con los contratos inteligentes de Ethereum

La blockchain de Ethereum fue la primera en demostrar el poder de los contratos inteligentes, por lo tanto los contratos inteligentes de Ethereum son el punto inicial natural para analizar las tecnologías sucesoras. Sus ventajas y desventajas ya han sido extensivamente analizadas en la comunidad de blockchain, y los análisis han dado lugar a varios nuevos diseños para lenguajes de contratos inteligentes. En esta ocasión, nos enfocamos en dos cuestiones de particular importancia para la blockchain de Algorand.

1. Los problemas simples muchas veces requieren soluciones complejas y frágiles.

Imagina que Alice y Bob acuerdan que, si Alice envía 100 "Dólarmonedas" a Bob, Bob transferirá 100 "BobTokens" a Alice. Alice quiere asegurarse de que si ella transfiere las monedas, recibirá los tokens, y Bob quiere garantías similares. Este tipo de transacción, donde las transferencias son controladas por partes sospechosas una de la otra que suceden o no suceden, se llaman intercambio atómico (atomic swap, en inglés). Programar un intercambio atómico usando los contratos inteligentes de Ethereum requiere un contrato de bloqueo de tiempo y hash (hashed timelock contract, en inglés), o algo similar. Se trata de un protocolo delicado, temporizado y de fase múltiple donde cualquier error de programación puede resultar desastroso. En contraste, como se indicó en una publicación anterior, los contratos de Algorand en la primera capa ofrecen una solución simple y segura a los intercambios atómicos y sus problemas relacionados.

2. Todos deben esperar a todos los demás

Imagina una tienda francesa de quesos, provinciana y encantadora. Allí, a los clientes no se les permite elegir ellos mismos la mercadería. En vez de eso, todos los quesos están detrás del mostrador, a cargo de un dependiente. Los clientes hacen fila frente al mostrador. El cliente adelante de la fila está buscando un queso de cabra de una región específica. El dependiente explica que tiene tres de esos quesos, uno suave, otro medio y otro fuerte, pero el medio está un poco salado. Después de hablar juiciosamente sobre los méritos de esos quesos, el cliente elige uno. El dependiente troza y pesa el queso, lo envuelve en papel e hilo, y calcula el precio. El cliente busca cambio, paga, toma su pedido y se va, satisfecho con su compra. "Buenos días, ¿con qué puedo ayudarle?", le dice el dependiente al próximo cliente.

Al igual que en la tienda de quesos tradicional francesa, todos las ejecuciones de contratos inteligentes de Ethereum bloquean el progreso de la blockchain en su totalidad. Aún peor, todos los mineros deben volver a ejecutar todas las llamadas de contratos y todos los mineros nuevos deben volver a ejecutar todas las llamadas de contratos que haya ocurrido anteriormente. La arquitectura tradicional de "tienda de queso" de Ethereum es un peligro para la capacidad de expansión y limita gravemente la velocidad en la que se pueden producir los nuevos bloques.

Veremos que los contratos de Algorand externos a la cadena están estructurados de una manera similar a la de un supermercado moderno. Allí, los clientes eligen qué productos llevar sin pedírselos a un dependiente. Después de que el cliente haya elegido qué comprar, hace fila en la caja registradora para pagar. Un comprador indeciso que duda frente a diferentes tipos de quesos de cabra no demorará a los demás compradores y no limitará por sí mismo la velocidad en la que otros clientes pueden ser atendidos.

ACLARACIÓN: No se debe confundir a los contratos de Algorand externos a la cadena con las redes de pago en la segunda capa como la Lightning Network. Las redes de pago son especializadas: existen solo para enviar pagos de una parte a otra. En cambio, los contratos de Algorand externos a la cadena son programas flexibles de propósitos generales.

Contratos inteligentes de Algorand en la primera capa (en la cadena)

Los contratos inteligentes de Algorand en la primera capa ejecutan muchas transacciones simples y comunes directamente en la blockchain. Por ejemplo, los contratos inteligentes de Algorand en la primera capa hacen que las transacciones de los intercambios atómicos mencionados anteriormente sean casi insignificantes. Los contratos en la primera capa ofrecen transferencias atómicas, un mecanismo incorporado que garantiza que transacciones múltiples autorizadas por partes mutuamente sospechosas se ejecuten como una unidad atómica única: o bien todas tienen éxito, o bien ninguna lo tiene. En nuestro ejemplo, Alice crea una transferencia atómica que contiene su pago a Bob y también el pago de Bob para ella. Ella firma su pago, Bob firma el suyo, y la transferencia atómica con doble firma que contiene ambos pagos se envía a la blockchain.

Para dar otro ejemplo, supongamos que Alice quiere emitir sus propios tokens y que cada token representa, digamos, una participación en las futuras ganancias de su restaurante. Los contratos inteligentes de Ethereum ofrecen soporte incorporado para su propia moneda Ether, pero los clientes que desean crear sus propios tokens similares a monedas son abandonados a su suerte. Si bien los estándares y las convenciones han evolucionado para los tokens definidos por los usuarios en Ethereum, escribir ese tipo de código aún puede ser riesgoso, y existe una largo y vívido historial de ataques exitosos a los tokens definidos por usuarios en Ethereum.

En cambio, la arquitectura de contratos inteligentes en Algorand ofrece soporte incorporado para Activos estándares de Algorand definidos por usuarios, en el mismo nivel que la moneda nativa de Algorand, el Algo. La blockchain de Algorand ofrece protección incorporada contra la creación o el descarte involuntarios de tokens, junto con soporte directo para congelar, recuperar, acuñar y quemar fichas de manera opcional.

Como se explicó en una publicación anterior, los contratos de Algorand en la primera capa ofrecen soporte directo para transacciones de tipos comunes de "post-and-sale", préstamos asegurados, crowdfunding, solo transacciones acreditadas, monederos multifirma, y otros tipos comunes y habituales de transacciones.

Los contratos inteligentes en la primera capa están escritos en TEAL, un lenguaje máquina de pila tipo ensamblador. TEAL ofrece a los programadores el poder expresivo para implementar los tipos de transacciones comunes mencionados antes. Las próximas extensiones con memoria de estados previos, listas para el verano 2020 (hemisferio norte), permitirá que los programadores almacenen estados en la primera capa, inspeccionen saldos de cuenta y otros estados de blockchain para conseguir un poder aún más expresivo. TEAL también ofrecerá garantías mejoradas de seguridad para contratos externos a la cadena. De hecho, ofrece una base poderosa para las contratos externos a la cadena que se indican a continuación.

Contratos de Algorand externos a la cadena (segunda capa)

Si bien muchas transacciones simples en blockchain son adecuadas para la ruta rápida de la primera capa, también existen aplicaciones especializadas que requieren herramientas más específicas. Por ejemplo:

  • Un contrato puede ser demasiado grande. Por ejemplo: es posible que un contrato que administra la colocación de acciones privadas necesite consultar la base de datos de los inversores certificados a quienes se les permite participar, quizás junto con la base de datos de los inversores en la lista negra a los que no se les permite. Estas bases de datos pueden ser demasiado grandes para mantenerlas en la cadena o demasiado sensibles para hacerlas públicas.
  • Un contrato puede exigir demasiado a nivel computacional. Por ejemplo: es posible que un contrato que administra un token que proporciona una alto nivel de privacidad requiera librerías intensivamente computacionales como ZK-STARKs, ZK-SNARKs, y más. De la misma manera, es posible que un contrato complejo que maneja activos valiosos pueda hacer un uso liberal de aseveraciones que comprueben la integridad de sus estructuras de datos. Esos cálculos tan largos pueden obstruir el progreso de otros clientes, ralentizando la velocidad de bloques de todos.
  • Un contrato puede ser demasiado complejo. TEAL es una herramienta segura y poderosa para programar transacciones simples en la primera capa, pero aplicaciones más complejas requieren un lenguaje de nivel más alto. Las buenas prácticas de ingeniería de software muchas veces requieren dividir la aplicación en múltiples contratos, a veces provistos por partes diferentes. Cualquier aplicación lo suficientemente compleja para requerir una estructura modular se maneja mejor mediante un lenguaje de alto nivel.

Contratos en la cadena y contratos externos a la cadena

Recordemos que en la blockchain de Algorand, los bloques nuevos son seleccionados por un comité de consenso elegido de manera segura y aleatoria por el algoritmo de selección criptográfica de Algorand. Cuando un usuario llama a un contrato externo a la cadena, la llamada no es ejecutada directamente por el comité de consenso, sino que la llamada es ejecutada y validada por un comité paralelo llamado el comité de ejecución del contrato. Cada validador en ese comité ejecuta la llamada del contrato y genera una secuencia de efectos: la secuencia de transacciones de blockchain generadas por la llamada del contrato. El comité de ejecución del contrato genera un certificado firmado que respalda los efectos de la llamada. Después se envía al comité de consenso la lista simple de efectos, junto con el certificado firmado y otras condiciones de validación. Para una mayor eficiencia, se pueden ejecutar múltiples llamadas de contratos en un lote, por lo que todas pueden respaldarse con un único certificado. Los validadores del comité de consenso nunca ejecutan código definido por usuarios, como sí ocurre en una arquitectura de contratos en la cadena. En cambio, los validadores del comité de consenso solo necesitan comprobar el certificado y las condiciones de validación antes de aplicar los efectos de la transacción.

Una blockchain que necesita contratos en la cadena es como un banco que necesita que todas las transacciones financieras se realicen con un cheque de caja. Antes de gastar dinero, un cliente debe esperar en la fila, junto con los demás clientes, en una oficina del banco con un único cajero, para depositar el importe del cheque. Por el contrario, una blockchain que usa contratos externos a la cadena es como usar una cuenta corriente común: los clientes emiten sus propios cheques sin necesidad de hacer fila en el banco y los fondos se transfieren más tarde cuando se cobre el cheque.

Figura 1: la ejecución normal de Algorand con los contratos inteligentes en la primera capa

Figura 2: ejecución con los contratos en la cadena al estilo de Ethereum

Figura 3: ejecución con los contratos de Algorand externos a la cadena

Ejecución de los contratos externos a la cadena

La Figura 1 muestra una ejecución normal en Algorand, donde se selecciona un bloque de 5000 transacciones cada 5 segundos. (Es posible que las 5000 transacciones en un bloque incluyan los contratos inteligentes de Algorand en la primera capa sin ralentizar la producción de bloques). La Figura 2 muestra los efectos de agregar llamadas de 10 segundos a un contrato para cada bloque: claramente es imposible mantener un tiempo de bloques de 5 segundos si cada llamada a un contrato lleva otros 10 segundos adicionales. La Figura 3 muestra el beneficio de ejecutar los llamados a un contrato externo a la cadena: la llamada al contrato puede ejecutarse en paralelo con transacciones comunes, sin perjudicar el rendimiento de la blockchain.

El comité de ejecución de contratos es elegido por el algoritmo de selección seguro y aleatorio de Algorand, al igual que el comité de consenso principal. Debido a que la ejecución del contrato es determinista, a diferencia del consenso de bloque, el comité de ejecución del contrato puede conseguir el mismo nivel de seguridad con muchos menos validadores (cerca de 150 validadores en vez de miles).

El código del contrato externo a la cadena está escrito en un lenguaje de alto nivel y es ejecutado por una máquina virtual (VM). Un contrato externo a la cadena tiene su propio estado de larga duración, llamado almacenamiento de contrato. Por privacidad, el almacenamiento de contrato en sí mismo no aparece en la blockchain. Por seguridad, sin embargo, cada llamada al contrato publica una confirmación para el último almacenamiento de contrato. Los contratos externos a la cadena pueden leer los saldos de las cuentas y otra información en la cadena, y pueden emitir transacciones, tales como pagos, que modifican el estado de la blockchain. A diferencia de los contratos convencionales al estilo de Ethereum, estas "transacciones de efectos" no se ejecutan directamente. En cambio, los efectos de la llamada son validados por un quórum de validadores del comité de ejecución del contrato. Las transacciones de efectos de la llamada están empaquetadas en un lote de transacciones de "todo o nada" en la primera capa, garantizadas para que tengan éxito o fracasen todas juntas. El comité de ejecución de contratos también hace un seguimiento de las dependencias de cada llamada. Por ejemplo, una llamada a un contrato para transferir 100 tokens de Alice a Bob depende de que Alice tenga un saldo de tokens de al menos 100. El comité genera una lista de dependencias que debe ser comprobada por el comité de consenso antes de ejecutar los efectos. (Estas comprobaciones son comparaciones rápidas, sencillas y escalares.) Cada transacción atómica, junto con su certificado y sus dependencias, se envía, como cualquier otra secuencia de transacciones, al comité de consenso, que comprueba el certificado y las dependencias de la transacción atómica, e incluye esa transacción atómica en un bloque futuro.

¿Qué podría salir mal? Bueno, las llamadas a contratos externos a la cadena son "especulativas" en el sentido de que el estado en la cadena, digamos, el saldo de una cuenta, podría cambiar en el intervalo entre el momento en que se valida una llamada al contrato y cuando los efectos de esa llamada llegan a la blockchain. Aún en ese caso, la corrección está garantizada. La implementación del contrato externo a la cadena mantiene un seguimiento de las dependencias de la llamada al contrato, lo que asegura que los efectos de una llamada cuyas dependencias han sido violadas nunca serán incluidos en la blockchain.

¿Y qué hay del progreso? ¿Qué ocurre si una llamada a un contrato aprueba repetidamente la validación del comité de ejecución del contrato pero nunca llega a la cadena porque sus dependencias en la cadena son violadas repetidamente? Volviendo a la analogía de los cheques, los cheques normales son más rápidos y más cómodos que los cheques de caja, pero un cheque podría ser rechazado aunque hubiera suficiente dinero en la cuenta en el momento en el que fue firmado. Sin embargo, aunque los cheques a veces rebotan, se usan más que los cheques de caja porque la mayoría de los que usan cheques no sobregiran sus cuentas. De la misma manera, los contratos externos a la cadena a veces pueden fracasar, pero esperamos que tengan éxito la mayoría de las veces, porque sus dependencias están en su mayoría bajo el control del usuario, y los usuarios se abstendrán de violar sus propias dependencias.

¡Hurra!

Estamos entusiasmados con los contratos de Algorand externos a la cadena porque los usuarios pueden crear contratos que sean grandes, exijan mucho a nivel computacional, sean idiosincráticos o complejos sin obstruir la blockchain para todos los demás. A diferencia de la mayoría de las blockchains, donde la arquitectura de los contratos inteligentes está estrechamente entrelazada con la arquitectura de blockchain, la arquitectura de los contratos inteligentes de Algorand aísla la ejecución de contratos externos a la cadena del comité de consenso de la blockchain. La arquitectura de los contratos inteligentes de Algorand es flexible y es posible que en el futuro permita múltiples comités de ejecución de contratos, cada uno con una garantía de nivel de servicio diferente, y cada uno con su propio lenguaje de contrato y máquina virtual. Un comité de ejecución de contratos que valide los tokens de alta privacidad con una alta exigencia a nivel computacional tal vez debería ser distinto del que valida las aplicaciones financieras altamente reguladas y con gran cantidad de datos. Cualquiera que sean sus necesidades de contratos inteligentes especializados, la arquitectura de contratos inteligentes de Algorand puede soportar un lenguaje y una VM equivalentes.

El esfuerzo de encontrar un lenguaje y una VM viables será importante para la adopción masiva de nuestros contratos externos a la cadena, pero se trata de un esfuerzo aparte. Y planeamos colaborar con otros en eso. ¡Mantente conectado!

Autores

Jing Chen, jefa de investigación de teoría y científica jefa

Jing es profesora asistente en el Departamento de Ciencias de la Computación de la Universidad de Stony Brook. También es profesora adjunta en el Departamento de Economía y miembro afiliada del Centro de Teoría de Juegos de Stony Brook. Sus principales intereses de investigación son los registros distribuidos, la teoría de juegos y los algoritmos. Jing tiene una licenciatura y un máster en Informática en la Universidad de Tsinghua, y un Ph. D. en Informática en el MIT. Hizo un doctorado de un año en el Instituto de Estudios Avanzados de Princeton. Jing recibió el Premio NSF CAREER en 2016.

Maurice Herlihy, socio de investigación, Algorand

El profesor Herlihy es un experto mundial en computación distribuida. Ha recibido el Premio Dijkstra en Computación Distribuida en 2003, el Premio Gödel en computación teórica en 2004, el premio ISCA 2008 al artículo académico más influyente, el Premio Edsger W. Dijkstra en 2012 y el Premio Wallace McDowell en 2013. Es miembro de la Asociación de Maquinaria Computacional (ACM), de la Academia Nacional de Inventores, de la Academia Nacional de Ingeniería y de la Academia Nacional de Artes y Ciencias.

El profesor Herlihy tiene un Ph. D. en Informática del MIT.

Victor Luchangco, investigador sénior de algoritmos, Algorand

Victor Luchangco es un investigador sénior de algoritmos en Algorand, donde trabaja en protocolos y lenguajes para blockchains.  Antes de eso, trabajó en los Oracle Labs y Sun Labs, donde se dedicó a los algoritmos concurrentes y estructuras de datos para multiprocesadores de memoria compartida y el lenguaje de programación Fortress.  Tiene un doctorado en Ciencias de la Computación del Instituto Tecnológico de Massachusetts y su disertación fue sobre modelos para memorias poco congruentes.  Es autor de más de 50 artículos académicos y tiene más de 40 patentes registradas.

Silvio Micali, fundador, Algorand

Silvio Micali ha sido parte del cuerpo docente del MIT, en el Departamento de Ingeniería Eléctrica y Ciencias de la Computación, desde 1983. "A Silvio le interesa la investigación de la criptografía, del conocimiento cero, de la generación pseudoaleatoria, de los protocolos seguros y del diseño de mecanismos y blockchain. En particular, Silvio es el coinventor del cifrado probabilístico, de las pruebas de conocimiento cero, de las funciones aleatorias verificables y de muchos de los protocolos que son la base de la criptografía moderna.

En 2017, Silvio fundó Algorand, una blockchain totalmente descentralizada, segura y expansible que proporciona una plataforma común para crear productos y servicios para una economía sin fronteras. En Algorand, Silvio supervisa todas las investigaciones, incluidas la teoría, la seguridad y las finanzas criptográficas.

Silvio recibió el Premio Turing (en ciencia de la computación), el Premio Gödel (en ciencia de la computación teórica) y el premio RSA (en criptografía). Es miembro de la Academia Nacional de Ciencias, de la Academia Nacional de Ingeniería, de la Academia Americana de Artes y Ciencias, y de la Accademia dei Lincei.

Silvio recibió su título en Matemáticas en la Universidad de Roma y su doctorado en Ciencias de la Computación en la Universidad de California en Berkeley.

Liuba Shrira, socia de investigación, Algorand

Liuba Shrira es profesora del Departamento de Ciencias de la Computación de la Universidad de Brandeis, asociada de investigación del Laboratorio de Ciencias de la Computación e Inteligencia Artificial del MIT. Obtuvo su doctorado en Technion (Israel) en 1986.  De 1986 a 1997 fue investigadora científica en el Grupo de Metodología de Programación del MIT.  Se incorporó a Brandeis en 1997. Entre 2004 y 2005 fue investigadora invitada en Microsoft Research, Cambridge, Reino Unido, entre 2010 y 2011 fue investigadora invitada en Microsoft Research Asia y profesora invitada en el Departamento de Ciencias de la Computación de Technion.  Actualmente es socia de investigación invitada en Algorand.
Los intereses de investigación de Liuba Shrira abarcan aspectos de diseño e implementación de sistemas distribuidos y especialmente sistemas de almacenamiento. Esto incluye problemas de tolerancia a fallas, disponibilidad y rendimiento. Recientemente se ha centrado en el viaje en el tiempo (en lo que respecta al almacenamiento), la tolerancia a fallas bizantinas, las transacciones rápidas y la computación de blockchain.
Liuba Shrira ha sido reconocida como Científica Distinguida por la ACM por "logros importantes en el campo de la computación y su impacto en él".
En su tiempo libre, Liuba Shrira baila tango, cuida su jardín, lee y cocina.