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 tornou-se possível. O potencial do zkRollup será verdadeiramente desencadeado, realizando a 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 Rollup, os operadores do projeto executam uma plataforma Layer 2 relativamente independente sob a cadeia principal expandida (ou seja, camada 1). Os usuários podem executar contratos ou transferir tokens na plataforma Layer 2.

A segurança da plataforma Layer 2 é garantida pela blockchain Layer 1 em que se baseia. Quando um novo bloco é gerado na Layer 2, a informação da transação do bloco Layer 2, bem como a raiz do estado pós-transação da Layer 2, são agrupadas como uma transação de Rollup e publicadas na cadeia Layer 1. A execução real da transação e as alterações de estado são processadas na plataforma Layer 2 abaixo da cadeia principal, 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 uma maior taxa de transações e menores custos de transação em comparação com a Layer 1, mantendo uma segurança equivalente.

Comparados com outros esquemas de transação fora da cadeia, os Rollups têm duas características:

  • A disponibilidade de dados do estado para a segunda camada é resolvida armazenando-os na cadeia principal. A plataforma da Camada 2 regista todas as informações de transação ou alterações completas do estado da Camada 2 em blocos na cadeia principal. Se o estado da Camada 2 for perdido, qualquer pessoa pode recuperar o estado em falta a partir das informações armazenadas na cadeia principal.
  • No esquema Rollup, as alterações da raiz do estado da Camada 2 empacotadas e armazenadas na cadeia principal precisam de 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, existem atualmente dois tipos principais de soluções tecnológicas Rollup. Um é Rollup Otimista. Neste tipo de esquema, o contrato da cadeia principal não verifica diretamente o novo estado submetido pela Camada 2. Em vez disso, é preparado um período de desafio para cada novo estado submetido. Como o Rollup submete todas as informações de transação à 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 submetê-lo dentro do período de desafio, invalidando assim a atualização de estado incorreta.

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

Comparado ao esquema de 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 prontamente provas de fraude quando ocorrer fraude. No entanto, ao mesmo tempo, o zk Rollup também enfrenta questões como o alto custo computacional da tecnologia de prova de conhecimento zero, complexidade e dificuldade no desenvolvimento, que dificultam 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 gradualmente sendo superados. A tecnologia zk Rollup está começando a ocupar uma parcela cada vez maior do mercado da Camada 2.

Como mostrado na figura abaixo, dentro do campo de dimensionamento da camada Rollup layer-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 o seu desenvolvimento, o zkRollup passou principalmente por duas fases. 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 saber se a plataforma de Camada 2 executa lógica especializada limitada escrita pelo fornecedor da plataforma ou lógica de contrato inteligente arbitrária escrita pelos utilizadores em transações.

Em projetos de zkRollup não gerais (como o zkSync Lite, que ocupa o 8º lugar na figura acima), os utilizadores apenas podem realizar alguns tipos de operações de transação, como transferências de FT (token fungível), pagamentos, trocas e transferências de NFT (token não fungível). 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 Ethereum e obter uma maior taxa de transações. No entanto, se quisermos experimentar algum contrato interessante na cadeia, não seremos capazes de o fazer.

Porque é que os zkRollups especializados não permitem que os utilizadores implementem e usem os seus próprios contratos inteligentes? Isto faz-nos regressar à 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 do L1. Apenas os estados que passam na verificação podem ser aceites pelo L1 e, em última análise, completar o Rollup. Este processo requer 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 contratos arbitrária em circuitos de prova de conhecimento zero é um desafio (as razões para esta dificuldade serão explicadas mais tarde no texto). Como resultado, os projetos iniciais de zkRollup muitas vezes apenas 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 Zero-Conhecimento) resolveu a dificuldade de provar a execução de qualquer código arbitrário Turing-completo dentro de circuitos de prova de conhecimento zero, tornando possível a plataforma geral zkRollup. A seguir, este artigo irá introduzir os princípios de implementação do zkVM, permitindo que os leitores compreendam como esta parte mais central da tecnologia geral zkRollup opera.

Os Princípios de Implementação do zkVM

Antes de introduzir os princípios do zkVM, forneceremos primeiro 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 pelos 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 este 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.

Porque são necessárias Provas de Conhecimento Zero

