Princípio e Arquitetura do zkRollup

Avançado5/7/2024, 1:51:10 AM
Com o desenvolvimento e maturação das máquinas virtuais zk, suportando a execução Turing-completa de contratos inteligentes arbitrários se tornou possível. O potencial do zkRollup será verdadeiramente liberado, realizando sua visão de quebrar o trilema do blockchain.

Uma Visão Geral do Rollup

Rollup é uma categoria de soluções de escalonamento de camada 2 de blockchain. Nos esquemas de Rollup, os operadores do projeto executam uma plataforma de camada 2 relativamente independente sob a cadeia principal expandida (ou seja, Camada 1). Os usuários podem executar contratos ou transferir tokens na plataforma de camada 2.

A segurança da plataforma Layer 2 é garantida pelo blockchain Layer 1 em que se baseia. Quando um novo bloco é gerado na Layer 2, as informações de transação do bloco Layer 2, bem como a raiz de estado pós-transação da Layer 2, são agrupadas como uma transação Rollup e publicadas na cadeia Layer 1. A execução real da transação e as mudanças de estado são processadas na plataforma Layer 2 abaixo da main chain, e a Layer 1 só precisa verificar a correção das transições de estado da Layer 2. Como o custo de verificar a correção das transições de estado é muito menor do que executar essas transações na Layer 1, a Layer 2 pode alcançar uma expansão da plataforma Layer 1. A plataforma Layer 2 pode oferecer maior throughput de transação e menores custos de transação em comparação com a Layer 1, mantendo uma segurança equivalente.

Em comparação com outros esquemas de transação off-chain, os Rollups têm duas características:

  • A disponibilidade de dados de estado para a segunda camada é resolvida armazenando-os na cadeia principal. A plataforma da Camada 2 registra todas as informações de transação ou mudanças completas de estado da Camada 2 em blocos na cadeia principal. Caso o estado da Camada 2 seja perdido, qualquer pessoa pode recuperar o estado perdido a partir das informações armazenadas na cadeia principal.
  • No esquema Rollup, as alterações na raiz do estado da Camada 2 empacotadas e armazenadas na cadeia principal precisam ser verificadas de alguma forma na cadeia principal. Após a verificação, o estado da Camada 2 será bloqueado na cadeia principal da Camada 1. Portanto, sob a condição de um esquema de verificação seguro, a Camada 2 pode desfrutar do mesmo nível de segurança que a Camada 1.

Com base nos métodos de verificação das atualizações de estado da Camada 2 pela cadeia principal, atualmente existem dois principais tipos de soluções tecnológicas Rollup. Um é o Rollup Otimista. Neste tipo de esquema, o contrato da cadeia principal não verifica diretamente o novo estado enviado pela Camada 2. Em vez disso, um período de desafio é preparado para cada novo estado enviado. Uma vez que o Rollup envia todas as informações de transação para a cadeia principal e as torna públicas, qualquer pessoa pode verificar a atualização de estado (especialmente quando a atualização envolve sua própria carteira). Se o novo estado estiver incorreto, um verificador pode gerar uma prova de fraude contra esse estado errôneo e enviá-la dentro do período de desafio, invalidando assim a atualização de estado incorreta.

Outro tipo de solução Rollup é zk Rollup. Neste tipo de esquema, após a execução da atualização do estado da Camada 2, o operador da Camada 2 deve fornecer uma prova de conhecimento zero da correção da atualização do estado e submetê-la à cadeia principal juntamente com a atualização do estado. O contrato na cadeia principal verificará a prova para determinar a correção da atualização do estado.

Em comparação com o esquema Optimistic Rollup, o zk Rollup não requer um longo período de desafio para finalmente confirmar transações da Camada 2 e pode ser confirmado mais rapidamente. Além disso, o zk Rollup não depende da suposição de que sempre haverá verificadores honestos na rede que enviarão atempadamente provas de fraude quando ocorrer fraude. No entanto, ao mesmo tempo, o zk Rollup também enfrenta problemas como o alto custo computacional da tecnologia de prova de conhecimento zero, complexidade e dificuldade no desenvolvimento, que impedem a implementação prática da tecnologia zk Rollup em Rollups. Com o desenvolvimento adicional da tecnologia de prova de conhecimento zero nos últimos dois anos, esses obstáculos estão sendo gradualmente superados. A tecnologia zk Rollup está começando a ocupar uma parcela cada vez maior do mercado da Camada 2.

Conforme mostrado na figura abaixo, dentro do campo de escalonamento da camada Rollup-2, o zkRollup já ocupa mais da metade do território e está se desenvolvendo rapidamente.

Fonte da imagem

Dados obtidos em: 18 de janeiro de 2024

Do zkRollup Especializado para zkRollup Geral

Durante seu desenvolvimento, zkRollup passou principalmente por duas etapas. O primeiro tipo é o zkRollup não-geral, enquanto o segundo tipo é o zkRollup geral capaz de executar contratos arbitrários completos de Turing.

A diferença entre esses dois tipos de tecnologia zkRollup reside principalmente em se a plataforma de Camada 2 executa lógica especializada limitada escrita pelo provedor da plataforma ou lógica de contrato inteligente arbitrária escrita pelos usuários em transações.

Em projetos zkRollup não gerais (como o zkSync Lite, que ocupa o 8º lugar na figura acima), os usuários só podem realizar alguns tipos de operações de transação, como transferências de tokens FT (fungíveis), pagamentos, trocas e transferências de tokens NFT (não fungíveis). A lógica de transação para essas operações só pode ser definida e implementada pelos proprietários do projeto.

Através de projetos zkRollup, podemos transferir com taxas muito mais baixas em comparação com a mainnet do Ethereum e obter maior throughput de transação. No entanto, se quisermos experimentar algum contrato interessante na cadeia, não seremos capazes de fazê-lo.

Por que zkRollups especializados não permitem que os usuários implantem e usem seus próprios contratos inteligentes? Isso nos remete à arquitetura de prova do próprio zkRollup.

Para garantir que as transições de estado do L2 estejam corretas e confiáveis, no zkRollup, toda a lógica de transição de estado do L2 precisa ser escrita como circuitos de prova de conhecimento zero e verificada pelos contratos L1. Apenas estados que passam na verificação podem ser aceitos pelo L1 e, por fim, completar o Rollup. Este processo exige que toda a lógica de execução de transações da plataforma zkRollup seja verificada no circuito de prova de conhecimento zero. No entanto, apoiar a execução de lógica de contrato arbitrária em circuitos de prova de conhecimento zero é um desafio (as razões para essa dificuldade serão explicadas posteriormente no texto). Como resultado, os primeiros projetos de zkRollup frequentemente só suportavam um número limitado de transações relativamente simples.

