WEB3DEV

Cover image for Série ZKP: Um Catálogo de Recursos Técnicos em Esquemas de Implementação Populares de Provas de Conhecimento Zero
Paulo Gio
Paulo Gio

Posted on • Atualizado em

Série ZKP: Um Catálogo de Recursos Técnicos em Esquemas de Implementação Populares de Provas de Conhecimento Zero

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*QbAgA-SWCL_o9zfhRl0ywA.png

Visão Geral

Para compreender o funcionamento do sistema blockchain, é crucial ter um entendimento de vários conceitos criptográficos. Um exemplo é o secp256k1, que é uma curva e um algoritmo de assinatura assimétrica usados para assinar e verificar contas nos sistemas Bitcoin e Ethereum. Além disso, algoritmos de hash como o sha256 são empregados para comprimir informações de comprimentos variáveis em códigos de comprimento fixo, enquanto o base58 pode ser utilizado para codificar informações em uma string representada por caracteres imprimíveis. Outro algoritmo significativo é o ECDH, que é um algoritmo de troca de chaves Diffie-Hellman, que permite a troca segura de chaves de comunicação entre nós P2P.

A Prova de Conhecimento Zero (Zero-Knowledge Proof), ou ZKP / ZK para abreviar, é um algoritmo criptográfico que permite a prova da exatidão de uma proposição sem revelar qualquer informação adicional. Essa característica da ZKP, que despertou um grande interesse, é comumente referida como "conhecimento zero", embora alguns argumentem que "prova de vazamento zero" seja um nome mais preciso que melhor representa suas capacidades fundamentais.

Apesar de ter sido introduzida em 1985, a ZKP não viu amplas aplicações práticas por muito tempo, resultando em um desenvolvimento tecnológico lento. No entanto, com o surgimento do Bitcoin em 2009, as pessoas começaram a reconhecer seu potencial para abordar questões de privacidade e escalabilidade na tecnologia blockchain. Desde então, foram feitos investimentos significativos tanto no desenvolvimento quanto nas aplicações de engenharia da ZKP, resultando em numerosas implementações, como Groth16, PlonK, STARK e outras. Atualmente, não há um padrão da indústria definitivo para a ZKP. Este artigo tem como objetivo fornecer um inventário dos recursos técnicos de várias implementações de ZKP para ajudar em seus estudos, pesquisas e desenvolvimento de engenharia.

Campo de Aplicação do ZKP

1. Certificado de Privacidade

O Zcash talvez tenha sido o primeiro caso de uso de ZKP amplamente adotado. Ele aproveita o código-fonte do Bitcoin e aplica a ZKP às transferências de tokens para garantir completa confidencialidade das transações, enquanto permite que os nós da blockchain verifiquem as transações.

Por outro lado, o Tornado Cash é um misturador de moedas que opera na rede Ethereum. Ele utiliza a ZKP para autenticar os nós na árvore Merkle. Os usuários podem depositar uma quantidade predeterminada de tokens no pool de fundos e, em seguida, usar a prova gerada pela ZKP para verificar os fundos depositados sem precisar divulgar informações da transação.

2. Terceirização de Computação

Em sistemas blockchain, cada nó tem uma capacidade limitada de computação. No entanto, a tecnologia ZKP permite que os nós terceirizem um número considerável de cálculos para nós fora da cadeia. Nesse cenário, a exatidão dos cálculos pode ser determinada verificando as provas de cálculo e os resultados enviados pela parte que terceirizou os cálculos.

O zksync1.0 é um exemplo convincente disso. Ele permite a transferência e negociação de tokens Ethereum fora da cadeia, com os resultados posteriormente enviados aos nós. Ao verificar a prova da ZKP, os nós podem determinar se os cálculos foram realizados de acordo com o método declarado.

3. Compressão de Dados

O Filecoin aproveita a ZKP para estabelecer um sistema de prova espaço-tempo que verifica o armazenamento local de arquivos específicos pelos usuários. O sistema provou ser capaz de armazenar até 18 EiB de dados.

O protocolo Mina apresenta outro exemplo, especialmente em sistemas de blockchain de alta velocidade em que o volume de dados de transação é significativo e a verificação do protocolo de consenso requer a manutenção de todos os blocos. Consequentemente, os requisitos de hardware para esses sistemas são elevados, com o armazenamento permanente exigindo expansão contínua do espaço em disco e capacidade de indexação de dados para os nós da blockchain. Nesses casos, a ZKP pode ser aplicada para comprimir os dados de verificação. Por meio de prova de conhecimento zero recursiva, o Mina reduz o livro-razão para 11 KB, garantindo ainda a verificação da exatidão dos blocos.