A prova de conhecimento zero é uma primitiva criptográfica que permite a um provador convencer um verificador da correção de uma declaração sem revelar qualquer informação adicional ao verificador.

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

  • Completude: Se a declaração a ser provada for verdadeira, um verificador honesto (ou seja, alguém que siga o protocolo corretamente) será convencido desse fato por um provador honesto.
  • Solidez: 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-knowledge: Para além da declaração ser verdadeira, o verificador não pode obter qualquer informação adicional a partir 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 a partir 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 incorreto, eles não podem gerar uma prova válida.

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

Para além das três propriedades essenciais das provas de conhecimento zero, o esquema zk-SNARK amplamente utilizado também tem a característica da concisão. Isto significa que, para qualquer lógica complexa que seja 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. Isto permite ao zk-Rollup descarregar cálculos de atualização de estado fora da cadeia e apenas verificar a correção das operações na cadeia, tornando a solução de escalonamento exequí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, vamos definir 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 o 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 apenas garante que o verificador não pode obter informações sobre a entrada secreta a partir do processo de prova.

Ao provar, o provador seleciona primeiro um valor para a e b, respetivamente, 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 estes valores e operações.

Após concluir a prova, o provador dará 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, ao validar a prova de conhecimento zero, ser convencido 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 é capaz de obter qualquer 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. Os circuitos aritméticos são representações de computação Turing-completas. Como o nome indica, um circuito aritmético é um circuito computacional composto por portas 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 que mencionamos, há dois valores adicionais, d e e. Estes 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á o seu lugar e será usada no processo de prova. A única diferença entre elas e as entradas é que os 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 referimo-nos às entradas públicas no circuito como a declaração (no nosso exemplo, a e c), e todos os outros valores, incluindo as entradas secretas (b) e variáveis intermédias (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 na seguinte forma:

declaração:

a,c

testemunha:

b,d,e

restrição:

d = a * a

e = b + 5

c = d + e

Depois de aritmetizar o circuito a ser comprovado, o algoritmo de prova de conhecimento zero precisa processar as restrições do circuito e convertê-las na forma necessária pelo algoritmo para a geração e validação das provas. Depois do processamento, o circuito produz uma VK (Chave de Verificação) de comprimento fixo que não está relacionada com o tamanho do circuito. O verificador pode verificar a prova de conhecimento zero do circuito correspondente através da chave de verificação. A chave de verificação é algo similar a um compromisso com o circuito. Se ocorrerem quaisquer alterações nas restrições, a chave de verificação correspondente também mudará.

Nas aplicações reais, os utilizadores de provas de conhecimento zero precisam de escrever a lógica necessária no código-fonte do circuito zk e gerar um VK correspondente através de auditoria. Este VK é entregue ao verificador. As entradas públicas provadas pelo provador, juntamente com a prova gerada, são submetidas, e o verificador pode verificar se estas entradas públicas cumprem as 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 Turing-completos e possam representar qualquer computação, devido à necessidade de converter computações na 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 declaraçõ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 que isto não significa que não podemos usar ramos e seleções em circuitos. Apenas significa que, nos circuitos, todos os ramos, quer sejam selecionados ou não, serão executados e contribuirão para a produção da prova. A seleção de ramos apenas afeta qual resultado do ramo será output para a próxima variável.

Tomemos a seguinte operação como exemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Quando esta operação é convertida num 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.

Isto é, num circuito zk, todos os ramos e lógica serão calculados, quer sejam executados ou não.

temp1 = x + x

temp2 = x * x

c = bandeira 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.

Prova da Execução de Qualquer Programa — Provar uma Máquina de Estado Universal num 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 estados universal possui registos de propósito geral (A e B) e, adicionalmente, um registo de Contador de Programa que armazena o número de instrução atual.

O estado dos registos 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 de ser executada. O estado inicial, após um total de m instruções, atinge 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 estados.
  • 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 o 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 na vm.

Existem dois problemas aqui.

Uma é 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á a ser executada, por isso a lógica real do circuito 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, usar 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 alterar diretamente o número de instruções no circuito. Isto acontece 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 irá mudar e a chave de verificação correspondente também irá mudar. Isso torna impossível atender aos requisitos para verificar qualquer lógica em um circuito fixo.

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

Provar 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:

Origem da imagem

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

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

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

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

Voltando ao diagrama do processo básico, podemos considerar o circuito computacional nesta seção como uma instrução no processo geral. O Seletor escolherá se o resultado que ele 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.

Provar Julgamentos Condicional e Saltos de Fluxo de Controlo

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

Deve ser notado aqui que os circuitos zkVM não são módulos que executam realmente a lógica do contrato e calculam resultados. O que os circuitos zkVM fazem na realidade é 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 executado no circuito, verificar através do circuito se as condições para este salto são cumpridas e depois provar que o fluxo de instruções executado fez o salto correto.

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

Tomando o julgamento de se o operando na instrução 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.

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

A validade desta restrição 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 as duas restrições no diagrama, é possível verificar se um valor é zero e convertê-lo num estado auxiliar.

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

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

I/O and Operações Complexas

Ao usar um circuito de prova de máquina de estado geral, para lidar corretamente com as transições de estado, é necessário adicionar estados de controle correspondentes e restrições 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 os NOPs), esses valores de estado e verificações de restrição não podem ser omitidos.

