Turing completo es un término en informática que describe la capacidad de un sistema para realizar cualquier cálculo o programa posible, y se puede utilizar para describir lenguajes de programación modernos (Python, C++, etc.).
Turing completo es un término en informática que describe la capacidad de un sistema para realizar cualquier cálculo o programa posible, y se puede utilizar para describir lenguajes de programación modernos (Python, C++, etc.).
Turing completo describe un sistema programable que puede resolver cualquier problema computacional. El concepto proviene de la máquina de Turing, un modelo teórico de computación ideado por el matemático y criptógrafo inglés Alan Turing. Por el contrario, un sistema que no es Turing completo está limitado a realizar tareas particulares basadas en instrucciones predefinidas.
Una analogía común es que una calculadora de bolsillo no es Turing completa porque solo está programada para realizar un conjunto limitado de cálculos matemáticos. Sin embargo, con un ordenador personal, es posible escribir un programa que realizará la misma tarea de forma autónoma.
Bitcoin y Ethereum proporcionan el contraste más conocido de Turing completo. Bitcoin, y su lenguaje de programación Script, fue diseñado como un sistema no Turing completo con funcionalidad limitada. El software de Bitcoin fue programado únicamente para procesar transacciones de bitcoin y no puede admitir lógica de contratos inteligentes compleja y de varios pasos.
Sin embargo, Ethereum permite a los desarrolladores escribir código utilizando el lenguaje de programación Solidity, que es Turing completo, y ejecutarlo usando la Máquina Virtual de Ethereum, que también es Turing completa. Teóricamente, es posible escribir cualquier programa para cualquier caso de uso y ejecutarlo en Ethereum.
Como tal, Turing completo tiene implicaciones importantes para lo que se puede lograr utilizando la tecnología blockchain.
Historia de los sistemas Turing completos
Antes de la era de la informática moderna, los investigadores estaban interesados en las posibilidades teóricas de lo que las computadoras podían lograr. En 1936, Alan Turing publicó un artículo en el que describía una máquina hipotética capaz de leer un conjunto simple de instrucciones arbitrarias basadas en código. La máquina tendría una cinta de longitud infinita dividida en casillas, donde cada casilla puede ser leída por turno por la máquina.
En cada casilla hay una instrucción codificada que la máquina puede interpretar. Por simplicidad, la instrucción puede ser un uno o un cero. Cada vez que la máquina lee una instrucción de una casilla, ejecuta la orden sobrescribiendo la instrucción con un nuevo símbolo, ya sea uno o cero, en la misma casilla. La máquina luego actualiza su estado para reflejar el cambio, por lo que cada estado captura un punto particular en la ejecución del código.
Representación visual de la máquina de Turing. Rocky Acosta, CC BY 3.0 , vía Wikimedia Commons
El modelo de la máquina de Turing fue efectivamente un plano para computadoras programables antes de que se inventara la informática moderna. En la época de Turing, los científicos necesitaban construir una nueva máquina cada vez que necesitaban resolver una tarea diferente. Hoy en día, aunque las máquinas y sistemas Turing completos son comunes, los científicos informáticos todavía usan el término para describir el alcance máximo de lo que se puede lograr con sistemas, programas y lenguajes informáticos.
Es importante tener en cuenta que, como modelo conceptual, el modelo de la máquina de Turing no tiene en cuenta el tiempo, la potencia de procesamiento o cualquier otro factor excepto la capacidad teórica de la máquina para procesar cualquier conjunto de instrucciones programadas.
Ethereum – la primera blockchain Turing completa
Ethereum fue la primera blockchain Turing completa que podía utilizarse para programar contratos inteligentes y aplicaciones descentralizadas (dapps).
Ethereum fue diseñado para ser Turing completo de dos maneras.
Los contratos inteligentes de Ethereum están escritos utilizando el lenguaje de programación Solidity, un lenguaje de propósito general Turing completo desarrollado específicamente para Ethereum.
La Máquina Virtual de Ethereum (EVM), que ejecuta los contratos inteligentes según el programa, es una máquina Turing completa.
La EVM puede procesar cualquier configuración de contratos inteligentes, incluso si su función o utilidad aún no se ha concebido. Por lo tanto, el lanzamiento de Ethereum como la primera blockchain Turing completa marcó un punto de inflexión significativo en el aumento de las capacidades de la tecnología blockchain. En lugar de estar limitada a una serie finita de casos de uso, Ethereum permite una gama potencialmente ilimitada de usos.
Limitaciones prácticas de la completitud de Turing de Ethereum
Se puede decir que Ethereum es Turing completo solo en el nivel más teórico debido a la mecánica práctica de la blockchain. Cada transacción en Ethereum cuesta gas para ejecutarse, y por lo tanto, si un contrato inteligente entrara en un bucle infinito – lo cual es teóricamente posible en una máquina de Turing – eventualmente se quedaría sin gas.
Este límite a la completitud de Turing de Ethereum está diseñado intencionalmente, ya que tener múltiples contratos inteligentes ejecutándose en bucles infinitos no es deseable para una red blockchain pública con capacidad de procesamiento finita. Por esta razón, cada transacción en Ethereum requiere un límite de gas que especifica la cantidad máxima de poder de cómputo que se puede asignar a la transacción. Si la transacción no se completa una vez alcanzado el límite, se rechaza.
Sin embargo, es importante tener en cuenta que muy pocos contratos inteligentes de Ethereum utilizan bucles recursivos y otras capacidades que requieren completitud de Turing.
Desventajas de la completitud de Turing en blockchain
La naturaleza infinitamente programable de los sistemas Turing completos es su mayor fortaleza, y sin embargo también puede ser una debilidad significativa, particularmente en blockchains públicas donde el código es visible para todos. Esto significa que el código puede ser vulnerable a interrupciones (como errores en los contratos inteligentes), o usos no intencionados, que impiden el funcionamiento previsto del protocolo. Poder programar cualquier tipo de cálculo permite una gran posibilidad de resultados, y no es posible anticiparlos todos.
Si ocurre un problema imprevisto en un sistema centralizado, la empresa propietaria del código puede emitir un parche inmediatamente. Sin embargo, en un sistema basado en blockchain, puede causar una interrupción considerable si alguien logra encontrar una manera de desencadenar un resultado que no fue anticipado por el desarrollador. Debido a la naturaleza descentralizada de la blockchain, las actualizaciones del software pueden llevar más tiempo porque cada cambio debe ser votado por la comunidad.
Uno de los ejemplos más famosos de esto es The DAO, un contrato inteligente establecido en Ethereum en 2016 como una especie de fondo de capital de riesgo descentralizado. En un movimiento que comúnmente se conoce como un hackeo, un actor malicioso logró drenar más de $150 millones de fondos de inversores de un contrato inteligente de Ethereum, lo que resultó en una decisión controvertida de revertir la blockchain de Ethereum para recuperar los fondos del atacante. Este incidente resultó en la bifurcación de Ethereum Classic.
A pesar del nombre, este incidente no fue un hackeo en el verdadero sentido de la palabra. El atacante explotó una vulnerabilidad entonces poco conocida en la forma en que se escribió el código subyacente para ejecutar un movimiento ahora conocido como un ataque de reentrada, llamando a un contrato no confiable para drenar fondos.
Desde el incidente de The DAO, los desarrolladores han actualizado las mejores prácticas de programación para corregir esta vulnerabilidad. Sin embargo, con un sistema Turing completo donde los innovadores están constantemente escribiendo nuevo código, pueden seguir apareciendo nuevas vulnerabilidades.
Aspectos esenciales de Turing completo
La completitud de Turing describe la capacidad de un sistema para calcular matemáticamente cualquier cálculo o programa posible. Se deriva de la hipotética máquina de Turing, desarrollada por el matemático inglés Alan Turing en la década de 1930.
Ethereum fue la primera blockchain Turing completa en lanzarse, lo que marcó el momento en que la capacidad potencialmente ilimitada de contratos inteligentes se hizo disponible para todos.
Aunque los sistemas Turing completos abren vastas posibilidades, los programas también pueden resultar en resultados imprevistos que pueden ser explotados por actores maliciosos.