Ser capaz de executar apenas um número fixo de transações simples obviamente não atende às nossas expectativas para zkRollup. Felizmente, a tecnologia zkVM (Máquina Virtual de Conhecimento Zero) resolveu a dificuldade de provar a execução de qualquer código Turing-completo arbitrário dentro de circuitos de prova de conhecimento zero, tornando a plataforma geral zkRollup uma possibilidade. Em seguida, este artigo apresentará os princípios de implementação do zkVM, permitindo que os leitores entendam como essa parte mais central da tecnologia geral zkRollup opera.

Os Princípios de Implementação do zkVM

Antes de apresentar os princípios do zkVM, primeiro forneceremos uma breve introdução à tecnologia de prova de conhecimento zero. Aqui, não precisamos de uma compreensão detalhada dos princípios matemáticos subjacentes das provas de conhecimento zero; é suficiente entender o que as provas de conhecimento zero podem fazer, como são usadas e as limitações impostas por seus circuitos de prova especializados.

Uma Introdução às Provas de Conhecimento Zero

Provas de conhecimento zero em zkRollup servem para provar que as transações da Camada 2 foram executadas corretamente e que o estado da Camada 2 foi atualizado corretamente.

Para alcançar esse propósito, o circuito zkVM precisa provar que qualquer contrato inteligente implantado na Camada 2 foi executado corretamente. Antes de introduzir os princípios do zkVM, precisamos primeiro discutir o papel das provas de conhecimento zero e como elas funcionam.

Por que Provas de Conhecimento Zero São Necessárias

Zero-knowledge proof é um primitivo criptográfico que permite a um comprovante convencer um verificador da correção de uma afirmação sem revelar qualquer informação adicional ao verificador.

Provas de conhecimento zero têm três propriedades principais:

  • Completeness: Se a declaração a ser comprovada for verdadeira, um verificador honesto (ou seja, alguém que segue o protocolo corretamente) será convencido desse fato por um provador honesto.
  • Soundness: Se a declaração a ser provada for falsa, um provador desonesto tem apenas uma chance negligenciável de convencer o verificador honesto de que é verdadeira.
  • Zero-conhecimento: Além da declaração ser verdadeira, o verificador não pode obter nenhuma informação adicional do processo de verificação.

Com a completude das provas de conhecimento zero, quando o provador completa um cálculo complexo, eles podem produzir uma prova que convence o verificador de que os dados de saída obtidos dos dados de entrada são o resultado fornecido pelo executor. A solidez das provas de conhecimento zero garante que quando o executor fornece um resultado errado, eles não podem gerar uma prova válida.

Portanto, com a completude e solidez das provas de conhecimento zero, podemos terceirizar com confiança esses cálculos complexos para outros e verificar, por meio de um processo de verificação relativamente simples, se o cálculo está correto, sem precisar confiar na parte terceirizada.

Além das três propriedades principais das provas de conhecimento zero, o esquema zk-SNARK amplamente utilizado também apresenta a característica de concisão. Isso significa que, para qualquer lógica complexa comprovada usando provas de conhecimento zero, o tamanho da prova gerada e o tempo necessário para verificar a prova são ambos fixos e relativamente pequenos. Isso permite que o zk-Rollup descarregue os cálculos de atualização de estado fora da cadeia e verifique apenas a correção das operações na cadeia, tornando a solução de dimensionamento viável.

O Processo das Provas de Conhecimento Zero

A seguir, este artigo usará o cálculo simples abaixo como exemplo para explicar o processo de provas de conhecimento zero.

c=a²+b+5

Para explicar o aspecto de conhecimento zero nas provas de conhecimento zero, definiremos as variáveis a e c como os valores públicos desta prova de conhecimento zero, com b como a entrada secreta conhecida apenas pelo provador. Como nosso cálculo é muito simples, o verificador pode facilmente deduzir o valor da entrada secreta a partir dos valores públicos. Isso não afeta a propriedade de conhecimento zero do próprio método de prova de conhecimento zero, pois garante apenas que o verificador não pode obter informações sobre a entrada secreta a partir do processo de prova.

Ao provar, o provador primeiro seleciona um valor para a e b respectivamente como entradas e calcula o valor de c. Aqui, definimos a = 3, b = 2, então c = 16. Após completar todos os cálculos, o provador pode gerar uma prova de conhecimento zero para esses valores e operações.

Depois de concluir a prova, o provador fornecerá ao verificador as entradas públicas da prova (ou seja, os valores de a e c) bem como a prova de conhecimento zero.

Ao receber a prova, o verificador pode, validando a prova de conhecimento zero, se convencer de que o provador usou uma entrada secreta b, que torna a fórmula acima verdadeira quando a = 3 e c = 16 (ou seja, os valores de entrada públicos), e não consegue obter nenhuma informação além das entradas públicas (a = 3, c = 16).

A próxima parte do artigo irá introduzir o processo de prova específico. Quando precisamos provar uma computação usando o método de prova de conhecimento zero, primeiro precisamos representar a computação na forma de um circuito aritmético que o algoritmo de prova de conhecimento zero pode aceitar. Circuitos aritméticos são representações de computação completas de Turing. Como o nome sugere, um circuito aritmético é um circuito computacional composto por portões que realizam operações aritméticas. Em nosso exemplo, o resultado da conversão é mostrado na figura. Você pode notar que, além das entradas públicas a e c e da entrada secreta b mencionada, existem dois valores adicionais, d e e. Essas são variáveis intermediárias usadas no processo de computação.

Podemos pensar em cada fio no circuito aritmético como um valor, que poderia ser uma entrada pública, uma entrada secreta ou uma variável intermediária. Após expandir a computação em um circuito aritmético, cada variável intermediária terá seu lugar e será usada no processo de prova. A única diferença entre elas e as entradas é que seus valores não são inseridos diretamente pelo provador, mas determinados por outros valores de entrada no circuito aritmético.

Podemos ver o circuito aritmético como duas partes: uma parte são todos os valores numéricos que aparecem no circuito, e a outra parte são as relações (restrições) entre esses valores. Normalmente nos referimos às entradas públicas no circuito como a declaração (em nosso exemplo, a e c), e todos os outros valores, incluindo as entradas secretas (b) e variáveis intermediárias (d e e), como a testemunha.

De acordo com a lógica do circuito, quando temos as entradas públicas como a declaração e as entradas secretas como a testemunha, podemos calcular todos os valores da testemunha no circuito.

Portanto, o circuito do portão do circuito aritmético também pode ser representado da seguinte forma:

declaração:

a,c

testemunha:

b,d,e

restrição:

d = a * a

e = b + 5

c = d + e