Sistemas ZKP

O sistema de prova serve como a implementação do algoritmo fundamental da ZKP e pode ser classificado em duas categorias: interativo e não interativo.

1. Sistema de Prova Interativa

O sistema de prova interativa envolve duas partes: o Provador (P) e o Verificador (V). P possui um segredo específico, como a chave secreta de um sistema criptográfico de chave pública ou uma raiz quadrada de resíduo quadrático, e tem como objetivo convencer V de que ele possui o segredo. O sistema de prova interativa consiste em múltiplas rodadas, onde P e V trocam mensagens com base nas mensagens recebidas e nos resultados computados por eles mesmos. Em um cenário típico, V questiona P durante cada rodada, e P responde de acordo. Após todas as rodadas serem concluídas, V decide se aceita a prova de P com base em sua capacidade de responder com precisão a cada pergunta enviada por V durante as rodadas.

2. Sistema de Prova Não Interativa

O sistema de prova interativo descrito anteriormente envolve comunicação direta entre P e V, com P gerando a prova e V verificando-a diretamente. Veremos agora o sistema de prova que é chamado de sistema de prova não interativa (NIZK).

No contexto de blockchain, NIZK é o sistema de prova geralmente utilizado, onde o verificador, V, é o nó da blockchain e o provador, P, é o usuário final ou a rede de duas camadas (Camada 2).

O link de referência [1] oferece uma descrição dos esquemas de NIZK publicamente publicados e suas características nos últimos dez anos.

Para aplicações práticas de engenharia, o desempenho e a versatilidade são o foco principal, levando a uma classificação e comparação mais abrangente dos sistemas de prova comumente utilizados, conforme detalhado no link de referência [2].

Bulletproofs

Características: tamanho compacto da prova, ausência de configurações confiáveis, mas com um processo extenso de geração e verificação de prova.

Projetos representativos: Bulletproofs, Halo, Halo2.

SNARKs (Succinct Non-interactive ARguments of Knowledge)

(Argumentos de Conhecimento Não Interativos e Sucintos)

Características: tamanho de prova compacto e tempo de verificação de prova relativamente curto, mas é necessária a confiança no circuito.

Projeto representativo: Groth16.

SNORKs (Succinct Non-interactive Oecumenical/Universal Arguments of Knowledge)

(Argumentos de Conhecimento Ecumênicos/Universais Não Interativos e Sucintos)

Características: tamanho compacto de prova e a necessidade de apenas uma configuração confiável a ser estabelecida para todos os circuitos.

Projetos representativos: Sonic, PlonK, Marlin, Plonky2.

STARKs (Succinct (Scalable) Transparent Arguments of Knowledge)

(Argumentos de Conhecimento Transparentes e Sucintos (Escaláveis))

Características: Grande tamanho de prova, ausência de exigência de configuração confiável e excelente escalabilidade.

Projeto representativo: STARK.

3. Comparação de Desempenho

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*xP8Fcc62GVvWuYyAumI1qA.png

https://docs.google.com/presentation/d/1gfB6WZMvM9mmDKofFibIgsyYShdf0RV_Y8TLz3k1Ls0/edit

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*GFRk9nYgyjFnQVaxje_tug.png

https://docs.google.com/presentation/d/1gfB6WZMvM9mmDKofFibIgsyYShdf0RV_Y8TLz3k1Ls0/edit

Programação de Circuitos

O circuito representa a implementação da lógica de negócios do sistema ZKP e o desenvolvimento de aplicações ZKP requer programação de circuitos. O código da lógica ZKP é referido como "circuito" por várias razões:

  • O código da prova da ZKP é transformado em um conjunto de expressões de restrição simples chamadas R1CS, que é então convertido em um grande polinômio QAP usando o método de interpolação de Lagrange. Por fim, é limitado na forma de circuitos de portas.
  • Semelhante aos circuitos de hardware, todas as ramificações de código são executadas simultaneamente.
  • Assim como nos circuitos de hardware, a ZKP impõe a ausência de recursão e loops complexos dentro do circuito, sendo o número de loops limitado a uma constante.

