Neste artigo, vou falar sobre o DAG (Directed Acyclic Graph, gráfico acíclico direcionado) e sua aplicação em registros distribuídos, e vamos compará-lo com o blockchain.

DAG não é algo novo no mundo das criptomoedas. Você talvez tenha ouvido sobre isso como uma solução para os problemas de escalabilidade dos blockchains. Mas hoje, não vamos falar sobre escalabilidade, e sim sobre o que torna as criptomoedas diferentes de tudo o mais: descentralização, ausência de intermediários e resistência à censura.

Além disso, vou mostrar que o DAG é na verdade mais resistente à censura, e não há intermediários para acessar o registro.

Nos blockchains que conhecemos, os usuários não têm acesso direto ao próprio registro. Quando você quer adicionar uma transação ao registro, precisa 'pedir' ao produtor de blocos (block producer, também chamado de 'miner'). São os miners que decidem qual transação adicionar ao próximo bloco e qual não. Apenas os miners têm acesso exclusivo aos blocos e o direito de decidir qual transação aceitar para adição ao registro.
Os miners são os intermediários que estão entre você e o registro distribuído.

Na prática, um número geralmente pequeno de pools de miners controla coletivamente mais da metade do poder computacional da rede. Para o Bitcoin, são quatro pools; para o Ethereum, são dois. Em caso de conluio, eles podem bloquear qualquer transação que desejarem.

Nos últimos anos, foram propostas muitas variações de blockchains, que diferem nos princípios de seleção dos produtores de blocos. Mas os próprios produtores de blocos não desapareceram, eles ainda 'estão na porta': cada transação deve passar pelo produtor de blocos, e se ele não a aceitar, a transação, na prática, não existe.

Esse é um problema inevitável no caso do blockchain. E se quisermos resolvê-lo, devemos mudar radicalmente o design e nos livrar completamente dos blocos e dos produtores de blocos. Em vez de construir uma cadeia de blocos, vamos conectar as próprias transações, incluindo em cada transação hashes de várias anteriores. Como resultado, teremos uma estrutura conhecida na matemática como gráfico acíclico direcionado – DAG.
Agora, todos têm acesso direto ao registro, sem intermediários. Quando você deseja adicionar uma transação ao registro, basta adicioná-la. Você escolhe algumas transações parentais, insere seus dados, assina e envia sua transação para a pirâmide na rede. Pronto. Não há ninguém para impedir que você faça isso, então sua transação já está no registro.
Este é o meio mais descentralizado e mais resistente à censura para adicionar transações ao registro sem intermediários. Porque qualquer pessoa pode simplesmente adicionar suas transações ao registro, sem pedir permissão a ninguém.

O DAG pode ser considerado a terceira fase da evolução dos registros. Primeiro, havia registros centralizados, onde uma parte controlava o acesso a eles. Depois vieram as blockchains, nas quais havia vários controladores que registravam as transações no registro. E, finalmente, no DAG, não há controladores; os usuários adicionam suas transações diretamente.

Agora que temos essa liberdade, ela não deve levar ao caos. Precisamos ter um consenso sobre o estado do registro. E esse consenso, ou acordo, geralmente significa concordância sobre duas coisas:
- O que aconteceu?
- Em que ordem isso aconteceu?
Para a primeira pergunta, podemos responder facilmente: assim que uma transação criada corretamente é adicionada ao registro, ela aconteceu. E ponto. As informações sobre isso podem chegar a todos os participantes em momentos diferentes, mas, no final, todos os nós receberão essa transação e saberão que ela ocorreu.
Se fosse uma blockchain, os mineradores decidiriam o que acontece. Tudo o que o minerador decide incluir no bloco – é isso que acontece. Tudo o que ele não inclui no bloco – não acontece.
Nas blockchains, os mineradores também resolvem o segundo problema do consenso: a ordem. Eles têm liberdade para organizar as transações dentro do bloco da maneira que quiserem.
Como podemos determinar a ordem das transações no DAG?

Apenas porque o gráfico é direcionado, já temos alguma ordem. Cada transação faz referência a uma ou mais transações anteriores, parentais. Os pais, por sua vez, referem-se aos seus próprios pais, e assim por diante. Os pais, evidentemente, aparecem antes das transações filhas. Se alguma das transações puder ser alcançada por meio de transições entre as referências "pai-filho", sabemos exatamente a ordem entre as transações nesta cadeia de transações.

Mas a ordem entre as transações nem sempre pode ser determinada apenas pela forma do gráfico. Por exemplo, quando duas transações estão em ramos paralelos do gráfico.

