introdução
Provas de conhecimento zero, especialmente zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Knowledge Arguments), são talvez uma das tecnologias de ponta mais importantes na Web 3. Atualmente, a maior parte da atenção da mídia e do investimento neste subcampo está focada em zk-Rollups, uma solução de escalonamento que fornece escalabilidade massiva para blockchains L1 como Ethereum. Apesar disso, zk-Rollups são tudo menos o único propósito dos zk-SNARKs. Este artigo fornecerá uma análise aprofundada do conceito de código assembly de conhecimento zero (zkASM), avaliará seus casos de uso em zk-Rollups e outros aspectos, e explorará seu potencial na reinvenção da Internet a partir de um nível teórico.
Princípios técnicos
Como o nome sugere, o zk-ASM consiste principalmente em dois componentes técnicos: ZK e ASM. ZK refere-se a zk-SNARKs, que é um argumento de conhecimento conciso e não interativo, e ASM refere-se ao código assembly. Para compreender o potencial do zk-ASM, devemos primeiro compreender a base teórica destes dois conceitos aparentemente obscuros.
zk-SNARKs
Os zk-SNARKs são a joia da coroa dos zk-Proofs: são uma forma concisa de provar que uma afirmação é verdadeira sem revelar qualquer informação sobre os dados que estão sendo provados. Por exemplo, suponha que alguém declare “Eu sei que existe um m tal que C(m) = 0”, onde m é um gigabyte de informação e C é uma função. O zk-SNARK constituirá uma prova curta (<1GB) que verifica rapidamente a existência de m sem expor nenhuma informação sobre m (além da informação pública).
O que exatamente é esse "C(m)"? Qual o uso? Esta função é na verdade um circuito aritmético ou uma representação gráfica acíclica direcionada (DAG) da função específica que queremos executar, conforme mostrado na figura. Essencialmente, “m” são os dados de entrada do circuito, e os “nós” específicos no circuito são portas ou operações lógicas individuais. Por exemplo, "2" e "3" podem ser inseridos no nó "+" e, em seguida, "5" é enviado para o próximo operador. Isto permite que qualquer operação aritmética ou lógica seja codificada em um "circuito aritmético".

Depois que o código zk-SNARK que queremos executar for representado por um circuito aritmético, podemos começar a construir este zk-SNARK. Fundamentalmente falando, a viabilidade de zk-SNARK é estabelecida pelo "Teorema Fundamental da Álgebra". De acordo com o Teorema Fundamental da Álgebra, um polinômio de grau "d" tem no máximo raízes "d". Este truque matemático é um processo de duas etapas: (1) converter a função "f(m)" que precisa ser provada em um polinômio e continuar a usar o polinômio, e (2) usar o "Teorema Fundamental da Álgebra" para processar o polinômio e fornecer uma prova concisa. Em termos técnicos, a primeira parte é chamada de "Esquema de Compromisso Polinomial" (PCS) e a segunda parte é chamada de "Prova Interativa Polinomial do Oracle" (PIOP).

A composição de um circuito universal eficiente SNARK. Fonte: https://cs251.stanford.edu/lectures/lecture15.pdf
A implementação específica de PCS e PIOP está além do escopo deste artigo, mas isso nos dá um esboço das etapas principais do zk-SNARK:
Selecione uma função (função de código, equação matemática, etc.) na qual deseja executar zk-SNARK
Codifique esta função em um circuito aritmético C(m)
Execute PCS para obter a representação polinomial do circuito aritmético
Execute o PIOP e obtenha uma prova concisa do tamanho do log(m)
Agora existe um zk-SNARK customizado, que pode provar que alguém conhece uma determinada informação sem revelar o conteúdo específico da informação.
código de montagem
A segunda peça do quebra-cabeça zk-ASM é o código assembly. É uma linguagem semelhante a uma linguagem que contém instruções de linguagem de nível muito baixo que são fáceis de ler para as máquinas, mas difíceis de decifrar para os humanos. Ao contrário de linguagens de alto nível como Python, Java ou mesmo C, a linguagem assembly contém algumas funções muito primitivas, bem como MOVE (mover), CMP (comparar), ADD (adição) e JMP (salto) no processador e registrar níveis. Por exemplo, o código Python para digitar os números de 1 a 9 na tela é `123456789`:

Isso é fácil de entender, certo? Vamos dar uma olhada em sua versão assembly x86:

É realmente muito mais problemático e é apenas uma operação muito simples. Neste caso, por que usar linguagem assembly? Como mencionado acima, embora essas instruções não sejam facilmente legíveis por humanos, elas são facilmente “montadas” em código de bytes `110011001` para uma máquina ler e executar (chamado montador). Em comparação, embora linguagens de alto nível como Python e Java sejam mais legíveis, o processador não pode executar diretamente programas escritos nessas linguagens. Precisamos de um "compilador" para converter o código Python ou Java que escrevemos no código assembly acima e entregá-lo à máquina para montagem e execução. A razão pela qual o mesmo código Python ou Java pode ser executado sem problemas em diferentes processadores e sistemas operacionais é porque o compilador faz o trabalho pesado e compila o código-fonte em linguagem assembly para o processador ou sistema operacional específico.
Como todas as linguagens são compiladas em código assembly (que é posteriormente compilado em binários executáveis), o assembly é essencialmente como a "mãe de todas as linguagens". Agora, assumindo que podemos converter todos os operandos em uma linguagem assembly (como x86 ou RISC-V) em representações de circuitos aritméticos, podemos fornecer provas zk-SNARK para todos os operandos nesta linguagem assembly. Em teoria, isso significa que podemos fornecer zk-SNARKs para qualquer programa escrito em qualquer linguagem de alto nível que compile em assembly, como Python ou Java. Por causa disso, o zk-ASM merece nosso estudo cuidadoso.
Aplicação prática
Rollups zk-EVM: Polígono zk-ASM
Uma das aplicações mais importantes do zk-ASM é a criação de zk-Rollups compatíveis com a Máquina Virtual Ethereum, ou zk-EVM. zk-EVM é muito importante para a escalabilidade do blockchain porque permite que os programadores implantem em cadeias L2 baseadas em zk-Rollup sem fazer muitas (ou nenhuma) modificações no código. Nesse sentido, o zk-EVM da Polygon é um exemplo típico de como o zk-ASM pode ser usado para atingir esse objetivo.

Os desenvolvedores da cadeia pública Ethereum L1 geralmente usam a linguagem Solidity, que é uma linguagem de programação de alto nível semelhante à linguagem C. Antes de o código Solidity ser executado no blockchain L1, ele será primeiro compilado em uma série de códigos de operação EVM, como ADD, SLOAD, EQ, etc. Por padrão, este processo obviamente não cria nenhum zk-Proof. A engenhosidade da Polygon foi criar uma maneira de traduzir cada opcode EVM em seu zk-ASM personalizado, que é muito compatível com zk-SNARK. Seu L2 zk-EVM então executa zk-ASM enquanto cria o circuito zk-SNARK do ASM para criar uma prova zk-SNARK. Por exemplo, o código de operação ADD no EVM seria traduzido para o zk-ASM do Polygon da seguinte forma:

Como a mágica do Polygon zk-EVM acontece no nível de montagem, ele é dois níveis “abaixo” da camada de código que o Ethereum normal toca, a camada “Solidity”. Por causa disso, a maioria dos desenvolvedores pode portar o código EVM que construíram para a rede principal Ethereum diretamente para o Polygon zk-EVM. Ao mesmo tempo, o Polygon zk-EVM "retém" a pilha de tecnologia Ethereum até o nível do código de operação, e toda a infraestrutura de depuração que depende da análise do código de operação compilado ainda pode ser usada intacta. Isso é diferente de outros designs zk-EVM que não fornecem zk-Proof no nível do opcode, como zk-Sync. Portanto, embora a Polygon tenha inventado e verificado sua própria linguagem assembly, como disse Buterin, “ele ainda pode verificar o código EVM, apenas usa uma lógica interna diferente”.
Além dos rollups: zk-WASM
zk-EVM não é de forma alguma o único caso de uso do zk-ASM. Como mencionado acima, a linguagem assembly é essencialmente a "mãe de todas as linguagens", e a criação do zk-ASM irá desbloquear o zk-Proofs para programas de uso geral escritos em qualquer linguagem que seja compilada para a linguagem assembly. Web Assembly (WASM) é uma das linguagens assembly emergentes mais importantes. Foi lançada pela primeira vez em 2018 e tem como objetivo melhorar a velocidade de execução de aplicações web e fornecer suplementos de execução para Javascript (a principal linguagem de programação por trás da Web).
Essencialmente, à medida que a Web evoluiu ao longo dos anos, as aplicações Web cresceram em tamanho e complexidade, o que significa que os navegadores têm de compilar tudo o que está escrito em Javascript, muitas vezes a velocidades extremamente lentas, e têm de repetir tarefas complexas de "compilar-Optimizar-Recarregar" processo. O WebAssembly elimina a dependência de mecanismos complexos de execução de navegadores, fornecendo uma linguagem assembly que é portátil, modular e fácil de executar. Além disso, WASM, como linguagem assembly, permite que os programadores escrevam trechos de código usando linguagens como C, C++, Rust, Java ou Ruby que podem ser executados diretamente no navegador. WASM tornou-se, portanto, a tecnologia preferida para "fornecer funções distribuídas sem servidor".
Qual o papel que os zk-SNARKs podem desempenhar nesse sentido? WASM é único por ser uma tecnologia do lado do cliente que interage diretamente com os dados inseridos pelo usuário. Isso geralmente inclui dados confidenciais, como senhas e informações pessoais, por isso precisamos de uma tecnologia que (1) garanta que o programa seja executado com precisão e (2) garanta que informações confidenciais não sejam vazadas. zk-SNARK é a solução perfeita para esses dois problemas e, portanto, é uma importante peça do quebra-cabeça do WASM.
O trabalho no desenvolvimento do zk-WASM ainda está em seus estágios iniciais, mas vários projetos lançaram recentemente protótipos de circuitos zk-SNARK para WebAssembly. Por exemplo, o simulador zk-SNARK “ZAWA” do Delphinus Lab traz uma maneira de codificar os operandos e a semântica da máquina virtual WASM no circuito de computação, permitindo produzir provas zk-SNARK. O circuito zk-WASM certamente continuará a ser otimizado para que programas escritos em linguagens de uso geral como C, C++, Rust e Ruby adotem o paradigma zk-Proofs.
para concluir
Este artigo explora a base teórica do zk-ASM e examina dois casos de uso de paradigma do zk-ASM: Polygon usa zk-ASM para criar zk-EVM no nível de código operacional e aplica zk-SNARKs ao WebAssembly para criar zk-WASM; Em última análise, o zk-ASM promete combinar a interoperabilidade e a escala da Web 2 com a falta de confiança e a segurança da Web 3.
Por um lado, a blockchain procura cada vez mais romper os atuais gargalos no volume de processamento e, por outro lado, as abordagens da Web 2 são cada vez mais criticadas por não protegerem adequadamente os dados e a privacidade dos utilizadores. À medida que os programadores são capazes de usar paradigmas de design da Web 3 no código da Web 2 e trazer linguagens e códigos da Web 2 para o blockchain, espera-se que o zk-ASM universal se torne um ponto de encontro entre os mundos da Web 2 e da Web 3. Em vista disso, o zk-ASM pode nos permitir reimaginar uma Internet mais segura e sem confiança.