Portanto, usar o circuito de máquina de estado 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 de máquina de estado geral executar instruções complexas ou interagir diretamente com o mundo exterior.

Para resolver este problema, as implementações reais de zkVMs normalmente 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 numa solução única.

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 controlo lógico de execução do programa. Na maioria dos contratos, o tempo de execução real desta parte da lógica é muito pequeno, por isso prová-lo com a máquina de estado geral ineficiente 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 estado geral e os circuitos de prova especializados interagem usando tabelas de pesquisa. Sempre que o circuito da máquina de estado 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 estado 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, por fim, gerando 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 num ambiente sem confiança. Esta tecnologia, quando utilizada em blockchain, liberta a execução da cadeia, permitindo que a blockchain principal se concentre em questões descentralizadas e de segurança. No entanto, a característica dos circuitos especializados de prova de conhecimento zero para executar apenas lógica fixa limita o potencial das provas de conhecimento zero em 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 desencadeado, 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 reimpressão, entre em contato com o Gate Learnequipa e eles irão tratar disso prontamente.
  2. Responsabilidade Legal: 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, é proibido copiar, distribuir ou plagiar os artigos traduzidos.

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 tornou-se possível. O potencial do zkRollup será verdadeiramente desencadeado, realizando a 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 Rollup, os operadores do projeto executam uma plataforma Layer 2 relativamente independente sob a cadeia principal expandida (ou seja, camada 1). Os usuários podem executar contratos ou transferir tokens na plataforma Layer 2.

A segurança da plataforma Layer 2 é garantida pela blockchain Layer 1 em que se baseia. Quando um novo bloco é gerado na Layer 2, a informação da transação do bloco Layer 2, bem como a raiz do estado pós-transação da Layer 2, são agrupadas como uma transação de Rollup e publicadas na cadeia Layer 1. A execução real da transação e as alterações de estado são processadas na plataforma Layer 2 abaixo da cadeia principal, 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 uma maior taxa de transações e menores custos de transação em comparação com a Layer 1, mantendo uma segurança equivalente.

Comparados com outros esquemas de transação fora da cadeia, os Rollups têm duas características:

  • A disponibilidade de dados do estado para a segunda camada é resolvida armazenando-os na cadeia principal. A plataforma da Camada 2 regista todas as informações de transação ou alterações completas do estado da Camada 2 em blocos na cadeia principal. Se o estado da Camada 2 for perdido, qualquer pessoa pode recuperar o estado em falta a partir das informações armazenadas na cadeia principal.
  • No esquema Rollup, as alterações da raiz do estado da Camada 2 empacotadas e armazenadas na cadeia principal precisam de 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, existem atualmente dois tipos principais de soluções tecnológicas Rollup. Um é Rollup Otimista. Neste tipo de esquema, o contrato da cadeia principal não verifica diretamente o novo estado submetido pela Camada 2. Em vez disso, é preparado um período de desafio para cada novo estado submetido. Como o Rollup submete todas as informações de transação à 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 submetê-lo dentro do período de desafio, invalidando assim a atualização de estado incorreta.

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

Comparado ao esquema de 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 prontamente provas de fraude quando ocorrer fraude. No entanto, ao mesmo tempo, o zk Rollup também enfrenta questões como o alto custo computacional da tecnologia de prova de conhecimento zero, complexidade e dificuldade no desenvolvimento, que dificultam 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 gradualmente sendo superados. A tecnologia zk Rollup está começando a ocupar uma parcela cada vez maior do mercado da Camada 2.