Após a aritmetização do circuito a ser comprovado, o algoritmo de prova de conhecimento zero precisa processar as restrições do circuito e convertê-las na forma exigida pelo algoritmo para a geração e validação das provas. Após o processamento, o circuito produz um VK (Chave de Verificação) de comprimento fixo que não está relacionado ao tamanho do circuito. O verificador pode verificar a prova de conhecimento zero do circuito correspondente por meio da chave de verificação. A chave de verificação é um tanto semelhante a um compromisso com o circuito. Se ocorrerem alterações nas restrições, a chave de verificação correspondente também será alterada.

Nas aplicações reais, os usuários de provas de conhecimento zero precisam escrever a lógica que necessitam no código-fonte do circuito zk e gerar um VK correspondente por meio de auditoria. Este VK é entregue ao verificador. As entradas públicas comprovadas pelo provador, juntamente com a prova gerada, são enviadas, e o verificador pode verificar se essas entradas públicas atendem às restrições. Neste exemplo, o provador pode gerar uma prova com os valores de a, b e c. O verificador pode verificar se a2 + b é igual a C sem realizar esta operação.

Limitações dos Circuitos de Prova de Conhecimento Zero

Embora os circuitos zk sejam completos em Turing e possam representar qualquer computação, devido à necessidade de converter computações para a forma de representação especial de circuitos aritméticos, existem algumas restrições adicionais na escrita de circuitos aritméticos.

Em programas de computador com os quais estamos mais familiarizados, podemos controlar os ramos da execução do programa com instruções if-else. Apenas o ramo selecionado no programa é executado. No entanto, no processo de prova de conhecimento zero, os cálculos são achatados em circuitos e não há conceito de caminhos de execução ou fluxos de controle. Assim, não podemos escolher um ramo específico para executar em um circuito aritmético.

Claro, isso não significa que não podemos usar ramos e seleções em circuitos. Isso apenas significa que, nos circuitos, todos os ramos, selecionados ou não, serão executados e contribuirão para a produção da prova. A seleção de ramos afeta apenas qual resultado do ramo será produzido para a próxima variável.

Tome a seguinte operação como exemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Quando esta operação é convertida em um circuito aritmético, será convertida nas restrições mostradas abaixo. Obviamente, dois novos testemunhos, temp1 e temp2, serão adicionados ao circuito. Além disso, o valor de x+x e o valor de x*x serão ambos calculados.

Ou seja, em um circuito zk, todos os ramos e lógica serão calculados, quer sejam executados ou não.

temp1 = x + x

temp2 = x * x

c = flag temp1 + (1-flag)temp2

Devido a essas limitações, apoiar a seleção condicional em circuitos de prova de conhecimento zero é bastante difícil. Como provar o caminho de execução de uma lógica de contrato inteligente com muitas variações em uma prova de conhecimento zero é um dos principais desafios de uma máquina virtual zk.

Provando a Execução de Qualquer Programa — Provando uma Máquina de Estado Universal em um Circuito


Fonte da imagem

Descrevemos a VM através de um modelo de uma máquina de estados universal. Uma VM é uma máquina de estados que transita estados à medida que as instruções são processadas. Vamos ilustrar como uma máquina virtual é comprovada por um circuito de conhecimento zero com um exemplo de máquina de estados muito simples.

Assumimos que esta máquina de estado universal possui registradores de propósito geral (A e B) e, adicionalmente, um registrador de Contador de Programa que armazena o número de instrução atual.

O estado dos registradores antes de executar a instrução

A figura abaixo mostra o fluxo de trabalho básico de um circuito de prova da máquina virtual ZK:

O Estado 0 pode ser considerado o estado inicial desta máquina virtual antes da execução. O estado inicial, após um total de m instruções, alcança o estado final m. Além do estado inicial, esta máquina virtual possui duas tabelas de entrada regulares:

  • Tabela de Bytecode: Armazena o programa executado na máquina de estado.
  • Tabela de E/S: Armazena todas as entradas e saídas geradas durante a execução da máquina virtual.

Na figura, o processo de execução da enésima instrução é abstraído e exibido à esquerda. O estado da máquina de estados, Estado n, transita para Estado n+1 após a execução da enésima instrução. O mesmo circuito, após m iterações, alcança a execução de m instruções no vm.

Há dois problemas aqui.

Uma questão é como executar diferentes instruções dentro de um circuito fixo? Ao executar o bytecode do contrato, não é possível determinar qual é a enésima instrução que está sendo executada, então a lógica do circuito real aqui não pode ser determinada.

O segundo é como provar se o número de instruções a serem executadas não é m?

Para a primeira pergunta, a solução é implementar a lógica para todas as instruções possíveis no circuito. Em seguida, use um Seletor, com base na instrução, para escolher uma delas como o próximo estado, semelhante ao if-else no circuito especializado mencionado anteriormente.

Para a segunda pergunta, não podemos mudar diretamente o número de instruções no circuito. Isso ocorre porque cada instrução no circuito requer um segmento de circuito independente para implementar. Se o número de instruções aumentar ou diminuir, o circuito mudará e a chave de verificação correspondente também mudará. Isso torna impossível atender aos requisitos para verificar qualquer lógica em um circuito fixo.

Para resolver esse problema, uma instrução noop que não alterará o estado pode ser adicionada ao conjunto de instruções. Portanto, existe um limite máximo para o número de instruções que cada circuito fixo pode executar. O circuito zkVM pode ser visto como um contêiner com um número fixo de slots de instrução. Se mais instruções forem necessárias, um circuito maior é exigido. Na prova real, um circuito de tamanho apropriado pode ser selecionado conforme necessário.

Provando uma Instrução Básica

Aqui estão algumas instruções computacionais básicas como exemplo de como as instruções básicas no circuito são comprovadas:

Fonte da imagem

A figura mostra o fluxograma do circuito de prova de instruções. As fórmulas abaixo são as restrições do circuito para a prova.

Essas duas restrições podem comprovar várias instruções básicas para os registradores de propósito geral A e B listados no canto superior direito. Essas provas podem carregar valores da tabela de entrada ou valores imediatos das instruções nos registradores ou adicionar os valores nos registradores A e B e escrevê-los de volta nos registradores.

A partir desta figura, podemos ver que, para construir restrições para as mudanças de estado, o circuito introduz alguns estados de controle auxiliares:

A lógica computacional entre esses registros auxiliares e registros de propósito geral é implementada pelas fórmulas abaixo. Leitores interessados podem substituir os valores correspondentes nas fórmulas de restrição para verificar. Pode-se ver que com essas duas restrições, instruções básicas de adição aritmética podem ser implementadas. Se forem necessárias mais operações, mais restrições de instrução terão que ser adicionadas.

