
Este texto é a continuação de uma série de artigos nos quais analiso a estrutura (presumivelmente) da rede descentralizada Telegram Open Network (TON), que deve ser lançada este ano. Descrevi seu nível mais básico — a forma como os nós interagem entre si.
Apenas para lembrar, não tenho qualquer relação com o desenvolvimento dessa rede e todo o material foi retirado de uma fonte pública (embora não verificada) — (ainda existe um , que resume os principais pontos), que apareceu no final do ano passado. A quantidade de informações neste documento, na minha opinião, atesta sua autenticidade, embora não haja confirmações oficiais para isso.
Hoje, vamos analisar o componente principal da TON — o blockchain.
Conceitos Básicos
Conta (account). Um conjunto de dados, identificado por um número de 256 bits account_id (geralmente, é a chave pública do proprietário da conta). No caso básico (veja abaixo blockchain zero), esses dados referem-se ao saldo do usuário. "Pegar empréstimo" de um específico account_id pode qualquer um, mas seu valor só pode ser alterado de acordo com regras específicas.
Contrato inteligente (smart-contract). Essencialmente, é um caso particular de conta, complementado pelo código do contrato inteligente e pelo armazenamento de suas variáveis. Se, no caso de uma "carteira", é possível depositar e retirar dinheiro dela por regras relativamente simples e predefinidas, no caso do contrato inteligente essas regras estão escritas na forma de seu código (em uma linguagem de programação que é Turing-completa).
Estado do blockchain (state of blockchain). Conjunto de estados de todas as contas/contratos inteligentes (em um sentido abstrato — uma tabela hash, onde as chaves são identificadores de contas e os valores são os dados armazenados nas contas).
Mensagem (message). Acima, usei a expressão "depositar e retirar dinheiro" — este é um exemplo específico de mensagem ("transferir N gramas da conta account_1 para a conta account_2"). Obviamente, apenas um nó que possui a chave privada da conta pode enviar tal mensagem. account_1 — e capaz de confirmar isso com uma assinatura. O resultado da entrega de tais mensagens a uma conta comum é o aumento de seu saldo, enquanto ao contrato inteligente — a execução de seu código (que processará a recepção da mensagem). É claro que outras mensagens também podem ser enviadas (não transferindo quantias monetárias, mas dados arbitrários entre contratos inteligentes).
A transação (transação). O fato da entrega da mensagem é chamado de transação. Transações alteram o estado da blockchain. É exatamente a partir das transações (registros de entrega de mensagens) que os blocos na blockchain são formados. Nesse aspecto, pode-se imaginar o estado da blockchain como um banco de dados incremental — todos os blocos são 'deltas' que precisam ser aplicados sequencialmente para obter o estado atual do BD. Sobre a especificidade da embalagem desses 'deltas' (e a restauração do estado completo a partir deles) falaremos no próximo artigo.
Blockchain no TON: o que é e para que serve?
Como mencionado no artigo anterior, a blockchain é uma estrutura de dados, cujos elementos (blocos) estão organizados em uma 'cadeia', e cada bloco subsequente da cadeia contém o hash do bloco anterior. Nos comentários, foi feita a pergunta: para que uma tal estrutura de dados é necessária, quando já temos o DHT - tabela hash distribuída? É evidente que alguns dados podem ser armazenados no DHT, mas isso só é adequado para informações que não são muito 'sensíveis'. Não se pode armazenar saldos de criptomoedas no DHT — principalmente devido à falta de verificações sobre integridade. De fato, toda a complexidade da estrutura da blockchain cresce para prevenir interferências nos dados armazenados nela.
No entanto, a blockchain no TON parece ainda mais complexa do que na maioria dos outros sistemas distribuídos — e isso se deve a duas razões. A primeira é a busca por minimizar a necessidade de forks. Nas criptomoedas tradicionais, todos os parâmetros são definidos na fase inicial, e qualquer tentativa de alterá-los resulta, na verdade, na criação de um 'universo alternativo de criptomoeda'. A segunda razão é o suporte à fragmentação (sharding, shardização) do blockchain. O blockchain é uma estrutura que não pode diminuir com o tempo; e normalmente, cada nó responsável pela operação da rede é obrigado a armazená-lo totalmente. Em sistemas tradicionais (centralizados), para resolver problemas semelhantes, utiliza-se o sharding: parte dos registros no banco de dados fica em um servidor, parte em outro, e assim por diante. No caso das criptomoedas, tal funcionalidade ainda é bastante rara — em particular, devido à dificuldade de adicionar sharding a um sistema onde não foi planejado desde o início.
Como o TON planeja resolver ambos os problemas descritos acima?
Conteúdo do blockchain. Workchains.