Não é necessário começar a construir aplicações ZKP do zero usando criptografia. Muitas bibliotecas de desenvolvimento já implementaram sistemas de prova subjacentes, permitindo que os desenvolvedores se concentrem exclusivamente na implementação da lógica de negócios. Essas bibliotecas operam em diferentes níveis de abstração, sendo que algumas exigem conhecimento das descrições de expressão do circuito e outras são simples de implementar, definindo o código com base no processo

1. Bibliotecas de desenvolvimento comumente usadas

libsnark

Esta é uma implementação em linguagem C++ do sistema de prova geral, biblioteca de circuito básica e exemplos de aplicativos.

Sistemas de prova: BBFR15, BCCT12, BCCT13, BCGTV13, BCIOP13, BCTV14a, BCTV14b, CTV15, DFGK14, Groth16, GM17, GGPR13, PGHR13.

Link: https://github.com/scipr-lab/libsnark.

gnark

Este é um sistema de prova projetado em Go, que oferece uma API de alto nível para o design de circuitos.

Sistemas de prova: Groth16, PlonK.

Link: https://github.com/consensys/gnark.

bellman

Este é um sistema de prova baseado em Rust que oferece uma interface de circuito, infraestrutura e implementações básicas de circuitos, incluindo abstrações booleanas e numéricas.

Sistema de prova: Groth16.

Link: https://github.com/zkcrypto/bellman.

snarkjs

Este é um sistema de prova implementado em JavaScript e WASM, projetado para facilitar a configuração confiável, a geração da prova e a verificação da prova. snarkjs usa o compilador circom da iden3 para compilar circuitos definidos pela DSL.

Sistemas de prova: Groth16, PlonK.

Link: https://github.com/iden3/snarkjs.

ethsnarks

Esta é uma implementação baseada em Python que permite a geração de provas no navegador do usuário, utilizando contratos inteligentes Ethereum como validadores. Atualmente, o desenvolvimento do projeto está inativo, com o Circom provando ser uma alternativa melhor no mesmo cenário.

Sistema de prova: Groth16.

Link: https://github.com/HarryR/ethsnarks.

bulletproofs

Este é um sistema de prova baseado em Rust que está atualmente em desenvolvimento, oferecendo provas de intervalo único e agregado, computações multipartidárias com tipagem forte e uma API de sistema de restrição que suporta a prova de declarações arbitrárias.

Sistema de prova: bulletproofs.

Link: https://github.com/dalek-cryptography/bulletproofs.

halo2

Este sistema de prova é baseado em uma implementação em Rust e é mantido pela equipe do ZCash. O Halo2 é projetado especificamente para circuitos PLONKish e oferece controle direto sobre como eles são representados em operações aritméticas, tornando-o uma ótima opção para a construção de circuitos altamente otimizados.

Sistema de prova: Halo2.

Link: https://github.com/zcash/halo2.

2. Processo de Desenvolvimento

Usando o gnark como exemplo, um fluxo de trabalho típico envolve:

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*dtyMnYHtPcFVyxcY5dMDKw.png

1) Use o código para descrever o problema que precisa ser resolvido.

2) Compile o código em um sistema de restrição R1CS.

3) Estabeleça configurações confiáveis no R1CS para adquirir a chave de prova (Proving Key) e a chave de verificação (Verification Key).

4) O Provador utiliza o R1CS e a chave de prova para calcular dados privados e gerar uma Prova.

5) O verificador usa a chave de verificação para verificar a prova.

Linguagem Especial para Programação de Circuitos

1. Baseado na plataforma Ethereum

Cairo

Cairo é uma linguagem de programação projetada para construir programas que possam ser comprovadamente funcionais, com uma parte capaz de verificar se um cálculo foi executado com precisão. Ao utilizar a linguagem Cairo e outros sistemas de prova, é possível escalar blockchains. A StarkNet emprega a linguagem de programação Cairo em sua infraestrutura, bem como no desenvolvimento de contratos StarkNet.

Sistema de prova: STARK.

Link: https://www.cairo-lang.org/docs/.

Zokrates

Zokrates utiliza uma linguagem específica de domínio (DSL) para descrever circuitos, oferecendo bibliotecas de circuitos comumente usadas que permitem a utilização de cálculos verificáveis em DApps. Desde a padronização de programas em linguagens de alto nível até a geração de provas de cálculo e, em seguida, a verificação dessas provas no Solidity, o Zokrates pode ajudar na utilização de cálculos verificáveis.

Sistema de prova: GM17, Groth16, Marlin.

Link: https://zokrates.github.io/.