Retornando ao diagrama do processo básico, podemos considerar o circuito computacional desta seção como uma instrução no processo geral. O Seletor escolherá se o resultado que produz é o próximo estado a ser adotado pela máquina de estados. Os estados auxiliares necessários pelo circuito nesta seção são gerados pela instrução apontada pelo registro PC.

A recuperação de instruções é implementada por um circuito de pesquisa especializado, que pode provar a recuperação de um segmento de dados de uma tabela fixa através de um índice. Portanto, o circuito zkVM pode provar a transição de estado executada pela máquina virtual especificada pelo PC.

Prova de Julgamentos Condicional e Saltos de Fluxo de Controle

A capacidade da máquina de estado de executar lógica complexa depende de instruções condicionais e de salto. Em contratos reais, frequentemente precisamos lidar com lógica que altera o caminho de execução com base em condições, portanto, tais circuitos são necessários.

Deve-se notar aqui que os circuitos zkVM não são módulos que executam de fato a lógica do contrato e calculam os resultados. O que os circuitos zkVM fazem na verdade é provar o processo de cálculo da lógica do contrato. Portanto, ao provar, é necessário preencher o processo de sequência de instruções realmente executadas no circuito, verificar por meio do circuito se as condições para esse salto são atendidas e então provar que o fluxo de instruções executado fez o salto correto.

Primeiro, introduzimos a prova do julgamento de condição:

Tomando o julgamento de se o operando na instrução de índice i é igual a zero como exemplo. Adicionamos um estado auxiliar isZero para o resultado do julgamento. Se o valor julgado for 0, então o valor do estado auxiliar isZero é 1; se o valor julgado for qualquer outro valor que não seja 0, então isZero é 0.

Esse processo é limitado pelas duas fórmulas no diagrama.

A validade deste constrangimento está relacionada com as propriedades matemáticas das curvas elípticas usadas em provas de conhecimento zero. Cada valor num circuito de prova de conhecimento zero é um elemento dentro de um campo finito numa curva elíptica. Se o seu valor não for 0, deve existir um elemento inverso que, quando multiplicado por si próprio, resulta em 1. Usando esta propriedade, com os dois constrangimentos no diagrama, é possível verificar se um valor é zero e convertê-lo num estado auxiliar.

Uma vez que temos este estado auxiliar de condição isZero, podemos prosseguir com a prova das instruções de salto condicional:

Retornando ao diagrama do processo básico, se a instrução atual for uma instrução de salto condicional. Primeiro, realiza uma verificação isZero, determina se a condição de salto é atendida e depois modifica o valor do PC. Após atualizar o valor do PC, a execução da próxima instrução envolve primeiro uma busca com base no PC para encontrar a instrução após o salto.

I/O e Operações Complexas

Ao usar um circuito de prova de máquina de estado geral, para lidar corretamente com transições de estado, é necessário adicionar estados de controle e restrições correspondentes para cada instrução suportada durante uma única transição de estado. O número desses valores de estado e restrições também deve ser multiplicado pelo número de instruções suportadas pelo zkVM. Mesmo que nenhuma operação seja realizada no programa real executado pelo zkVM (todos NOPs), esses valores de estado e verificações de restrição não podem ser omitidos.

Portanto, usar o circuito da máquina de estados geral na primeira metade deste artigo para executar cálculos complexos é muito ineficiente. Se esses métodos forem usados para implementar cálculos complexos, seu desempenho é difícil de aceitar. Além disso, é difícil para o circuito da máquina de estados geral executar instruções complexas ou interagir diretamente com o mundo exterior.

Para resolver esse problema, implementações reais de zkVMs geralmente usam uma combinação de circuitos de máquina de estado geral e circuitos de prova especializados para provar partes do programa separadamente e depois agregar as provas em uma solução.

Fonte da imagem: 1 2

O diagrama à esquerda é a arquitetura de circuito do projeto Scroll, e o diagrama no canto inferior direito é a arquitetura de circuito do Polygon. Ambos empregam uma abordagem semelhante, como mostrado no diagrama no canto superior.

A máquina de estado geral é responsável por provar o controle lógico de execução do programa. Na maioria dos contratos, o tempo de execução real desta parte da lógica é muito pequeno, portanto, provar isso com a ineficiente máquina de estado geral ainda é aceitável em termos de eficiência.

Mais cálculos complexos fixos, como hash, operações de árvore MPT, dados de entrada externos, etc., são comprovados por circuitos especializados.

A máquina de estados gerais e os circuitos de prova especializados interagem usando tabelas de pesquisa. Cada vez que o circuito da máquina de estados chama essas operações, os módulos que geram a testemunha para a prova escreverão os parâmetros de chamada e os resultados do cálculo na tabela de pesquisa. Assim, as chamadas a essas operações no circuito da máquina de estados são simplificadas para uma operação de pesquisa.

A correção de cada chamada e valor de retorno na tabela de pesquisa é restrita e comprovada por um circuito especializado.

Finalmente, as restrições de cópia no circuito conectam o circuito da máquina de estados, circuitos especializados e tabelas de pesquisa, verificando se cada item na tabela de pesquisa é comprovado pelo circuito especializado correspondente, e gerando, em última análise, uma prova para o bloco completo.

O contrato L1 só precisa verificar esta prova agregada para confirmar a correção de todo o processo de execução da máquina virtual.

Conclusão

A tecnologia de prova de conhecimento zero tornou possível provar cálculos de forma simples e rápida, abrindo a porta para a terceirização de processos computacionais em um ambiente sem confiança. Essa tecnologia, quando usada em blockchain, liberta a execução da cadeia, permitindo que o blockchain principal se concentre em questões descentralizadas e de segurança. Mas a característica de circuitos especializados de prova de conhecimento zero para executar apenas lógica fixa limita o potencial das provas de conhecimento zero no blockchain, confinando as capacidades iniciais do zkRollup a alguns tipos de transações.

No entanto, com o desenvolvimento e amadurecimento das máquinas virtuais zk, suportando a execução completa de Turing de contratos inteligentes arbitrários tornou-se possível. O potencial do zkRollup será verdadeiramente liberado, realizando sua visão de quebrar o trilema do blockchain.

Aviso Legal:

  1. Este artigo é reproduzido de [ZAN], Todos os direitos autorais pertencem ao autor original [ZAN e AntChain Open Labs]. Se houver objeções a esta reedição, por favor, entre em contato com o Gate Learnequipe e eles resolverão prontamente.
  2. Aviso de responsabilidade: As opiniões expressas neste artigo são exclusivamente do autor e não constituem qualquer conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. Salvo indicação em contrário, copiar, distribuir ou plagiar os artigos traduzidos é proibido.

Princípio e Arquitetura do zkRollup