Primeiramente, vamos falar sobre o que está planejado para ser armazenado no blockchain. Estarão lá os estados das contas (‘carteiras’ no caso básico) e contratos inteligentes (para simplificar, consideraremos que isso é o mesmo que contas). Em essência, será uma tabela hash comum — suas chaves serão os identificadores account_id, e os valores serão estruturas de dados que contêm coisas como:
- saldo;
- código do contrato inteligente (apenas para contratos inteligentes);
- armazenamento de dados do contrato inteligente (apenas para contratos inteligentes);
- estatísticas;
- (opcionalmente) chave pública para transferências da conta, por padrão account_id;
- fila de mensagens de saída (aqui elas são armazenadas para envio ao destinatário);
- lista das últimas mensagens entregues a esta conta.
Como mencionado acima, os blocos consistem diretamente de transações — mensagens enviadas para várias contas account_id. No entanto, além do account_id, as mensagens também contêm um campo de 32 bits workchain_id — identificador do chamado workchain (workchain, blockchain de trabalho). Isso permite ter vários blockchains independentes uns dos outros com diferentes configurações. Nesse caso, workchain_id = 0 é considerado um caso especial, workchain nulo — é neste que os saldos corresponderão à criptomoeda TON (Grams). A probabilidade é que, nos primeiros tempos, não haverá outros workchains.
Shardchains. Infinite Sharding Paradigm.
Mas o crescimento no número de blockchains não para por aí. Vamos entender o shard. Vamos imaginar que cada conta (account_id) tenha seu próprio blockchain — onde estão todas as mensagens recebidas — e o estado de todos esses blockchains é armazenado em nós separados.
Claro, isso é bastante dispendioso: provavelmente, em cada um desses shardchains (shardchain, shard blockchain) as transações serão recebidas com pouca frequência, e será necessário ter muitos nós potentes (adiantando um pouco, vale ressaltar que não se trata apenas de clientes em telefones móveis — mas de servidores robustos).
Portanto, os shardchains agrupam contas por prefixos binários de seus identificadores: se um shardchain tem o prefixo 0110, então ele incluirá transações de todos os account_id que começam com esses dígitos. Este shard_prefix pode ter um comprimento de 0 a 60 bits — e o principal é que ele pode mudar dinamicamente.

Assim que um dos shardchains começar a receber uma quantidade excessiva de transações, os nós trabalhando nele, de acordo com regras previamente definidas, 'dividem' ele em dois filiais — seus prefixos serão um bit mais longos (e para um deles esse bit será 0, e para o outro será 1). Por exemplo, shard_prefix = 0110b se dividirá em 01100b e 01101b. Por sua vez, se dois shardchains 'vizinhos' começarem a se sentir confortáveis o suficiente (durante um certo período), eles se fundirão novamente.
Assim, o shard tem uma construção 'de baixo para cima' — presumimos que cada conta possui seu próprio shard, mas eles estão, por um tempo, 'colados' por prefixos. Isso é o que implica a Infinite Sharding Paradigm (paradigma de sharding infinito).
É importante enfatizar que os workchains existem apenas virtualmente — na verdade, workchain_id isso é parte do identificador de um shardchain específico. Em termos formais, cada shardchain é definido por um par de números (workchain_id, shard_prefix).
Correção de erros. Blockchains verticais.
Tradicionalmente, considera-se que qualquer transação em um blockchain é 'esculpida em pedra'. No entanto, no caso do TON, existe a possibilidade de 'reescrever a história' — caso alguém (o chamado nó 'pescador')) comprova que um dos blocos foi assinado incorretamente. Nesse caso, um bloco corretivo especial é adicionado à respectiva shardchain, contendo o hash do bloco que está sendo corrigido (e não do último bloco na shardchain). Representando a shardchain como uma cadeia de blocos disposta horizontalmente, pode-se dizer que o bloco corretivo é anexado ao bloco incorreto não à direita, mas por cima — por isso, é considerado parte de um pequeno 'blockchain vertical'. Assim, pode-se dizer que as shardchains são blockchains bidimensionais.