Circom

Circom é uma linguagem que utiliza DSL para descrever circuitos, que podem trabalhar junto com snarkjs para gerar provas nos navegadores dos usuários, utilizando contratos inteligentes Ethereum como verificadores.

Sistema de prova: Groth16, PlonK.

Link: https://iden3.io/circom.

Noir

Noir é uma linguagem de programação de privacidade construída pela Aztec em Rust, utilizando uma DSL para descrever circuitos, permitindo a construção segura e simples de circuitos de conhecimento zero que preservam a privacidade.

Sistema de prova: PlonK.

Link: https://noir-lang.org/index.html.

ZkE VM

Similar à EVM, a zkEVM é uma máquina virtual que avança entre estados por meio de operações de programa. No entanto, a zkEVM verifica a precisão de cada etapa de computação por meio da geração de provas. Em essência, a zkEVM utiliza um mecanismo para provar que as etapas de execução aderem às regras.

Atualmente, equipes como zkSync, Polygon, Scroll, Starkware e outras estão trabalhando na realização da zkEVM e fizeram progressos notáveis.

2. Baseado na Plataforma de Cadeia Pública

zkApp (Mina)

zkApps são contratos inteligentes alimentados por provas de conhecimento zero no Protocolo Mina. Esses contratos podem realizar computações arbitrárias e complexas fora da cadeia e cobrar apenas uma taxa fixa para enviar as provas de conhecimento zero para a cadeia para a verificação da computação. Isso é diferente de outras blockchains que realizam computações na cadeia e empregam um modelo de taxa de gás variável. Os zkApps são codificados em Typescript.

Sistema de prova: PlonK.

Link: https://docs.minaprotocol.com/zkapps.

LEO (Aleo)

O LEO, da Aleo, é uma linguagem de programação de tipo estático criada especificamente para o desenvolvimento de aplicações privadas. O LEO pode ser construído de forma transparente em cima da blockchain da Aleo para fornecer uma base segura para um ecossistema descentralizado e privado. A linguagem é projetada com os desenvolvedores em mente e oferece recursos que garantem privacidade, segurança e facilidade de uso.

Sistema de prova: Marlin.

Link: https://leo-lang.org/.

Problemas de segurança comuns em ZKP

A equipe de segurança da SlowMist tem realizado auditorias de segurança em vários produtos conhecidos de ZKP, incluindo ZKSwap, Zkdex e Zksafe, entre outros. Essas auditorias revelaram várias vulnerabilidades de risco médio e alto, o que deu à equipe uma compreensão maior dos problemas de segurança em aplicações de ZKP. Os problemas de segurança mais comuns identificados pela equipe da SlowMist durante as auditorias de aplicação de ZKP incluem:

Risco de parâmetros de confiança

Uma das principais preocupações de segurança em aplicativos que utilizam a ZKP é o risco associado aos parâmetros de confiança. Para usar zk-SNARKs, um conjunto de parâmetros conhecido como String de Referência Comum (Common Reference String, ou CRS) é necessário. No entanto, durante a criação desses parâmetros, parâmetros privados também são gerados. Se esses parâmetros privados caírem nas mãos erradas, eles podem ser usados para forjar provas.

A geração da CRS também deve ser auditada para garantir que não haja backdoors introduzidos e que os parâmetros privados não sejam intencionalmente preservados. Da mesma forma, zk-SNORKs requer que a String de Referência Estruturada (Structured Reference String, ou SRS) seja confiável.

Para mitigar esses riscos de segurança durante a fase de configuração confiável, a computação segura multipartidária (MPC) pode ser usada. A MPC garante que o resultado final do cálculo é confiável desde que pelo menos um participante seja honesto.

Segurança de código estático

Esta parte lida principalmente com problemas de segurança resultantes de práticas de codificação não padronizadas, como parâmetros não verificados, valores de retorno não tratados, overflow numérico, limites não verificados, etc. Se a linguagem de programação do circuito for C/C++, também há um risco de overflow de memória.

Risco de ataque à cadeia de suprimentos

O risco de ataques à cadeia de suprimentos em aplicações que utilizam a ZKP surge principalmente do uso de bases de código vulneráveis, incluindo versões desatualizadas. Normalmente, as aplicações de ZKP são usadas em conjunto com clientes ou interfaces web, que também podem ser vulneráveis a ataques de hackers por vários meios.

Erro lógico