Avançado5/7/2024, 1:51:10 AM
Com o desenvolvimento e maturação das máquinas virtuais zk, suportando a execução Turing-completa de contratos inteligentes arbitrários se tornou possível. O potencial do zkRollup será verdadeiramente liberado, realizando sua visão de quebrar o trilema do blockchain.

Uma Visão Geral do Rollup

Rollup é uma categoria de soluções de escalonamento de camada 2 de blockchain. Nos esquemas de Rollup, os operadores do projeto executam uma plataforma de camada 2 relativamente independente sob a cadeia principal expandida (ou seja, Camada 1). Os usuários podem executar contratos ou transferir tokens na plataforma de camada 2.

A segurança da plataforma Layer 2 é garantida pelo blockchain Layer 1 em que se baseia. Quando um novo bloco é gerado na Layer 2, as informações de transação do bloco Layer 2, bem como a raiz de estado pós-transação da Layer 2, são agrupadas como uma transação Rollup e publicadas na cadeia Layer 1. A execução real da transação e as mudanças de estado são processadas na plataforma Layer 2 abaixo da main chain, e a Layer 1 só precisa verificar a correção das transições de estado da Layer 2. Como o custo de verificar a correção das transições de estado é muito menor do que executar essas transações na Layer 1, a Layer 2 pode alcançar uma expansão da plataforma Layer 1. A plataforma Layer 2 pode oferecer maior throughput de transação e menores custos de transação em comparação com a Layer 1, mantendo uma segurança equivalente.

Em comparação com outros esquemas de transação off-chain, os Rollups têm duas características:

  • A disponibilidade de dados de estado para a segunda camada é resolvida armazenando-os na cadeia principal. A plataforma da Camada 2 registra todas as informações de transação ou mudanças completas de estado da Camada 2 em blocos na cadeia principal. Caso o estado da Camada 2 seja perdido, qualquer pessoa pode recuperar o estado perdido a partir das informações armazenadas na cadeia principal.
  • No esquema Rollup, as alterações na raiz do estado da Camada 2 empacotadas e armazenadas na cadeia principal precisam ser verificadas de alguma forma na cadeia principal. Após a verificação, o estado da Camada 2 será bloqueado na cadeia principal da Camada 1. Portanto, sob a condição de um esquema de verificação seguro, a Camada 2 pode desfrutar do mesmo nível de segurança que a Camada 1.

Com base nos métodos de verificação das atualizações de estado da Camada 2 pela cadeia principal, atualmente existem dois principais tipos de soluções tecnológicas Rollup. Um é o Rollup Otimista. Neste tipo de esquema, o contrato da cadeia principal não verifica diretamente o novo estado enviado pela Camada 2. Em vez disso, um período de desafio é preparado para cada novo estado enviado. Uma vez que o Rollup envia todas as informações de transação para a cadeia principal e as torna públicas, qualquer pessoa pode verificar a atualização de estado (especialmente quando a atualização envolve sua própria carteira). Se o novo estado estiver incorreto, um verificador pode gerar uma prova de fraude contra esse estado errôneo e enviá-la dentro do período de desafio, invalidando assim a atualização de estado incorreta.

Outro tipo de solução Rollup é zk Rollup. Neste tipo de esquema, após a execução da atualização do estado da Camada 2, o operador da Camada 2 deve fornecer uma prova de conhecimento zero da correção da atualização do estado e submetê-la à cadeia principal juntamente com a atualização do estado. O contrato na cadeia principal verificará a prova para determinar a correção da atualização do estado.

Em comparação com o esquema Optimistic Rollup, o zk Rollup não requer um longo período de desafio para finalmente confirmar transações da Camada 2 e pode ser confirmado mais rapidamente. Além disso, o zk Rollup não depende da suposição de que sempre haverá verificadores honestos na rede que enviarão atempadamente provas de fraude quando ocorrer fraude. No entanto, ao mesmo tempo, o zk Rollup também enfrenta problemas como o alto custo computacional da tecnologia de prova de conhecimento zero, complexidade e dificuldade no desenvolvimento, que impedem a implementação prática da tecnologia zk Rollup em Rollups. Com o desenvolvimento adicional da tecnologia de prova de conhecimento zero nos últimos dois anos, esses obstáculos estão sendo gradualmente superados. A tecnologia zk Rollup está começando a ocupar uma parcela cada vez maior do mercado da Camada 2.

Conforme mostrado na figura abaixo, dentro do campo de escalonamento da camada Rollup-2, o zkRollup já ocupa mais da metade do território e está se desenvolvendo rapidamente.

Fonte da imagem

Dados obtidos em: 18 de janeiro de 2024

Do zkRollup Especializado para zkRollup Geral

Durante seu desenvolvimento, zkRollup passou principalmente por duas etapas. O primeiro tipo é o zkRollup não-geral, enquanto o segundo tipo é o zkRollup geral capaz de executar contratos arbitrários completos de Turing.

A diferença entre esses dois tipos de tecnologia zkRollup reside principalmente em se a plataforma de Camada 2 executa lógica especializada limitada escrita pelo provedor da plataforma ou lógica de contrato inteligente arbitrária escrita pelos usuários em transações.

Em projetos zkRollup não gerais (como o zkSync Lite, que ocupa o 8º lugar na figura acima), os usuários só podem realizar alguns tipos de operações de transação, como transferências de tokens FT (fungíveis), pagamentos, trocas e transferências de tokens NFT (não fungíveis). A lógica de transação para essas operações só pode ser definida e implementada pelos proprietários do projeto.

Através de projetos zkRollup, podemos transferir com taxas muito mais baixas em comparação com a mainnet do Ethereum e obter maior throughput de transação. No entanto, se quisermos experimentar algum contrato interessante na cadeia, não seremos capazes de fazê-lo.

Por que zkRollups especializados não permitem que os usuários implantem e usem seus próprios contratos inteligentes? Isso nos remete à arquitetura de prova do próprio zkRollup.

Para garantir que as transições de estado do L2 estejam corretas e confiáveis, no zkRollup, toda a lógica de transição de estado do L2 precisa ser escrita como circuitos de prova de conhecimento zero e verificada pelos contratos L1. Apenas estados que passam na verificação podem ser aceitos pelo L1 e, por fim, completar o Rollup. Este processo exige que toda a lógica de execução de transações da plataforma zkRollup seja verificada no circuito de prova de conhecimento zero. No entanto, apoiar a execução de lógica de contrato arbitrária em circuitos de prova de conhecimento zero é um desafio (as razões para essa dificuldade serão explicadas posteriormente no texto). Como resultado, os primeiros projetos de zkRollup frequentemente só suportavam um número limitado de transações relativamente simples.

