Como podem os pares em uma rede de blockchain ter certeza de que todos os dados de um novo bloco proposto estão disponíveis? E por que isso é importante?
Nesta postagem, exploramos os detalhes do problema de disponibilidade de dados e como isso pode impactar a escalabilidade no Ethereum.
Para dar um exemplo, suponha que Alice seja uma operadora de um ZK-Rollup (ZKR). Ela envia uma Prova-ZK no Ethereum que é verificada. Se ela não enviar todos os dados transacionais no Ethereum, embora sua prova prove que todas as transições de estado realizadas no rollup são válidas, os usuários do rollup ainda podem estar no escuro sobre seus saldos de conta atuais. A prova enviada não lança luz sobre os estados atuais devido à natureza de Zero-Conhecimento dela.
Um exemplo análogo existe no Rollup otimista (OPR)configuração, onde Alice envia uma afirmação no Ethereum, mas nenhum dos participantes do OPR pode desafiá-la porque os dados transacionais não estão disponíveis e, portanto, não conseguem recalcular ou desafiar a afirmação.
Para enfrentar os cenários acima, ambos os designs OPR e ZKR exigem que os operadores enviem todos os detalhes transacionais sobreEthereumcomo 'calldata'. Embora isso os faça evitar o problema de DA a curto prazo, à medida que o número de transações cresce dentro dos rollups, a quantidade de dados que precisa ser enviada também cresceria, limitando a quantidade de escalabilidade que esses rollups podem oferecer.
Para piorar as coisas, a indisponibilidade de dados não é uma falha exclusivamente atribuível. Isso significa que os participantes não podem provar para outros pares que um determinado pedaço de dados está faltando. Isso ocorre porque Bob pode transmitir que o bloco enviado por Alice está com dados faltando, mas quando Charlie questiona Alice, ela pode fornecer os dados a ele.
Um bloco pode ser dividido em duas partes principais:
Pode haver outra classe de nós que não têm (ou não querem gastar) recursos para verificar cada transação. Em vez disso, estão principalmente interessados em saber o estado atual da blockchain e se algumas transações, que são relevantes para eles, estão incluídas na cadeia ou não. Idealmente, esses clientes leves também devem estar protegidos de seguir uma cadeia que contenha transações inválidas. Isso é realmente possível usando chamados provas de fraude. Estas são mensagens sucintas que mostram que um determinado corpo de bloco inclui uma transação que é inválida. Qualquer nó completo pode produzir tal prova de fraude, e o cliente leve assim não tem que confiar que um determinado nó completo é honesto. Eles apenas têm que garantir que estão bem conectados a uma rede de fofocas que garanta que, se houver uma prova de fraude disponível para um cabeçalho de bloco, eles a receberão.
No entanto, há um problema com este sistema: e se um produtor de blocos não revelar todos os dados por trás de um bloco. Nesse caso, os nós completos obviamente rejeitarão o bloco, pois, em sua visão, nem sequer é um bloco se não vier com o corpo do bloco. Clientes leves, no entanto, podem ser apresentados com a cadeia de cabeçalhos e não têm como perceber que os dados estão faltando. Ao mesmo tempo, os nós completos não podem produzir provas de fraude, porque estariam faltando os dados necessários para criar provas de fraude.
Para combater isso, precisamos de um mecanismo para que os clientes leves verifiquem a disponibilidade dos dados. Isso garantiria que um produtor de blocos que esconde dados não possa escapar convencendo um cliente leve do contrário. Também forçaria o produtor de blocos a revelar partes dos dados, fazendo com que toda a rede tenha acesso ao bloco inteiro de maneira colaborativa.
Vamos aprofundar um pouco mais o problema com a ajuda de um exemplo. Suponha que a produtora de blocos Alice construa um bloco B com transações tx1, tx2, …, txn. Vamos supor que tx1 seja uma transação maliciosa. Se tx1 for transmitida, qualquer nó completo pode verificar que é maliciosa e enviar isso para um cliente leve como uma prova de fraude, que imediatamente saberia que o bloco é inaceitável. No entanto, se Alice quiser esconder tx1, ela revela o cabeçalho e todos os dados transacionais, exceto tx1. Os nós completos não podem verificar a correção de tx1.
Pode-se pensar que uma solução simples é se todos os clientes leves simplesmente amostrarem as transações aleatoriamente e, se encontrarem suas amostras disponíveis, podem ter a certeza de que o bloco está disponível. Deixe os nós leves consultarem qualquer transação, de forma uniforme e aleatória. A probabilidade de o cliente leve consultar tx1 é 1/n. Assim, com uma probabilidade avassaladora, Alice é capaz de enganar os clientes leves para aceitarem uma transação maliciosa. Em outras palavras, a maioria dos clientes leves será enganada. Devido à natureza não atribuível, os nós completos não podem provar de forma alguma que tx1 não está disponível. Infelizmente, aumentar o número de amostras não melhora muito isso.
Em poucas palavras, a codificação de apagamento nos permite estender qualquer n pedaços de dados em 2n pedaços de dados de forma que qualquer n de 2n seja suficiente para reconstruir a peça original de dados (os parâmetros são ajustáveis, mas aqui consideramos isso para simplicidade).
Se obrigarmos o produtor de bloco a codificar por apagamento as transações tx1, tx2, …, txn, então, para esconder uma única transação, seria necessário esconder n+1 fragmentos de dados, já que qualquer n é suficiente para construir todo o conjunto de transações. Neste caso, um número constante de consultas dá ao cliente leve uma confiança muito alta de que os dados subjacentes estão de fato disponíveis.
Mas há uma pegadinha. Se feito de forma ingênua, o tamanho de algumas provas de fraude pode ser da ordem do tamanho do próprio bloco. A suposição de recursos que tínhamos sobre o cliente leve nos impede de usar esse design. Houve melhorias nesse sentido ao usar técnicas de codificação de apagamento multidimensional que reduzem o tamanho das provas de fraude ao custo do tamanho do comprometimento. Por uma questão de brevidade, não abordamos esses aspectos, mas este papeltem uma análise detalhada disso.
O problema com soluções baseadas em prova de fraude é que os clientes leves nunca têm certeza completa sobre qualquer bloco para o qual ainda não receberam uma prova de fraude. Além disso, eles continuam confiando que seus pares de nós completos são honestos. Nós honestos também precisam ser incentivados a continuar auditando blocos.
Nós focamos nossa atenção aqui em sistemas que garantem que, se a codificação do bloco for inválida, os nós completos podem detectá-la e fornecer prova aos clientes leves que os convençam do mau comportamento. No entanto, na próxima seção, vamos analisar as codificações de bloco que garantem que apenas codificações válidas possam ser confirmadas na cadeia. Isso elimina a necessidade de provas de fraude que comprovem erros de codificação. Essas soluções baseadas em provas de validade permitem que aplicativos usem o sistema sem ter que esperar por esse tipo de prova de fraude dos nós completos.
Forçamos o produtor de bloco a pegar os dados transacionais originais e organizá-los em uma matriz 2D de tamanho n x m. Ele usa interpolação polinomial para estender cada coluna de tamanho n em colunas de tamanho 2n. Cada linha desta matriz estendida gera um compromisso polinomial e envia esses compromissos como parte do cabeçalho do bloco. Uma representação esquemática do bloco é dada abaixo.
Os clientes leves consultam qualquer célula desta matriz estendida para obter a testemunha que permite verificar imediatamente contra o cabeçalho do bloco. As provas de associação de tamanho constante tornam a amostragem extremamente eficiente. A natureza homomórfica do compromisso garante que a prova verifique apenas se o bloco for construído corretamente e a interpolação polinomial garante que um número constante de amostras bem-sucedidas significa que os dados estão disponíveis com uma probabilidade muito alta.

Uma representação esquemática do bloco
Os detalhes mais refinados do esquema juntamente com mais otimizações e estimativas de custo estão além do escopo deste artigo. No entanto, gostaríamos de salientar que, embora discutamos um esquema 2D aqui, garantias semelhantes podem ser fornecidas com um esquema 1D também, que tem um tamanho de cabeçalho menor ao custo de menos paralelismo e eficiência de amostragem do cliente leve. Vamos aprofundar isso em artigos de acompanhamento.
Na Avail, estamos trabalhando em uma solução de Disponibilidade de Dados usando compromissos KZG. Em postagens futuras, abordaremos os detalhes de implementação, como você pode usá-lo hoje e como pretendemos transformar o espaço de problemas de DA. Para mais informações sobre Avail, siga-nos emTwittere junte-se ao nossoservidor do Discord.
Responsabilidade de Isenção: As visões e opiniões expressas neste artigo são exclusivamente do autor e não constituem nenhum conselho de investimento.
As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. A menos que seja mencionado, copiar, distribuir ou plagiar os artigos traduzidos é proibido.