Erros lógicos são os erros mais comuns na implementação de circuitos. É importante garantir que o projeto do circuito atenda aos requisitos descritos no documento de requisitos.

Ataque de gasto duplo

Um projeto de circuito incorreto pode resultar em ataques de gasto duplo, por exemplo, algumas bibliotecas de ZKP podem ter vulnerabilidades de escalabilidade e os atacantes podem usar provas conhecidas para gerar provas diferentes. Se o projeto do circuito for inadequado, isso pode levar a ataques de gasto duplo.

Fraude de Prova

Um dos principais objetivos da ZKP é garantir a completude e confiabilidade das provas, garantindo que "falso não possa ser verdadeiro e verdadeiro não possa ser falso". Portanto, a questão da fraude de prova, ou seja, a capacidade de criar uma prova falsa, é uma preocupação importante. Isso geralmente é causado por vulnerabilidades na biblioteca subjacente e é recomendável que as equipes de projetos usem bibliotecas ZKP auditadas publicamente e versões de lançamento estáveis para evitar esses problemas.

Ataque de Canal Lateral

O design inadequado do circuito pode resultar em diferentes características de computação para diferentes informações privadas, tornando possível para os atacantes adivinhar dados de entrada privados por meio de entrada ou prova pública, conhecido como ataque de canal lateral.

Falha de Restrição de Circuito

Expressões de circuito mal definidas podem levar a variáveis que não são devidamente restritas.

Ataque de Valor Especial

Valores de entrada especiais, como 0 ou nulo, podem contornar a lógica de validação do sistema, levando a um possível ataque.

Adivinhação de Entrada de Privacidade

A auditoria rigorosa dos dados de entrada é necessária para evitar vazamentos de privacidade em aplicativos como o Tornado Cash, onde a adivinhação de informações de entrada pode resultar em graves problemas de privacidade.

Risco de Rug Pull

Projetos que possuem privilégios administrativos especiais podem ter um risco de Rug Pull (puxada de tapete), onde uma vez que esses privilégios são usados ilegalmente, os fundos do projeto e os ativos dos usuários podem ser roubados.

Risco do Contrato Inteligente

O processo de verificação de algumas provas de ZKP é feito por meio de contratos inteligentes, por exemplo, com o Circom ou o ZoKrates. No entanto, os contratos inteligentes podem ter riscos de segurança, como a vulnerabilidade de reentrância, a vulnerabilidade de repetição e os erros lógicos. Para obter mais informações sobre isso, você pode consultar o serviço de auditoria de segurança de contrato inteligente oferecido pela equipe de segurança SlowMist.

Para lidar com as preocupações de segurança em relação à ZKP que foram mencionadas acima, a equipe de segurança SlowMist desenvolveu um conjunto de medidas de segurança com base em sua experiência prática em operações ofensivas e defensivas. Essas medidas são combinadas com vários métodos de teste, incluindo testes de caixa preta, caixa cinza e caixa branca, e têm como objetivo fornecer auditorias de circuito ZKP para a indústria blockchain.

Resumo

As provas de conhecimento zero oferecem uma solução eficaz para questões de privacidade, escalabilidade e compressão de dados em blockchain. Existem vários esquemas de implementação com diferentes desempenhos e métricas de segurança. Ao desenvolver um circuito de prova de conhecimento zero, os desenvolvedores devem escolher um framework apropriado de acordo com seus requisitos e garantir que uma auditoria de segurança abrangente tenha sido realizada antes de entrar no ar.

Por fim, um agradecimento especial à Safeheron, um provedor profissional de serviços de ativos digitais de autocustódia, por sua experiência técnica.

Sobre a SlowMist

SlowMist é uma empresa de segurança blockchain estabelecida em janeiro de 2018. A empresa foi fundada por uma equipe com mais de dez anos de experiência em segurança de rede para se tornar uma força global. Nosso objetivo é tornar o ecossistema blockchain o mais seguro possível para todos. Somos agora uma renomada empresa internacional de segurança blockchain que trabalhou em vários projetos conhecidos como Huobi, OKX, Binance, imToken, Crypto.com, Amber Group, Klaytn, EOS, 1inch, PancakeSwap, TUSD, Alpaca Finance, MultiChain, O3Swap, etc.

Website: https://www.slowmist.com

Twitter: https://twitter.com/SlowMist_Team

Github: https://github.com/slowmist/

Artigo original publicado por Slowmist. Traduzido por Paulinho Giovannini.

Top comments (0)