Para resolver a ambiguidade nesses casos, confiamos nos chamados provedores de ordem. Também chamamos eles de "testemunhas". São usuários comuns cuja tarefa é o envio contínuo de transações para a rede, mantendo a ordem, ou seja, de forma que cada uma de suas transações anteriores possa ser alcançada através de transições entre as referências "pai-filho". Os provedores de ordem são usuários de confiança, e toda a rede conta com o fato de que eles não violarão essa regra. Para que confiar neles de maneira racional , exigimos que cada provedor de ordem seja uma pessoa ou organização conhecida (não anônima) e tenha algo a perder caso viole as regras, como por exemplo, uma reputação ou um negócio baseado na confiança.

Os provedores de ordem são escolhidos pelos usuários, e cada usuário inclui uma lista de seus provedores de ordem de confiança em cada transação que envia para a rede. Essa lista consiste em 12 provedores. Esse número é pequeno o suficiente para que a pessoa possa verificar a identidade e a reputação de cada um deles, mas grande o suficiente para que a rede continue a funcionar em caso de problemas inevitáveis com uma minoria dos provedores de ordem.
Essa lista de provedores varia de usuário para usuário, mas as listas das transações vizinhas podem diferir no máximo em um provedor.

Agora que temos os provedores de ordem, podemos destacar suas transações no DAG e organizar todas as outras transações em torno da ordem que eles criaram. Há a possibilidade de criar tal algoritmo (veja para detalhes técnicos).
Mas a ordem em toda a rede não pode ser determinada instantaneamente, precisamos de tempo para que os provedores de ordem enviem um número suficiente de suas transações para garantir a ordem final das transações passadas.
E, uma vez que a ordem é determinada apenas pelas posições das transações dos provedores no DAG, todos os nós da rede eventualmente receberão todas as transações e chegarão a uma conclusão idêntica sobre a ordem dessas transações.

Assim, temos consenso sobre o que consideramos que aconteceu: qualquer transação que entrou no DAG ocorreu. Também temos consenso sobre a ordem dos eventos: isso pode ser visto a partir das relações parentais das transações ou é derivado da ordem das transações enviadas pelos provedores de ordem. Portanto, temos um consenso.

Essa variante de consenso está presente no Obyte. Embora o acesso ao registro do Obyte seja totalmente descentralizado, o consenso sobre a ordem das transações ainda é centralizado, já que 10 dos 12 provedores são controlados pelo criador (Anton Churyumov), e apenas dois deles são independentes. Estamos em busca de candidatos que desejam se tornar um dos provedores de ordem independentes para nos ajudar a descentralizar a determinação da ordem no registro.
Recentemente, um terceiro candidato independente surgiu, disposto a estabelecer e manter um nó de provedor de ordem – a Universidade de Nicósia.

Agora, como controlamos gastos duplos (double-spends)?
De acordo com as regras, ao detectar duas transações gastando a mesma moeda, a transação que aparece primeiro na ordem final de todas as transações é a que vence. A segunda é invalidada pelo algoritmo de consenso.

Caso haja uma possibilidade de estabelecer ordem entre duas transações gastando uma moeda (com base nas relações pai-filho), todos os nós imediatamente rejeitam tal tentativa de gasto duplo.

Por outro lado, se a ordem não for visível das relações parentais entre essas duas transações, ambas são aceitas no registro, e teremos que esperar pelo consenso e a determinação da ordem entre elas pelos provedores de ordem. Então, a transação mais antiga vencerá e a segunda se tornará inválida.

Embora a segunda transação se torne inválida, ela ainda permanece no registro, pois já possui transações subsequentes que a referenciam, as quais não violaram nada e não sabiam que essa transação se tornaria inválida no futuro. Caso contrário, teríamos que remover o pai de boas transações subsequentes, o que violaria o princípio fundamental da rede – toda transação correta é aceita no registro.

Esta é uma regra muito importante, permitindo que todo o sistema seja resistente a tentativas de censura.
Vamos imaginar que todos os provedores de ordem se unam em uma tentativa de "censurar" uma transação específica. Eles podem ignorá-la e nunca escolher como "pai" para suas transações, mas isso não é suficiente; essa transação ainda pode ser incluída indiretamente como pai de alguma outra transação emitida por qualquer usuário da rede que não está participando do conluio. Com o tempo, essa transação receberá cada vez mais filhos, netos e bisnetos de usuários comuns, crescendo como uma bola de neve, e todos os provedores de ordem envolvidos terão que ignorar também essas transações. No final, eles terão que censurar toda a rede, o que é equivalente a sabotar.

Assim, o DAG permanece resistente à censura, mesmo em caso de conluio entre provedores de ordem, superando assim a blockchain em resistência à censura, onde nada pode ser feito se os mineradores decidirem não incluir alguma das transações. E isso decorre da principal propriedade do DAG: a participação no registro é completamente independente e sem intermediários, e as transações são irreversíveis.
Fonte: habr.com