Ser capaz de executar apenas um número fixo de transações simples obviamente não atende às nossas expectativas para zkRollup. Felizmente, a tecnologia zkVM (Máquina Virtual de Conhecimento Zero) resolveu a dificuldade de provar a execução de qualquer código Turing-completo arbitrário dentro de circuitos de prova de conhecimento zero, tornando a plataforma geral zkRollup uma possibilidade. Em seguida, este artigo apresentará os princípios de implementação do zkVM, permitindo que os leitores entendam como essa parte mais central da tecnologia geral zkRollup opera.

Os Princípios de Implementação do zkVM

Antes de apresentar os princípios do zkVM, primeiro forneceremos uma breve introdução à tecnologia de prova de conhecimento zero. Aqui, não precisamos de uma compreensão detalhada dos princípios matemáticos subjacentes das provas de conhecimento zero; é suficiente entender o que as provas de conhecimento zero podem fazer, como são usadas e as limitações impostas por seus circuitos de prova especializados.

Uma Introdução às Provas de Conhecimento Zero

Provas de conhecimento zero em zkRollup servem para provar que as transações da Camada 2 foram executadas corretamente e que o estado da Camada 2 foi atualizado corretamente.

Para alcançar esse propósito, o circuito zkVM precisa provar que qualquer contrato inteligente implantado na Camada 2 foi executado corretamente. Antes de introduzir os princípios do zkVM, precisamos primeiro discutir o papel das provas de conhecimento zero e como elas funcionam.

Por que Provas de Conhecimento Zero São Necessárias

Zero-knowledge proof é um primitivo criptográfico que permite a um comprovante convencer um verificador da correção de uma afirmação sem revelar qualquer informação adicional ao verificador.

Provas de conhecimento zero têm três propriedades principais:

  • Completeness: Se a declaração a ser comprovada for verdadeira, um verificador honesto (ou seja, alguém que segue o protocolo corretamente) será convencido desse fato por um provador honesto.
  • Soundness: Se a declaração a ser provada for falsa, um provador desonesto tem apenas uma chance negligenciável de convencer o verificador honesto de que é verdadeira.
  • Zero-conhecimento: Além da declaração ser verdadeira, o verificador não pode obter nenhuma informação adicional do processo de verificação.

Com a completude das provas de conhecimento zero, quando o provador completa um cálculo complexo, eles podem produzir uma prova que convence o verificador de que os dados de saída obtidos dos dados de entrada são o resultado fornecido pelo executor. A solidez das provas de conhecimento zero garante que quando o executor fornece um resultado errado, eles não podem gerar uma prova válida.

Portanto, com a completude e solidez das provas de conhecimento zero, podemos terceirizar com confiança esses cálculos complexos para outros e verificar, por meio de um processo de verificação relativamente simples, se o cálculo está correto, sem precisar confiar na parte terceirizada.

Além das três propriedades principais das provas de conhecimento zero, o esquema zk-SNARK amplamente utilizado também apresenta a característica de concisão. Isso significa que, para qualquer lógica complexa comprovada usando provas de conhecimento zero, o tamanho da prova gerada e o tempo necessário para verificar a prova são ambos fixos e relativamente pequenos. Isso permite que o zk-Rollup descarregue os cálculos de atualização de estado fora da cadeia e verifique apenas a correção das operações na cadeia, tornando a solução de dimensionamento viável.

O Processo das Provas de Conhecimento Zero

A seguir, este artigo usará o cálculo simples abaixo como exemplo para explicar o processo de provas de conhecimento zero.

c=a²+b+5

Para explicar o aspecto de conhecimento zero nas provas de conhecimento zero, definiremos as variáveis a e c como os valores públicos desta prova de conhecimento zero, com b como a entrada secreta conhecida apenas pelo provador. Como nosso cálculo é muito simples, o verificador pode facilmente deduzir o valor da entrada secreta a partir dos valores públicos. Isso não afeta a propriedade de conhecimento zero do próprio método de prova de conhecimento zero, pois garante apenas que o verificador não pode obter informações sobre a entrada secreta a partir do processo de prova.

Ao provar, o provador primeiro seleciona um valor para a e b respectivamente como entradas e calcula o valor de c. Aqui, definimos a = 3, b = 2, então c = 16. Após completar todos os cálculos, o provador pode gerar uma prova de conhecimento zero para esses valores e operações.

Depois de concluir a prova, o provador fornecerá ao verificador as entradas públicas da prova (ou seja, os valores de a e c) bem como a prova de conhecimento zero.

Ao receber a prova, o verificador pode, validando a prova de conhecimento zero, se convencer de que o provador usou uma entrada secreta b, que torna a fórmula acima verdadeira quando a = 3 e c = 16 (ou seja, os valores de entrada públicos), e não consegue obter nenhuma informação além das entradas públicas (a = 3, c = 16).

A próxima parte do artigo irá introduzir o processo de prova específico. Quando precisamos provar uma computação usando o método de prova de conhecimento zero, primeiro precisamos representar a computação na forma de um circuito aritmético que o algoritmo de prova de conhecimento zero pode aceitar. Circuitos aritméticos são representações de computação completas de Turing. Como o nome sugere, um circuito aritmético é um circuito computacional composto por portões que realizam operações aritméticas. Em nosso exemplo, o resultado da conversão é mostrado na figura. Você pode notar que, além das entradas públicas a e c e da entrada secreta b mencionada, existem dois valores adicionais, d e e. Essas são variáveis intermediárias usadas no processo de computação.

Podemos pensar em cada fio no circuito aritmético como um valor, que poderia ser uma entrada pública, uma entrada secreta ou uma variável intermediária. Após expandir a computação em um circuito aritmético, cada variável intermediária terá seu lugar e será usada no processo de prova. A única diferença entre elas e as entradas é que seus valores não são inseridos diretamente pelo provador, mas determinados por outros valores de entrada no circuito aritmético.

Podemos ver o circuito aritmético como duas partes: uma parte são todos os valores numéricos que aparecem no circuito, e a outra parte são as relações (restrições) entre esses valores. Normalmente nos referimos às entradas públicas no circuito como a declaração (em nosso exemplo, a e c), e todos os outros valores, incluindo as entradas secretas (b) e variáveis intermediárias (d e e), como a testemunha.

De acordo com a lógica do circuito, quando temos as entradas públicas como a declaração e as entradas secretas como a testemunha, podemos calcular todos os valores da testemunha no circuito.

Portanto, o circuito do portão do circuito aritmético também pode ser representado da seguinte forma:

declaração:

a,c

testemunha:

b,d,e

restrição:

d = a * a

e = b + 5

c = d + e

