TON Virtual Machine (TVM, a veces TON VM) — máquina virtual que ejecuta contratos inteligentes en la blockchain TON. Es la capa ejecutora de la red: cada smart contract se almacena y funciona como un programa para TVM. La máquina procesa mensajes entrantes, modifica el estado permanente del contrato y genera mensajes salientes para otros contratos.
La arquitectura de TVM está sujeta a tres requisitos: total determinismo de ejecución (la misma entrada produce el mismo resultado en cualquier nodo), alta densidad de código (mínimo espacio en la blockchain) y compatibilidad retroactiva al ampliar el conjunto de instrucciones.
Historia#
TVM fue desarrollada por el equipo de Telegram en 2018 junto con la primera versión del protocolo TON. El desarrollo avanzó por etapas:
- 2018 — primera versión de TVM, lanzada con la testnet de TON. Enfoque principal — funcionalidad de contratos inteligentes e integración con el protocolo.
- Marzo 2020 — publicación de la documentación técnica detallada con descripción de tipos de datos, optimizaciones y conjunto de instrucciones.
- 2020 (lanzamiento mainnet) — TVM soporta un conjunto completo de operaciones y garantiza ejecución determinista en la red de producción.
Tras la transferencia del proyecto a la comunidad, el desarrollo de TVM continúa a través del proceso TEP — las actualizaciones se introducen mediante propuestas de mejora y se activan mediante el consenso de los validadores.
Fundamentos#
TVM utiliza cadenas de bits como representación fundamental de datos. Se presentan en dos notaciones:
- Representación hexadecimal — cadenas cuya longitud es múltiplo de cuatro bits, divididas en grupos de 4 bits, cada uno representado por un dígito hexadecimal (0–F). Si la longitud no es múltiplo de cuatro, se añade una etiqueta especial de terminación para marcar la modificación.
- Serialización en octetos — la cadena se divide en grupos de 8 bits y se escribe como una secuencia de bytes; si es necesario, se agrega alineación hasta 8.
Modelo de pila#
TVM es una máquina virtual basada en pila. Esto significa que los datos se almacenan en una estructura de “pila” (last-in-first-out), no en variables nombradas o registros. La mayoría de las operaciones (aritmética, comparaciones, paso de parámetros) extraen argumentos de la pila y colocan el resultado allí mismo. El modelo de pila es más simple que el enfoque basado en registros y permite una codificación de instrucciones más densa — importante para reducir el almacenamiento on-chain.
Tipos de valores
La pila de TVM trabaja con un conjunto fijo de tipos primitivos:
- Integer — entero con signo de 257 bits (la elección del ancho permite albergar hashes de 256 bits más el signo sin pérdidas).
- Cell — objeto que contiene hasta 1023 bits de datos y hasta 4 referencias a otras cells. Base de la memoria de TVM.
- Tuple — colección ordenada de valores de diferentes tipos.
- Slice — “rebanada” de una cell: puntero a la parte restante de datos y referencias durante la lectura.
- Builder — búfer para la construcción secuencial de una nueva Cell.
- Continuation — representación de un punto de continuación de ejecución; ver más abajo.
- Null — ausencia de valor; marcador para campos no inicializados.
Categorías de instrucciones
Las instrucciones de TVM se agrupan por propósito:
- pilas y tuplas — permutaciones de la pila, operaciones con tuple;
- constantes — inserción de valores predefinidos en la pila;
- aritméticas — operaciones aritméticas estándar con verificación automática de overflow;
- operaciones con cells — lectura de Slice, escritura de Builder, acceso a referencias;
- control de flujo — bifurcaciones condicionales, bucles, llamadas a continuaciones;
- primitivas de aplicación — operaciones especializadas de TON: manejo de direcciones, firmas, actuadores de mensajes.
Cells y sus tipos#
Cell — unidad atómica de almacenamiento en TVM y en la propia blockchain TON. Cada Cell contiene hasta 1023 bits de datos y hasta 4 referencias a otras Cell. El grafo de cells, formado mediante referencias, es un grafo dirigido acíclico (DAG): los ciclos no están permitidos. Cualquier dato de la blockchain (contratos inteligentes, estados, mensajes, bloques) se almacena como tal grafo.
Tipos de cells
- Comunes (tipo‑1) — portador estándar de datos y referencias.
- Exóticas (exotic cells) — tipos 2–255 con particularidades de deserialización y hashing. Se usan para ramas truncadas (truncated branches), referencias a bibliotecas y pruebas Merkle.
Las cells exóticas permiten, por ejemplo, transmitir un snapshot parcial de la blockchain con pruebas criptográficas — base de los clientes ligeros de TON.
Continuations#
Continuation es la construcción central de TVM para el control de flujo. En esencia es un “cálculo diferido”: marcador que contiene código a ejecutar, la pila actual y el estado guardado de los registros de control. Una Continuation puede colocarse en la pila, pasarse como parámetro, activarse — y continuar la ejecución desde el punto registrado.
Sobre continuations se construyen llamadas a subprogramas, operaciones condicionales, bucles y manejo de excepciones. El análogo en lenguajes más familiares son las first‑class functions; en TVM la continuation es más poderosa y también cubre continuaciones parciales del programa.
Tipos de continuations
- Comunes — contienen código, pila, lista de registros guardados y una code page (ver más abajo).
- Simples — solo código y code page, sin datos de pila guardados.
- Current (cc, current continuation) — refleja el código que se está ejecutando en ese momento; parte clave del estado de la máquina.
El cambio entre continuations se realiza con las instrucciones JMP (salto) y RET (retorno). Las excepciones son continuations especiales activadas al producirse un error: reciben parámetros de error y determinan el comportamiento posterior. Las construcciones condicionales e iterativas (IF, WHILE, REPEAT) se implementan sobre continuations.
Code pages#
Cada continuation común lleva un campo de 16 bits llamado code page (cp), que define cómo decodificar sus instrucciones. Este es un mecanismo de compatibilidad retroactiva: simultáneamente en la red pueden coexistir contratos compilados para diferentes versiones del conjunto de instrucciones de TVM.
Las instrucciones se codifican con un código de prefijo binario — lo que permite una decodificación inequívoca y una representación compacta. Si el prefijo no corresponde a una instrucción válida de la code page actual, se genera una excepción de opcode inválido.
Entre code pages es posible el cambio automático según la operación ejecutada — lo que permite especializar páginas para operaciones frecuentes (manipulación de pila, procesamiento de datos) y reducir el tamaño del código.
TVM vs Ethereum Virtual Machine#
TVM y EVM son ambas máquinas virtuales basadas en pila para contratos inteligentes, pero presentan diferencias clave.
| Propiedad | TVM | EVM |
|---|---|---|
| Modelo de datos base | Grafo de cells (Cell, hasta 1023 bits + 4 referencias) | Palabras de 256 bits + Merkle Patricia Trie |
| Tamaño de Integer | 257 bits | 256 bits |
| Verificación de overflow | Automática | Manual (Solidity ≥0.8) |
| Criptografía | Curve25519, Weil pairings (zk‑SNARKs), sha256 | secp256k1, keccak256 |
| Lenguaje principal de contratos | FunC (tipado estático, ADT) | Solidity |
| Almacenamiento de estado | Distribuido en cells de contratos | MPT con estado global |
El grafo de cells simplifica el trabajo con estructuras complejas (árboles, DAG), requiere menos memoria y recursos computacionales que MPT. La verificación automática de overflow reduce la clase de vulnerabilidades típicas. El soporte de Curve25519 y Weil pairings brinda capacidades criptográficas no disponibles en EVM “de fábrica”.
Ver tambiénVer también#
- The Open Network
- FunC
- Smart contracts
- Toncoin