TON Virtual Machine (TVM, às vezes TON VM) — máquina virtual que executa contratos inteligentes na blockchain TON. É a camada de execução da rede: cada smart-contract é armazenado e funciona como um programa para a TVM. A máquina processa mensagens de entrada, altera o estado permanente do contrato e gera mensagens de saída para outros contratos.
A arquitetura da TVM está subordinada a três requisitos: total determinismo de execução (a mesma entrada produz o mesmo resultado em qualquer nó), alta densidade de código (mínimo de espaço na blockchain) e compatibilidade retroativa ao expandir o conjunto de instruções.
História#
A TVM foi desenvolvida pela equipe do Telegram em 2018 junto com a primeira versão do protocolo TON. O desenvolvimento ocorreu em etapas:
- 2018 — primeira versão da TVM, lançada com a rede de teste TON. Foco principal — funcionalidade de contratos inteligentes e integração com o protocolo.
- Março de 2020 — publicação de documentação técnica detalhada descrevendo tipos de dados, otimizações e conjunto de instruções.
- 2020 (lançamento da mainnet) — a TVM suporta um conjunto completo de operações e garante execução determinística na rede de produção.
Após a transferência do projeto para a comunidade, o desenvolvimento da TVM continua através do processo TEP — atualizações são introduzidas por propostas de melhoria e ativadas pelo consenso dos validadores.
Conceitos básicos#
A TVM usa cadeias de bits como representação fundamental de dados. Elas são apresentadas em duas notações:
- Representação hexadecimal — cadeias com comprimento múltiplo de quatro bits, divididas em grupos de 4 bits, cada um representado por um dígito hexadecimal (0–F). Se o comprimento não for múltiplo de quatro, um marcador especial de término é adicionado para indicar a modificação.
- Serialização em octetos — a cadeia é dividida em grupos de 8 bits e escrita como sequência de bytes; se necessário, há alinhamento até 8.
Modelo de pilha#
A TVM é uma máquina virtual baseada em pilha. Isso significa que os dados são armazenados em uma estrutura de “pilha” (last-in-first-out), e não em variáveis nomeadas ou registradores. A maioria das operações (aritmética, comparações, passagem de parâmetros) retira argumentos da pilha e coloca o resultado de volta nela. O modelo de pilha simplifica o design em relação ao modelo baseado em registradores e permite codificação de instruções mais densa — essencial para reduzir o armazenamento on-chain.
Tipos de valores
A pilha da TVM trabalha com um conjunto fixo de tipos primitivos:
- Integer — inteiro assinado de 257 bits (a escolha da largura permite acomodar hashes de 256 bits mais o sinal sem perdas).
- Cell — objeto que contém até 1023 bits de dados e até 4 referências a outras cells. Base da memória da TVM.
- Tuple — coleção ordenada de valores de tipos diferentes.
- Slice — “fatia” de uma cell: ponteiro para a parte restante dos dados e referências durante a leitura.
- Builder — buffer para construção sequencial de uma nova Cell.
- Continuation — representação de um ponto de continuação da execução; veja abaixo.
- Null — ausência de valor; marcador para campos não inicializados.
Categorias de instruções
As instruções da TVM são agrupadas por finalidade:
- pilha e tupla — permutações da pilha, operações com tuple;
- constantes — inserção de valores predefinidos na pilha;
- aritméticas — operações aritméticas padrão com verificação automática de overflow;
- operações com cells — leitura de Slice, escrita de Builder, navegação por referências;
- controle de fluxo — ramificações condicionais, loops, chamadas de continuations;
- primitivas de aplicação — operações especializadas do TON: manipulação de endereços, assinaturas, atuadores de mensagens.
Cells e seus tipos#
Cell — unidade atômica de armazenamento na TVM e na própria blockchain TON. Cada Cell contém até 1023 bits de dados e até 4 referências a outras Cells. O grafo de cells formado pelas referências é um grafo direcionado acíclico (DAG): ciclos são proibidos. Qualquer dado da blockchain (contratos inteligentes, estados, mensagens, blocos) é armazenado como esse grafo.
Tipos de cells
- Comuns (tipo‑1) — transportador padrão de dados e referências.
- Exóticas (exotic cells) — tipos 2–255 com particularidades de desserialização e hashing. São usadas para ramos truncados (truncated branches), referências a bibliotecas e provas Merkle.
Cells exóticas permitem, por exemplo, transmitir um snapshot parcial da blockchain com provas criptográficas — base dos clientes leves do TON.
Continuations#
Continuation — construção central da TVM para controle de fluxo. Essencialmente é um “cálculo diferido”: um marcador que contém código a ser executado, a pilha atual e o estado salvo dos registradores de controle. Uma continuation pode ser colocada na pilha, passada como parâmetro, ativada — e a execução continua a partir do ponto registrado.
Sobre continuations são construídas chamadas de sub‑rotinas, operações condicionais, loops e tratamento de exceções. O análogo em linguagens mais familiares são funções de primeira classe; na TVM a continuation é ainda mais poderosa, abrangendo também continuação parcial do programa.
Tipos de continuations
- Normais — contêm código, pilha, lista de registradores salvos e code page (veja abaixo).
- Simples — apenas código e code page, sem dados de pilha salvos.
- Current (cc, current continuation) — reflete o código que está sendo executado no momento; parte chave do estado da máquina.
A troca entre continuations ocorre por instruções JMP (salto) e RET (retorno). Exceções são continuations especiais ativadas em caso de erro: recebem parâmetros de erro e definem o comportamento subsequente. Construções condicionais e iterativas (IF, WHILE, REPEAT) são implementadas sobre continuations.
Code pages#
Cada continuation normal carrega um campo de 16 bits chamado code page (cp), que determina como decodificar suas instruções. Esse mecanismo garante compatibilidade retroativa: diferentes contratos compilados para versões distintas do conjunto de instruções da TVM podem coexistir na rede.
Instruções são codificadas com um código de prefixo binário — isso permite decodificação unívoca e representação densa. Se o prefixo não corresponder a uma instrução válida na code page atual, uma exceção de opcode inválido é gerada.
Entre code pages pode ocorrer troca automática dependendo da operação executada — isso permite especializar pages para operações frequentes (manipulação de pilha, processamento de dados) e reduzir o volume de código.
TVM vs Ethereum Virtual Machine#
TVM e EVM — ambas são máquinas virtuais baseadas em pilha para contratos inteligentes, mas apresentam diferenças fundamentais.
| Propriedade | TVM | EVM |
|---|---|---|
| Modelo de dados base | Grafo de cells (Cell, até 1023 bits + 4 referências) | Palavras de 256 bits + Merkle Patricia Trie |
| Dimensão do Integer | 257 bits | 256 bits |
| Verificação de overflow | Automática | Manual (Solidity ≥0.8) |
| Criptografia | Curve25519, Weil pairings (zk‑SNARKs), sha256 | secp256k1, keccak256 |
| Linguagem principal de contratos | FunC (tipagem estática, ADT) | Solidity |
| Armazenamento de estado | Distribuído em cells de contratos | MPT com estado global |
O grafo de cells simplifica o trabalho com estruturas complexas (árvores, DAG), requer menos memória e recursos computacionais que o MPT. A verificação automática de overflow reduz a classe de vulnerabilidades típicas. O suporte a Curve25519 e Weil pairings oferece recursos criptográficos indisponíveis no EVM “de fábrica”.
Ver também#
- The Open Network
- FunC
- Smart-contracts
- Toncoin