Após a aritmetização do circuito a ser comprovado, o algoritmo de prova de conhecimento zero precisa processar as restrições do circuito e convertê-las na forma exigida pelo algoritmo para a geração e validação das provas. Após o processamento, o circuito produz um VK (Chave de Verificação) de comprimento fixo que não está relacionado ao tamanho do circuito. O verificador pode verificar a prova de conhecimento zero do circuito correspondente por meio da chave de verificação. A chave de verificação é um tanto semelhante a um compromisso com o circuito. Se ocorrerem alterações nas restrições, a chave de verificação correspondente também será alterada.

Nas aplicações reais, os usuários de provas de conhecimento zero precisam escrever a lógica que necessitam no código-fonte do circuito zk e gerar um VK correspondente por meio de auditoria. Este VK é entregue ao verificador. As entradas públicas comprovadas pelo provador, juntamente com a prova gerada, são enviadas, e o verificador pode verificar se essas entradas públicas atendem às restrições. Neste exemplo, o provador pode gerar uma prova com os valores de a, b e c. O verificador pode verificar se a2 + b é igual a C sem realizar esta operação.

Limitações dos Circuitos de Prova de Conhecimento Zero

Embora os circuitos zk sejam completos em Turing e possam representar qualquer computação, devido à necessidade de converter computações para a forma de representação especial de circuitos aritméticos, existem algumas restrições adicionais na escrita de circuitos aritméticos.

Em programas de computador com os quais estamos mais familiarizados, podemos controlar os ramos da execução do programa com instruções if-else. Apenas o ramo selecionado no programa é executado. No entanto, no processo de prova de conhecimento zero, os cálculos são achatados em circuitos e não há conceito de caminhos de execução ou fluxos de controle. Assim, não podemos escolher um ramo específico para executar em um circuito aritmético.

Claro, isso não significa que não podemos usar ramos e seleções em circuitos. Isso apenas significa que, nos circuitos, todos os ramos, selecionados ou não, serão executados e contribuirão para a produção da prova. A seleção de ramos afeta apenas qual resultado do ramo será produzido para a próxima variável.

Tome a seguinte operação como exemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Quando esta operação é convertida em um circuito aritmético, será convertida nas restrições mostradas abaixo. Obviamente, dois novos testemunhos, temp1 e temp2, serão adicionados ao circuito. Além disso, o valor de x+x e o valor de x*x serão ambos calculados.

Ou seja, em um circuito zk, todos os ramos e lógica serão calculados, quer sejam executados ou não.

temp1 = x + x

temp2 = x * x

c = flag temp1 + (1-flag)temp2

Devido a essas limitações, apoiar a seleção condicional em circuitos de prova de conhecimento zero é bastante difícil. Como provar o caminho de execução de uma lógica de contrato inteligente com muitas variações em uma prova de conhecimento zero é um dos principais desafios de uma máquina virtual zk.

Provando a Execução de Qualquer Programa — Provando uma Máquina de Estado Universal em um Circuito


Fonte da imagem

Descrevemos a VM através de um modelo de uma máquina de estados universal. Uma VM é uma máquina de estados que transita estados à medida que as instruções são processadas. Vamos ilustrar como uma máquina virtual é comprovada por um circuito de conhecimento zero com um exemplo de máquina de estados muito simples.

Assumimos que esta máquina de estado universal possui registradores de propósito geral (A e B) e, adicionalmente, um registrador de Contador de Programa que armazena o número de instrução atual.

O estado dos registradores antes de executar a instrução

A figura abaixo mostra o fluxo de trabalho básico de um circuito de prova da máquina virtual ZK:

O Estado 0 pode ser considerado o estado inicial desta máquina virtual antes da execução. O estado inicial, após um total de m instruções, alcança o estado final m. Além do estado inicial, esta máquina virtual possui duas tabelas de entrada regulares:

  • Tabela de Bytecode: Armazena o programa executado na máquina de estado.
  • Tabela de E/S: Armazena todas as entradas e saídas geradas durante a execução da máquina virtual.

Na figura, o processo de execução da enésima instrução é abstraído e exibido à esquerda. O estado da máquina de estados, Estado n, transita para Estado n+1 após a execução da enésima instrução. O mesmo circuito, após m iterações, alcança a execução de m instruções no vm.

Há dois problemas aqui.

Uma questão é como executar diferentes instruções dentro de um circuito fixo? Ao executar o bytecode do contrato, não é possível determinar qual é a enésima instrução que está sendo executada, então a lógica do circuito real aqui não pode ser determinada.

O segundo é como provar se o número de instruções a serem executadas não é m?

Para a primeira pergunta, a solução é implementar a lógica para todas as instruções possíveis no circuito. Em seguida, use um Seletor, com base na instrução, para escolher uma delas como o próximo estado, semelhante ao if-else no circuito especializado mencionado anteriormente.

Para a segunda pergunta, não podemos mudar diretamente o número de instruções no circuito. Isso ocorre porque cada instrução no circuito requer um segmento de circuito independente para implementar. Se o número de instruções aumentar ou diminuir, o circuito mudará e a chave de verificação correspondente também mudará. Isso torna impossível atender aos requisitos para verificar qualquer lógica em um circuito fixo.

Para resolver esse problema, uma instrução noop que não alterará o estado pode ser adicionada ao conjunto de instruções. Portanto, existe um limite máximo para o número de instruções que cada circuito fixo pode executar. O circuito zkVM pode ser visto como um contêiner com um número fixo de slots de instrução. Se mais instruções forem necessárias, um circuito maior é exigido. Na prova real, um circuito de tamanho apropriado pode ser selecionado conforme necessário.

Provando uma Instrução Básica

Aqui estão algumas instruções computacionais básicas como exemplo de como as instruções básicas no circuito são comprovadas:

Fonte da imagem

A figura mostra o fluxograma do circuito de prova de instruções. As fórmulas abaixo são as restrições do circuito para a prova.

Essas duas restrições podem comprovar várias instruções básicas para os registradores de propósito geral A e B listados no canto superior direito. Essas provas podem carregar valores da tabela de entrada ou valores imediatos das instruções nos registradores ou adicionar os valores nos registradores A e B e escrevê-los de volta nos registradores.

A partir desta figura, podemos ver que, para construir restrições para as mudanças de estado, o circuito introduz alguns estados de controle auxiliares:

A lógica computacional entre esses registros auxiliares e registros de propósito geral é implementada pelas fórmulas abaixo. Leitores interessados podem substituir os valores correspondentes nas fórmulas de restrição para verificar. Pode-se ver que com essas duas restrições, instruções básicas de adição aritmética podem ser implementadas. Se forem necessárias mais operações, mais restrições de instrução terão que ser adicionadas.