Como mostrado na figura abaixo, dentro do campo de dimensionamento da camada Rollup layer-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 o seu desenvolvimento, o zkRollup passou principalmente por duas fases. 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 saber se a plataforma de Camada 2 executa lógica especializada limitada escrita pelo fornecedor da plataforma ou lógica de contrato inteligente arbitrária escrita pelos utilizadores em transações.

Em projetos de zkRollup não gerais (como o zkSync Lite, que ocupa o 8º lugar na figura acima), os utilizadores apenas podem realizar alguns tipos de operações de transação, como transferências de FT (token fungível), pagamentos, trocas e transferências de NFT (token não fungível). 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 Ethereum e obter uma maior taxa de transações. No entanto, se quisermos experimentar algum contrato interessante na cadeia, não seremos capazes de o fazer.

Porque é que os zkRollups especializados não permitem que os utilizadores implementem e usem os seus próprios contratos inteligentes? Isto faz-nos regressar à 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 do L1. Apenas os estados que passam na verificação podem ser aceites pelo L1 e, em última análise, completar o Rollup. Este processo requer 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 contratos arbitrária em circuitos de prova de conhecimento zero é um desafio (as razões para esta dificuldade serão explicadas mais tarde no texto). Como resultado, os projetos iniciais de zkRollup muitas vezes apenas 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 Zero-Conhecimento) resolveu a dificuldade de provar a execução de qualquer código arbitrário Turing-completo dentro de circuitos de prova de conhecimento zero, tornando possível a plataforma geral zkRollup. A seguir, este artigo irá introduzir os princípios de implementação do zkVM, permitindo que os leitores compreendam como esta parte mais central da tecnologia geral zkRollup opera.

Os Princípios de Implementação do zkVM

Antes de introduzir os princípios do zkVM, forneceremos primeiro 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 pelos 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 este 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.

Porque são necessárias Provas de Conhecimento Zero

A prova de conhecimento zero é uma primitiva criptográfica que permite a um provador convencer um verificador da correção de uma declaração sem revelar qualquer informação adicional ao verificador.

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

  • Completude: Se a declaração a ser provada for verdadeira, um verificador honesto (ou seja, alguém que siga o protocolo corretamente) será convencido desse fato por um provador honesto.
  • Solidez: 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-knowledge: Para além da declaração ser verdadeira, o verificador não pode obter qualquer informação adicional a partir 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 a partir 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 incorreto, eles não podem gerar uma prova válida.

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

Para além das três propriedades essenciais das provas de conhecimento zero, o esquema zk-SNARK amplamente utilizado também tem a característica da concisão. Isto significa que, para qualquer lógica complexa que seja 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. Isto permite ao zk-Rollup descarregar cálculos de atualização de estado fora da cadeia e apenas verificar a correção das operações na cadeia, tornando a solução de escalonamento exequí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, vamos definir 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 o 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 apenas garante que o verificador não pode obter informações sobre a entrada secreta a partir do processo de prova.

Ao provar, o provador seleciona primeiro um valor para a e b, respetivamente, 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 estes valores e operações.