Caso após o bloco incorreto as mudanças que ele fez tenham sido referenciadas por blocos subsequentes (ou seja, novas transações foram realizadas com base em dados inválidos), blocos corretivos também são adicionados 'por cima' desses blocos. Se os blocos não afetaram as informações 'afetadas', essas 'ondas corretivas' não se espalham sobre eles. Por exemplo, na ilustração acima, a transação do primeiro bloco, que aumenta o saldo da conta C, foi considerada incorreta — portanto, a transação que diminui o saldo dessa conta no terceiro bloco também deve ser anulada, e um bloco corretivo deve ser registrado sobre o próprio bloco.
É importante notar — embora os blocos corretivos sejam representados como localizados 'acima' dos originais, na verdade, eles serão adicionados ao final da respectiva blockchain (para onde deveriam estar cronologicamente). A disposição bidimensional apenas mostra a que ponto na blockchain eles serão 'anexados' (por meio do hash do bloco original que está neles).
Pode-se filosofar separadamente sobre quão boa é a solução de 'mudar o passado'. Parece que, se permitimos a possibilidade de um bloco incorreto aparecer na shardchain, não podemos também excluir a possibilidade de um bloco corretivo errôneo surgir. Aqui, pelo que posso julgar, a diferença está no número de nós que devem alcançar consenso sobre novos blocos — em cada shardchain, trabalha-se com um relativamente pequeno 'grupo de trabalho' de nós (que frequentemente altera sua composição), enquanto a adição de blocos corretivos exigirá o consentimento de todos nós-validadores. Farei mais detalhes sobre validadores, grupos de trabalho e outras funções dos nós no próximo artigo.
Uma blockchain para governar todas
Acima foi mencionada muita informação sobre os diferentes tipos de blockchains, que também precisam ser armazenadas em algum lugar. Em particular, fala-se sobre as seguintes informações:
- sobre a quantidade e configurações de workchains;
- sobre a quantidade de shardchains e seus prefixos;
- sobre quais nós estão atualmente responsáveis por quais shardchains;
- os hashes dos últimos blocos adicionados a todos os shardchains.
Como você já poderia ter adivinhado, todas essas informações são registradas em mais um armazenamento-blockchain — masterchain (masterchain, master blockchain). Devido à presença de hashes de blocos de todos os shardchains em seus blocos, ele torna o sistema fortemente interconectado. Isso significa que a geração de um novo bloco na masterchain ocorrerá imediatamente após a geração de blocos nos shardchains — espera-se que os blocos nos shardchains apareçam quase simultaneamente a cada 5 segundos, e o próximo bloco na masterchain — um segundo depois disso.
Mas quem será responsável pela implementação de todo esse trabalho titânico — pelo envio de mensagens, execução de contratos inteligentes, formação de blocos nos shardchains e na masterchain, e ainda verificar os blocos quanto a erros? Será que tudo isso será feito silenciosamente pelos telefones de milhões de usuários com o cliente do Telegram instalado? Ou talvez a equipe dos Durov desista das ideias de descentralização e isso será feito pelos servidores deles da maneira tradicional?
Na verdade, nem uma nem outra resposta está correta. Mas o espaço deste artigo está rapidamente se esgotando, então a conversa sobre os diferentes papéis dos nós (você pode já ter notado algumas menções a eles), bem como sobre os mecanismos de seu funcionamento, irá para a próxima parte.
Fonte: habr.com