Retornando ao diagrama do processo básico, podemos considerar o circuito computacional desta seção como uma instrução no processo geral. O Seletor escolherá se o resultado que produz é o próximo estado a ser adotado pela máquina de estados. Os estados auxiliares necessários pelo circuito nesta seção são gerados pela instrução apontada pelo registro PC.

A recuperação de instruções é implementada por um circuito de pesquisa especializado, que pode provar a recuperação de um segmento de dados de uma tabela fixa através de um índice. Portanto, o circuito zkVM pode provar a transição de estado executada pela máquina virtual especificada pelo PC.

Prova de Julgamentos Condicional e Saltos de Fluxo de Controle

A capacidade da máquina de estado de executar lógica complexa depende de instruções condicionais e de salto. Em contratos reais, frequentemente precisamos lidar com lógica que altera o caminho de execução com base em condições, portanto, tais circuitos são necessários.

Deve-se notar aqui que os circuitos zkVM não são módulos que executam de fato a lógica do contrato e calculam os resultados. O que os circuitos zkVM fazem na verdade é provar o processo de cálculo da lógica do contrato. Portanto, ao provar, é necessário preencher o processo de sequência de instruções realmente executadas no circuito, verificar por meio do circuito se as condições para esse salto são atendidas e então provar que o fluxo de instruções executado fez o salto correto.

Primeiro, introduzimos a prova do julgamento de condição:

Tomando o julgamento de se o operando na instrução de índice i é igual a zero como exemplo. Adicionamos um estado auxiliar isZero para o resultado do julgamento. Se o valor julgado for 0, então o valor do estado auxiliar isZero é 1; se o valor julgado for qualquer outro valor que não seja 0, então isZero é 0.

Esse processo é limitado pelas duas fórmulas no diagrama.

A validade deste constrangimento está relacionada com as propriedades matemáticas das curvas elípticas usadas em provas de conhecimento zero. Cada valor num circuito de prova de conhecimento zero é um elemento dentro de um campo finito numa curva elíptica. Se o seu valor não for 0, deve existir um elemento inverso que, quando multiplicado por si próprio, resulta em 1. Usando esta propriedade, com os dois constrangimentos no diagrama, é possível verificar se um valor é zero e convertê-lo num estado auxiliar.

Uma vez que temos este estado auxiliar de condição isZero, podemos prosseguir com a prova das instruções de salto condicional:

Retornando ao diagrama do processo básico, se a instrução atual for uma instrução de salto condicional. Primeiro, realiza uma verificação isZero, determina se a condição de salto é atendida e depois modifica o valor do PC. Após atualizar o valor do PC, a execução da próxima instrução envolve primeiro uma busca com base no PC para encontrar a instrução após o salto.

I/O e Operações Complexas

Ao usar um circuito de prova de máquina de estado geral, para lidar corretamente com transições de estado, é necessário adicionar estados de controle e restrições correspondentes para cada instrução suportada durante uma única transição de estado. O número desses valores de estado e restrições também deve ser multiplicado pelo número de instruções suportadas pelo zkVM. Mesmo que nenhuma operação seja realizada no programa real executado pelo zkVM (todos NOPs), esses valores de estado e verificações de restrição não podem ser omitidos.

Portanto, usar o circuito da máquina de estados geral na primeira metade deste artigo para executar cálculos complexos é muito ineficiente. Se esses métodos forem usados para implementar cálculos complexos, seu desempenho é difícil de aceitar. Além disso, é difícil para o circuito da máquina de estados geral executar instruções complexas ou interagir diretamente com o mundo exterior.

Para resolver esse problema, implementações reais de zkVMs geralmente usam uma combinação de circuitos de máquina de estado geral e circuitos de prova especializados para provar partes do programa separadamente e depois agregar as provas em uma solução.

Fonte da imagem: 1 2

O diagrama à esquerda é a arquitetura de circuito do projeto Scroll, e o diagrama no canto inferior direito é a arquitetura de circuito do Polygon. Ambos empregam uma abordagem semelhante, como mostrado no diagrama no canto superior.

A máquina de estado geral é responsável por provar o controle lógico de execução do programa. Na maioria dos contratos, o tempo de execução real desta parte da lógica é muito pequeno, portanto, provar isso com a ineficiente máquina de estado geral ainda é aceitável em termos de eficiência.

Mais cálculos complexos fixos, como hash, operações de árvore MPT, dados de entrada externos, etc., são comprovados por circuitos especializados.

A máquina de estados gerais e os circuitos de prova especializados interagem usando tabelas de pesquisa. Cada vez que o circuito da máquina de estados chama essas operações, os módulos que geram a testemunha para a prova escreverão os parâmetros de chamada e os resultados do cálculo na tabela de pesquisa. Assim, as chamadas a essas operações no circuito da máquina de estados são simplificadas para uma operação de pesquisa.

A correção de cada chamada e valor de retorno na tabela de pesquisa é restrita e comprovada por um circuito especializado.

Finalmente, as restrições de cópia no circuito conectam o circuito da máquina de estados, circuitos especializados e tabelas de pesquisa, verificando se cada item na tabela de pesquisa é comprovado pelo circuito especializado correspondente, e gerando, em última análise, uma prova para o bloco completo.

O contrato L1 só precisa verificar esta prova agregada para confirmar a correção de todo o processo de execução da máquina virtual.

Conclusão

A tecnologia de prova de conhecimento zero tornou possível provar cálculos de forma simples e rápida, abrindo a porta para a terceirização de processos computacionais em um ambiente sem confiança. Essa tecnologia, quando usada em blockchain, liberta a execução da cadeia, permitindo que o blockchain principal se concentre em questões descentralizadas e de segurança. Mas a característica de circuitos especializados de prova de conhecimento zero para executar apenas lógica fixa limita o potencial das provas de conhecimento zero no blockchain, confinando as capacidades iniciais do zkRollup a alguns tipos de transações.

No entanto, com o desenvolvimento e amadurecimento das máquinas virtuais zk, suportando a execução completa de Turing de contratos inteligentes arbitrários tornou-se possível. O potencial do zkRollup será verdadeiramente liberado, realizando sua visão de quebrar o trilema do blockchain.

Aviso Legal:

  1. Este artigo é reproduzido de [ZAN], Todos os direitos autorais pertencem ao autor original [ZAN e AntChain Open Labs]. Se houver objeções a esta reedição, por favor, entre em contato com o Gate Learnequipe e eles resolverão prontamente.
  2. Aviso de responsabilidade: As opiniões expressas neste artigo são exclusivamente do autor e não constituem qualquer conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. Salvo indicação em contrário, copiar, distribuir ou plagiar os artigos traduzidos é proibido.
เริ่มตอนนี้
สมัครและรับรางวัล
$100