Após concluir a prova, o provador dará 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, ao validar a prova de conhecimento zero, ser convencido 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 é capaz de obter qualquer 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. Os circuitos aritméticos são representações de computação Turing-completas. Como o nome indica, um circuito aritmético é um circuito computacional composto por portas 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 que mencionamos, há dois valores adicionais, d e e. Estes 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á o seu lugar e será usada no processo de prova. A única diferença entre elas e as entradas é que os 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 referimo-nos às entradas públicas no circuito como a declaração (no nosso exemplo, a e c), e todos os outros valores, incluindo as entradas secretas (b) e variáveis intermédias (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 na seguinte forma:

declaração:

a,c

testemunha:

b,d,e

restrição:

d = a * a

e = b + 5

c = d + e

Depois de aritmetizar o circuito a ser comprovado, o algoritmo de prova de conhecimento zero precisa processar as restrições do circuito e convertê-las na forma necessária pelo algoritmo para a geração e validação das provas. Depois do processamento, o circuito produz uma VK (Chave de Verificação) de comprimento fixo que não está relacionada com o tamanho do circuito. O verificador pode verificar a prova de conhecimento zero do circuito correspondente através da chave de verificação. A chave de verificação é algo similar a um compromisso com o circuito. Se ocorrerem quaisquer alterações nas restrições, a chave de verificação correspondente também mudará.

Nas aplicações reais, os utilizadores de provas de conhecimento zero precisam de escrever a lógica necessária no código-fonte do circuito zk e gerar um VK correspondente através de auditoria. Este VK é entregue ao verificador. As entradas públicas provadas pelo provador, juntamente com a prova gerada, são submetidas, e o verificador pode verificar se estas entradas públicas cumprem as 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 Turing-completos e possam representar qualquer computação, devido à necessidade de converter computações na 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 declaraçõ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 que isto não significa que não podemos usar ramos e seleções em circuitos. Apenas significa que, nos circuitos, todos os ramos, quer sejam selecionados ou não, serão executados e contribuirão para a produção da prova. A seleção de ramos apenas afeta qual resultado do ramo será output para a próxima variável.

Tomemos a seguinte operação como exemplo:

if (flag) {

c = x + x

} else {

c = x * x

}

Quando esta operação é convertida num 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.

Isto é, num circuito zk, todos os ramos e lógica serão calculados, quer sejam executados ou não.

temp1 = x + x

temp2 = x * x

c = bandeira 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.

Prova da Execução de Qualquer Programa — Provar uma Máquina de Estado Universal num 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 estados universal possui registos de propósito geral (A e B) e, adicionalmente, um registo de Contador de Programa que armazena o número de instrução atual.

O estado dos registos 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 de ser executada. O estado inicial, após um total de m instruções, atinge 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 estados.
  • 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 o 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 na vm.

Existem dois problemas aqui.

Uma é 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á a ser executada, por isso a lógica real do circuito 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, usar 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 alterar diretamente o número de instruções no circuito. Isto acontece 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 irá mudar e a chave de verificação correspondente também irá mudar. Isso torna impossível atender aos requisitos para verificar qualquer lógica em um circuito fixo.

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

Provar 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:

Origem da imagem

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

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

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

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

Voltando ao diagrama do processo básico, podemos considerar o circuito computacional nesta seção como uma instrução no processo geral. O Seletor escolherá se o resultado que ele 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.

Provar Julgamentos Condicional e Saltos de Fluxo de Controlo

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

Deve ser notado aqui que os circuitos zkVM não são módulos que executam realmente a lógica do contrato e calculam resultados. O que os circuitos zkVM fazem na realidade é 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 executado no circuito, verificar através do circuito se as condições para este salto são cumpridas e depois provar que o fluxo de instruções executado fez o salto correto.

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

Tomando o julgamento de se o operando na instrução 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.

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

A validade desta restrição 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 as duas restrições no diagrama, é possível verificar se um valor é zero e convertê-lo num estado auxiliar.

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

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

I/O and Operações Complexas

Ao usar um circuito de prova de máquina de estado geral, para lidar corretamente com as transições de estado, é necessário adicionar estados de controle correspondentes e restrições 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 os NOPs), esses valores de estado e verificações de restrição não podem ser omitidos.

Portanto, usar o circuito de máquina de estado 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 de máquina de estado geral executar instruções complexas ou interagir diretamente com o mundo exterior.

Para resolver este problema, as implementações reais de zkVMs normalmente 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 numa solução única.

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 controlo lógico de execução do programa. Na maioria dos contratos, o tempo de execução real desta parte da lógica é muito pequeno, por isso prová-lo com a máquina de estado geral ineficiente 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 estado geral e os circuitos de prova especializados interagem usando tabelas de pesquisa. Sempre que o circuito da máquina de estado 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 estado 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, por fim, gerando 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 num ambiente sem confiança. Esta tecnologia, quando utilizada em blockchain, liberta a execução da cadeia, permitindo que a blockchain principal se concentre em questões descentralizadas e de segurança. No entanto, a característica dos circuitos especializados de prova de conhecimento zero para executar apenas lógica fixa limita o potencial das provas de conhecimento zero em 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 desencadeado, 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 reimpressão, entre em contato com o Gate Learnequipa e eles irão tratar disso prontamente.
  2. Responsabilidade Legal: 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, é proibido copiar, distribuir ou plagiar os artigos traduzidos.
今すぐ始める
登録して、
$100
のボーナスを獲得しよう!