Explorando opções de escalabilidade do modelo UTxO
O modelo UTxO permite o processamento paralelo de transações, recurso essencial para alcançar alta escalabilidade e rápida finalização das transações. Neste artigo, mergulharemos em várias estratégias para melhorar o consenso da rede, o que pode levar a um maior rendimento da rede e a uma finalização mais rápida das transações. No artigo você aprenderá sobre endossantes de entrada, fragmentação e como a proteção contra ataques de gasto duplo limita a escalabilidade.
Recursos básicos do modelo UTxO
UTxOs são objetos independentes e imutáveis. Depois que um UTxO é criado como saída de uma transação, ele permanece inalterado até ser gasto em uma nova transação. Quando é gasto, é totalmente consumido e um novo UTxO é criado como saída da nova transação.
A imagem ilustra o envio contínuo e paralelo de novas transações pelos usuários. Cada transação aponta exclusivamente para UTxOs de entrada do conjunto UTxO, conforme indicado pelas setas vermelhas que levam aos UTxOs vermelhos. O termo ESTADO 1 representa o novo estado global que surge em cada nó após a aceitação de um novo bloco. Os UTxOs vermelhos foram removidos do conjunto UTxO. O conjunto UTxO foi atualizado com a adição de UTxOs recém-formados, representados pelas setas verdes apontando para os UTxOs verdes.
O modelo UTxO é fundamental no gerenciamento do estado global durante a validação da transação. O estado global em Cardano é representado por uma coleção ativa de UTxOs, também conhecida como conjunto UTxO. Com a adição de cada novo bloco, todos os UTxOs recém-criados são incorporados ao conjunto UTxO. Por outro lado, os UTxOs consumidos (gastos) pelas transações são removidos do conjunto UTxO. UTxOs podem ser percebidos como entidades descartáveis.
Cada nó da rede mantém seu conjunto UTxO individual. A maioria dos nós que aderem ao consenso possuem um conjunto UTxO idêntico (estado global), pois preservam o mesmo histórico da blockchain, incluindo o bloco anexado mais recentemente. No entanto, devido a atrasos na transmissão de dados da rede, o estado global não sofre alterações instantâneas em todos os nós simultaneamente, mas sim com um pequeno atraso. Pode-se postular que no momento em que um nó produtor de bloco dissemina um novo bloco na rede, todos os nós compartilham o mesmo estado global (o que significa que receberam o último bloco e atualizaram o estado global de acordo).
Como aumentar a finalidade das transações?
Cardano emprega um mecanismo de consenso semelhante ao consenso do estilo Nakamoto. Isso é tipificado pela finalidade probabilística dos blocos e, consequentemente, das transações. Isso implica que se uma transação for incluída em um novo bloco, denominado BLOCO 1, ela terá uma contagem de confirmação zero. Quando um bloco é adicionado, existe uma chance de que esse bloco não persista no blockchain, pois pode ser suplantado por um bloco alternativo criado na mesma época. A garantia de que um bloco perdurará na blockchain aumenta com a adição de novos blocos além do BLOCO 1. Isto é muitas vezes referido como um aumento no número de confirmações.
Na imagem você pode ver que após o BLOCO 0 houve uma bifurcação do blockchain. Dois BLOCOS 1 alternativos foram produzidos. Após anexar mais blocos, a cadeia superior prevaleceu. Na cadeia superior, ocorreu a transação TX 1.
Cardano apresenta baixa finalidade de transação. O tempo de bloco na Cardano está configurado para 20 segundos. Isso indica que se sua transação exigir 10 confirmações, você terá que esperar aproximadamente 200 segundos, o que equivale a aproximadamente 3 minutos.
Graças à independência dos UTxOs dentro do conjunto UTxO, a validação das transações também é mutuamente exclusiva. Cada nó pode validar uma transação ou um grupo de transações. A sequência de transações dentro de um bloco é irrelevante, pois elas não influenciam umas às outras. Conseqüentemente, um nó pode não apenas validar transações individuais após o recebimento, mas também anexar uma aprovação ou voto de alguma forma antes de divulgar a transação para a rede. Cada nó subsequente que receber a transação também observará as aprovações dos nós que receberam a transação anteriormente.
Na imagem você pode ver como a transação TX 1 coleta gradativamente aprovações em todos os outros nós para os quais é difundida. Quando o NODE 4 produz um novo bloco, a transação já possui 4 aprovações. Observe que o NODE 4 foi o primeiro a modificar seu pool de memória. O NÓ 4 removeu a entrada antiga UTxO (vermelho) da transação TX 1 e inseriu o recém-criado UTxO (verde).
As transações que estiveram no pool de memória de um nó por um período mais longo geralmente terão mais aprovações e poderão receber maior prioridade ao serem adicionadas a um bloco. Esta já é uma característica das transações Cardano, uma vez que Cardano opera numa base de primeiro a entrar, primeiro a sair. Crucialmente, se uma transação obtiver a aprovação da maioria dos nós da rede, a probabilidade de ela ser descartada diminui, mesmo que a blockchain passe por uma reorganização.
O processo de consenso sobre a inclusão de transações pode ocorrer de forma mais rápida e independente da produção de novos blocos.
Mesmo que o bloco que contém a transação tenha apenas algumas confirmações (possivelmente apenas uma), já haverá um consenso entre os nós da rede de que a transação deve fazer parte da blockchain. A rede pode ser projetada de forma que as transações mais antigas com um grande número de aprovações sejam incluídas na blockchain na primeira oportunidade.
No entanto, a potencial reorganização da blockchain representa um desafio para a finalidade das transações. Apesar de uma transação ter um elevado número de aprovações, é teoricamente possível que ela seja temporariamente removida da blockchain. Isto pode ocorrer se uma parte da cadeia (os blocos mais recentes da blockchain) for substituída por uma versão alternativa. Os blocos nesta nova versão da subcadeia podem conter um conjunto diferente de transações. Portanto, melhorar a finalidade das transações envolve alterar o consenso para evitar a reorganização da blockchain ou modificar as regras para refletir o número de aprovações de transações.
Na imagem abaixo você pode ver a reorganização indesejada do blockchain. O TX1 da cadeia superior teve 4 homologações e uma confirmação (BLOCO 2). Porém, no final, prevaleceu a cadeia inferior em que não há transação TX 1.
A finalidade da transação pode ser aprimorada por nós concordando em sua integração na blockchain durante sua propagação na rede. Isto é viável devido ao modelo UTxO, pois a validação de uma transação requer apenas a verificação da existência de UTxOs de entrada (sua presença no conjunto UTxO), significando que são gastáveis.
A seguir, no artigo, mostraremos como é teoricamente possível alcançar a finalização mais rápida das transações antes que a rede produza o próximo bloco.
Além disso, a finalidade pode ser aumentada agilizando o consenso sobre o bloco recém-anexado à rede. Isso pode ser alcançado por nós votando em um bloco antes de sua adição ao blockchain ou logo depois.
Endossantes de entrada
Input Endorsers é um plano para melhorar a escalabilidade do Cardano. Essa melhoria pode ser vista como uma forma de votação antes de um bloco (bloco de consenso) ser adicionado ao blockchain.
Os Endossantes de Entrada usam 3 tipos de blocos: Blocos de Entrada (IB), Blocos de Endosso (EB) e Blocos de Classificação (RB). Cada tipo de bloco será cunhado em uma frequência diferente. Alguns blocos podem ser cunhados no mesmo slot. Os blocos de entrada serão cunhados com a frequência mais rápida.
Os endossantes de entrada acompanham todas as transações enviadas e agrupam essas transações em blocos pré-construídos. O objetivo principal do recurso Input Endorser é separar a seleção de transações da produção de blocos.
Neste modelo, as transações poderiam coletar consentimentos no caminho para os mem-pools. Isso ocorre porque os Endossantes de Entrada incorporam elementos de paralelismo e simultaneidade no consenso, enquanto mantêm a linearidade do blockchain.
O algoritmo Input Endorsers facilitará a preparação de um grande número de transações durante a fase de seleção de transações, pois permite a participação simultânea de mais nós na rede. Os nós endossantes validam e pré-aprovam transações, o que ajuda a diminuir a carga computacional e as demandas de largura de banda dos produtores de blocos de classificação, ao mesmo tempo que aumenta a diversidade e a disponibilidade do pool de transações. Além disso, agilizam a confirmação de transações que ainda não foram incorporadas à cadeia, fornecendo prova verificável de endosso.
A implantação de Input Endorsers é viabilizada unicamente devido ao modelo UTxO, pois permite que os nós validem transações de forma independente. A única linearidade que precisa ser preservada no sistema está no nível da classificação dos blocos, visto que uma blockchain é uma sequência linear de blocos. A sequência de transações dentro de um bloco, inclusive os blocos de classificação, é irrelevante. Curiosamente, os blocos de classificação não abrigam transações, mas apenas contêm referências a elas por meio de blocos de endosso.
A imagem mostra usuários enviando transações que se referem a UTxOs de entrada (ilustrados como UTxOs vermelhos) do conjunto ativo de UTxOs (o estado global). Essas transações passam por validação paralela e posteriormente são incorporadas aos Blocos de Entrada. Os nós podem endossar esses blocos de entrada simultaneamente. O sistema mantém a linearidade e o nível máximo de validação, o que protege contra ataques de gasto duplo e similares, no nível mais alto do consenso onde os Blocos de Classificação são anexados ao blockchain.
Com cada bloco recém-anexado ao blockchain, o estado global também muda. Conforme descrito acima, os UTxOs consumidos são removidos do conjunto UTxO e novos UTxOs (UTxOs verdes de transações) são inseridos simultaneamente nele.
Nota: A imagem acima mostra apenas o consumo de UTxOs, não a inserção de novos UTxOs no conjunto UTxO.
Proteção contra ataques duplos
A proteção contra ataques de gasto duplo é um dos fatores que limitam a escalabilidade e o processamento paralelo das transações. A entrada para validação de transações é o estado global. O nó valida as transações no contexto do estado global atual que mantém.
O modelo de contabilidade afeta fundamentalmente como os nós trabalham com o estado global e quais opções eles têm em relação à paralelização da validação e escalabilidade das transações.
No contexto do modelo UTxO, um ataque de gasto duplo pode ocorrer quando um usuário envia duas transações que fazem referência à mesma entrada UTxO. Isso é o mesmo que tentar gastar o mesmo dinheiro duas vezes. Um invasor sofisticado pode enviar transações à rede através de diferentes nós, ou seja, em diferentes locais da rede. Isso significa que ambas as transações serão consideradas válidas por um determinado grupo de nós até que chegue outra transação gastando a mesma entrada UTxO. É quando ocorre um conflito.
Num cenário ideal, um ataque de gasto duplo é identificado na primeira oportunidade. Uma transação será incorporada ao novo bloco, enquanto a outra será dispensada. A transação incluída influenciará o estado global. O UTxO consumido se tornará inutilizável, tornando a segunda transação permanentemente inválida, pois se refere a um UTxO já gasto.
Com a implementação de Endossantes de Entrada, um ataque de gasto duplo pode ser potencialmente detectado no estágio de Blocos de Entrada ou Blocos de Endosso. Mesmo que esta detecção não ocorra, o ataque certamente será identificado pelo nó durante a construção do Bloco de Ranking.
A imagem ilustra uma tentativa de ataque de gasto duplo. A transação TX 1 é colocada em um bloco de entrada diferente da transação TX 2. Posteriormente, ambas as transações são incluídas em blocos de endosso separados. Nesta fase, a rede pode potencialmente identificar as transações conflitantes e descartar uma delas. Porém, caso isso não ocorra, o conflito será resolvido durante a construção do Bloco de Ranking. O nó responsável pela construção do Ranking Block possui todas as informações necessárias para detectar transações conflitantes e resolver o problema.
Observe que o sistema facilita o processamento paralelo de transações, ao mesmo tempo que mantém a capacidade de resolver conflitos de forma determinística e impedir ataques de gasto duplo. A maioria das transações são incorporadas ao Bloco de Classificação, mas as transações em conflito não têm chance de passar na validação.
Visualize uma melhoria onde a finalidade das transações não dependa do número de confirmações no nível do Ranking de Bloco, mas sim da contagem de endossos. Isto implica que a finalidade seria aproximadamente proporcional à velocidade de propagação da transação dentro da rede. O nó que o usuário utilizou para submeter a transação à rede deve tomar conhecimento da quantidade de endossos. Isto requer um mecanismo para disseminar blocos de endosso. O nó que iniciou a transação receberá o Bloco de Endosso e observará o número de aprovações da transação do usuário dentro dele. Essas informações podem ser exibidas ao usuário por meio da carteira ou do explorador de blockchain. Se a transação obtivesse aprovações de, hipoteticamente, 51% da participação e fosse quase certo que não houve nenhuma transação conflitante, a transação poderia ser considerada final em teoria. No entanto, a transação só atingirá a finalidade final quando se tornar parte do Bloco de Classificação.
O modelo UTxO e fragmentação
Sharding é uma tecnologia chave que aumenta a escalabilidade dos blockchains. A rede blockchain é dividida em partes menores ou sub-redes, conhecidas como ‘fragmentos’. A carga de trabalho computacional e de armazenamento total é dividida em fragmentos.
Sharding é uma forma de paralelismo em um sistema. Cada fragmento opera de forma independente e pode processar seu próprio conjunto de transações. Essa execução paralela de transações aumenta a eficiência e o rendimento geral do sistema.
Cada fragmento mantém sua parte do estado global. Isso é conhecido como estado local. O estado global de todo o blockchain é então o agregado de todos esses estados locais.
A comunicação entre fragmentos é um aspecto importante do sharding. Refere-se ao processo de transações ou troca de informações entre diferentes fragmentos. Isto é crucial porque o rendimento de uma rede blockchain fragmentada é significativamente afetado pela comunicação entre fragmentos.
O modelo UTxO é mais vantajoso para fragmentação do que o modelo baseado em conta.
No contexto do modelo UTxO, a transação serve como unidade fundamental de validação. Uma transação é uma entidade que pode ser validada de forma independente por várias partes simultaneamente. O resultado destas validações será invariavelmente idêntico. Cardano executa validações de transações de forma determinística. Múltiplas partes podem validar transações em paralelo e em qualquer ordem, independentemente do bloco, ou seja, independentemente de quando as transações serão incorporadas ao bloco e independentemente da sequência de transações dentro do bloco.
Em contraste, no modelo baseado em conta do Ethereum, o bloco é a principal unidade de validação. As transações são interdependentes. Uma transação Ethereum não pode ser validada isoladamente, mas apenas em relação ao estado global prevalecente. O estado global no Ethereum pode ser conceituado como uma sequência de transações. O resultado da validação da transação depende de sua posição nesta sequência.
A disparidade nos modelos contábeis influencia significativamente a implementação da fragmentação.
Simplificando, considere a rede Cardano como um único fragmento. Se tivéssemos 10 fragmentos, seria o mesmo que ter 10 redes Cardano operando lado a lado. Teoricamente, isso poderia levar a um aumento de dez vezes no rendimento da rede. No entanto, na prática, este pode não ser o caso devido a fatores como a comunicação entre fragmentos, a necessidade de garantir a consistência e a segurança dos dados, a latência da rede e a sobrecarga de gestão (como equilibrar a carga entre os fragmentos, gerir a entrada e saída de nós, e roteamento de transações).
Para blockchains que usam o modelo UTxO, a implementação do sharding é relativamente simples, pois o estado global permite naturalmente o paralelismo e as transações podem ser validadas independentemente dentro de cada shard.
O modelo UTxO tem suas vantagens quando se trata de comunicação entre fragmentos, pois é relativamente fácil criar uma transação que requer validação de dois fragmentos.
Imagine uma transação que tem UTxOs de entrada do estado global do SHARD 1 e cria UTxOs de saída no estado global do SHARD 2. Essa transação faria parte do blockchain em ambos os shards. A vantagem aqui é que a validação pode ocorrer independentemente do bloco, ou seja, independentemente da ordem da transação no bloco.
Em cada fragmento com endossantes de entrada, uma transação entre fragmentos poderia receber endossos (aprovações) logo após seu envio. A transação seria submetida no SHARD 1, que a encaminharia imediatamente para o SHARD 2. Em ambos os shards, a transação receberia endossos simultaneamente. Em ambos os fragmentos, uma transação poderia potencialmente obter o apoio de, digamos, 51% da participação num espaço de tempo muito curto. Seria necessário haver um mecanismo para compartilhar blocos de endosso entre fragmentos (um subconjunto de dados relacionados a transações entre cadeias seria suficiente). No momento em que cada um dos shards inseriria uma transação no bloco de classificação, o determinado shard poderia esperar com um alto nível de certeza que a transação seria inserida no bloco de classificação do outro shard, graças a um grande número de endossos.
Teoricamente, o SHARD 1 não precisa esperar que a transação seja inserida no Bloco de Classificação. Claro, apenas sob a suposição de que haverá um mecanismo (e incentivos) que garantirá que uma transação com um elevado número de endossos da maioria da participação sempre chegue a um dos próximos blocos.
Na imagem você pode ver a transação TX 1, que possui uma entrada UTxO do SHARD 1. O resultado da transação é uma saída UTxO que é criada no SHARD 2. Pode-se dizer que o valor é transferido entre shards. A transação chega ao bloco de entrada no SHARD 1. O SHARD 1 encaminha a transação para o SHARD 2. O TX chega ao bloco de entrada no SHARD 2. A transação TX 1 chega gradualmente aos blocos de endosso em ambos os shards e, finalmente, aos blocos de classificação. Assim que a transação for inserida no Bloco de Classificação, o estado local no fragmento fornecido será alterado. A entrada UTxO é removida do estado local do SHARD 1. Um novo UTxO será criado no estado local do SHARD 2.
O modelo UTxO oferece vários benefícios, incluindo sua aplicabilidade tanto para endossantes de entrada quanto para fragmentação. O exemplo acima mencionado ilustra a integração destas duas tecnologias. Uma vez implementados os Endossadores de Entrada, a fragmentação tem o potencial de melhorar a escalabilidade da Cardano. No entanto, os endossantes de entrada devem agilizar a finalização da transação para evitar comunicação lenta entre fragmentos e garantir a integridade do estado global.
Por que é difícil implementar fragmentação no Ethereum?
Ethereum opera em um modelo baseado em contas onde cada conta possui um estado associado. O estado global do Ethereum é essencialmente um banco de dados de todas as contas e seus saldos de ativos atuais. A cada novo bloco, o estado do sistema é atualizado com base nas transações desse bloco.
As transações são processadas verificando se há fundos suficientes no saldo do remetente. Se for bem sucedido, o saldo do remetente diminui enquanto o do destinatário aumenta. A Máquina Virtual Ethereum (EVM) então calcula um novo estado a partir do estado atual e da transação, que se torna a base para a próxima transação. Esta evolução contínua do estado da blockchain significa que a ordem da transação é crucial para a validação.
Cada transação pode alterar potencialmente o estado de qualquer conta e seu resultado pode depender da ordem de processamento. Para manter a consistência e evitar gastos duplos, o estado global “trava” durante cada validação, permitindo que apenas uma transação seja processada por vez. Este mecanismo de bloqueio é vital para a integridade do sistema, evitando que transações simultâneas causem inconsistências ou gastos duplos.
As entradas de transação são saldos de contas, um recurso compartilhado. Isto significa que o saldo no envio da transação pode diferir do saldo na validação, tornando a entrada da transação não determinística, ao contrário do modelo UTxO.
No Ethereum, os saldos são entidades duradouras que podem ser modificadas por transações a qualquer momento, mas duas transações não podem modificar simultaneamente o mesmo saldo.
Na imagem você pode ver como os usuários enviam 5 transações. As transações podem ser enviadas em paralelo. Observe que várias transações ajustam o mesmo saldo. Por exemplo, TX 1 e TX 2 subtraem um valor do mesmo saldo. As transações TX 3 e TX 4 agregam valor ao mesmo saldo. ESTADO 1 a ESTADO 4 representam o processamento sequencial de transações e, portanto, a atualização gradual do estado global. O estado global é composto pelos mesmos saldos, ou seja, objetos permanentes cujo estado pode ser alterado muitas vezes seguidas através de transações.
Imagine o quão mais complicada é a comunicação entre fragmentos se uma transação tiver que alterar simultaneamente um saldo no SHARD 1 e outro no SHARD 2. A ordem das transações no bloco Ethereum desempenha um papel importante no resultado da validação. Com a implementação atual do EVM, seria necessário que ambos os shards incluíssem a transação no bloco e passassem informações sobre os resultados da validação entre si. Não faz sentido que no SHARD 1 a validação da transação tenha sido bem-sucedida e o valor tenha sido deduzido do saldo, enquanto no SHARD 2 a validação da transação falharia, ou seja, o valor não seria creditado no saldo. A comunicação entre fragmentos limita severamente a capacidade de construir um bloco em cada fragmento.
Na imagem você pode ver a transação TX 1, que é inserida no mem-pool após o envio. Ele é então inserido do mem-pool no BLOCK 1. A validação da transação TX 1 altera o estado local atual no SHARD 1. No entanto, o SHARD 1 precisa saber o resultado da validação no SHARD 2. O SHARD 1, portanto, se comunica com o SHARD 2 sobre o resultado da validação da transação no BLOCO 2 (SHARD 2). Portanto o SHARD 2 deve inserir a transação TX 1 no BLOCO 2 e realizar a validação. Ele pode então comunicar o resultado da validação ao SHARD 1. Observe que o SHARD 1 deve conhecer o resultado da validação no SHARD 2 antes de adicionar outra transação ao seu BLOCO 1.
Na verdade, o exemplo fornecido é uma implementação simplificada (ingênua) de fragmentação. Ele destaca os desafios significativos que a equipe da Ethereum enfrenta na implementação da fragmentação com o mecanismo de consenso atual.
Manter a atomicidade da transação durante a comunicação entre fragmentos em um blockchain baseado em conta é uma tarefa complexa. É vital garantir que uma transação seja totalmente executada ou não seja executada para manter a integridade do sistema.
Várias estratégias e protocolos, incluindo protocolos de compromisso de duas fases, foram propostos para resolver este problema. No entanto, estas soluções também apresentam os seus compromissos e complexidades. É digno de nota que vários projetos implementaram com sucesso a fragmentação dentro de uma blockchain usando o modelo baseado em contas.
Conclusão
Alterar os mecanismos de consenso é apenas um método para melhorar a escalabilidade da rede. A escalabilidade também pode ser melhorada através de soluções de segunda camada, arquitetura em camadas ou aumentando a eficiência. Por exemplo, o Plutus V2 é mais eficiente que seu antecessor, Plutus V1, resultando em economia de espaço em bloco. Essa eficiência permite mais transações por bloco, aumentando assim o rendimento da rede. No entanto, os Input Endorsers podem fornecer melhorias de escalabilidade mais substanciais do que apenas ganhos de eficiência.
Alguns membros da comunidade Cardano acreditam que o foco deveria ser mais no aumento da escalabilidade por meio da criptografia ZK, em vez de endossantes de entrada. Cardano incorporará criptografia ZK por meio do hard fork Chang. Devido ao determinismo da Cardano, será viável construir rollups ZK que não requeiram sequenciadores.
O modelo UTxO é muito adequado para Input Endorsers ou sharding, pois o estado global composto por objetos descartáveis é bem paralelizável. Vários nós da rede podem validar transações independentemente uns dos outros em paralelo, mesmo no caso de fragmentação.
Você gostou deste artigo? Por favor, compartilhe, obrigado!