Provas de conhecimento zero (ZKP) são uma ferramenta criptográfica poderosa que pode validar a precisão de cálculos enquanto protege a privacidade dos dados de entrada. Linguagens Específicas de Domínio (DSLs) desempenham um papel crucial como parte dessa infraestrutura chave, simplificando o desenvolvimento e o processo de verificação de circuitos ZKP. Elas atuam como uma ponte importante entre conceitos abstratos e a representação precisa de circuitos exigida pelos sistemas de prova.
Um dos principais desafios enfrentados pelos sistemas de prova é traduzir conceitos abstratos de alto nível em circuitos práticos. No entanto, o surgimento de DSLs tem abordado essa questão, facilitando a estruturação desses conceitos abstratos de maneira mais concreta e implementável, atendendo assim a esse desafio.
Na última década, testemunhamos um aumento significativo na quantidade e diversidade de DSLs. Essa vitalidade no campo é evidente no desenvolvimento de várias linguagens de circuito, incluindo Noir, Leo e Zinc. Se você precisa de uma opção versátil como Circom ou uma solução personalizada para uma plataforma específica como Cairo, você pode escolher entre inúmeras linguagens e estruturas para escrever circuitos ZKP.
Neste artigo, exploraremos as principais linguagens de programação ZK utilizadas ativamente pelos desenvolvedores e analisaremos as melhores características de cada linguagem.

Inspirado pelo Rust, Cairo capacita os desenvolvedores a criar contratos inteligentes Starknet com foco em segurança e desenvolvimento amigável. Cairo ostenta uma sintaxe poderosa que simplifica a criação de circuitos ZK, permitindo que os usuários realizem várias tarefas dentro dos programas Cairo. Além disso, uma das vantagens significativas do Cairo é a sua escalabilidade, permitindo a integração flexível de novos recursos e funcionalidades.
Em sistemas ZK, eficiência e escalabilidade são fatores cruciais, e o Cairo atende a esses requisitos enfatizando ambos. A linguagem integra estratégias de otimização, incluindo redução de restrições e eliminação de loops, para aliviar o fardo computacional geralmente associado aos circuitos ZK. A otimização no design do circuito resulta em geração de prova e verificação mais rápidas, tornando-o uma escolha ideal para aplicações que exigem alta taxa de transferência e latência mínima.
A expansão e desenvolvimento do Cairo têm sido notáveis, testemunhando um aumento extraordinário no número de desenvolvedores em tempo integral nos últimos dois anos. Esse aumento destaca a adaptabilidade do Cairo, pois seu uso não se limita ao blockchain, mas é significativo em qualquer contexto que exija verificação computacional. Portanto, podemos antecipar um crescimento significativo adicional de desenvolvedores adotando o Cairo.
Em 28 de setembro de 2023, o Starknet lançou uma atualização importante para sua linguagem de programação com Cairo v2.3.0. Esta versão marca um avanço significativo na modularização de contratos, introduzindo novos recursos, opções de armazenamento e gerenciamento de eventos, aprimorando o potencial de contratos inteligentes. A integração desses componentes oferece uma maneira flexível de expandir as funcionalidades do contrato, permitindo que módulos de terceiros aprimorem a funcionalidade dos contratos.
A singularidade do Zinco reside na sua facilidade de uso. Você pode escrever código seguro sem precisar mergulhar em todos os detalhes complexos do Sistema de Restrições de Primeira Ordem (R1CS). O Zinco enfatiza a imutabilidade, dotando-o de características funcionais inerentes. Isso significa que prioriza dados imutáveis e avaliação de função, reduzindo assim os efeitos colaterais e facilitando a escrita de código de contrato inteligente mais limpo e menos propenso a erros.
Além disso, o Zinc inclui operações matemáticas seguras para evitar possíveis estouros, garantindo a segurança de todas as operações. Apesar de algumas limitações, como a ausência de loops infinitos e recursão, o Zinc simplifica o processo de depuração por meio do rastreamento de logs do console. Esses logs tornam mais fácil rastrear e resolver problemas transacionais em redes de teste ou na rede principal, melhorando assim a experiência de depuração.
Noir tem vantagens significativas na expansão do alcance de aplicações que podem aproveitar as capacidades de proteção de privacidade oferecidas por ZKP, melhorando assim a privacidade e a eficiência de verificação. Ele compila em uma representação intermediária chamada Representação Intermediária de Circuito Abstrato (Acer), que pode então ser compilada ainda mais em R1CS. A separação do sistema de comprovação de backend da linguagem em si permite que Noir suporte vários sistemas de comprovação, incluindo Aztec Brettenberg, Turbo Plonk, e integrações futuras potenciais como Groth16 e Halo2.
A linguagem inclui uma biblioteca padrão com funcionalidades eficientes como SHA-256 (uma função hash criptográfica que produz uma saída de tamanho fixo) e verificações Pedersen-Merkle (uma técnica de verificação criptográfica que utiliza compromissos de Pedersen e árvores de Merkle para garantir a integridade e consistência dos dados). O design do Noir, semelhante ao Rust, engloba recursos familiares para desenvolvedores de aplicativos, como funções, submódulos, tipos definidos pelo usuário (structs), declarações condicionais, loops e constantes globais. Além disso, esforços contínuos estão sendo feitos para desenvolver genéricos e funções de primeira classe para aprimorar ainda mais a expressividade do Noir.
É importante notar que Noir ainda está evoluindo, com possíveis limitações e bugs. No entanto, a equipe de desenvolvimento está comprometida com sua melhoria contínua e otimização.
o1js integra-se perfeitamente com bibliotecas e ferramentas JavaScript e TypeScript, oferecendo aos desenvolvedores um ecossistema robusto e amplo suporte da comunidade. Essa integração simplifica o processo de desenvolvimento e reduz a curva de aprendizado associada à adoção de novos ambientes de desenvolvimento. Além disso, oferece suporte total ao Visual Studio Code (VS Code), um editor de código amplamente utilizado, permitindo que os desenvolvedores aproveitem ao máximo recursos como conclusão de código, destaque de sintaxe e depuração para aprimorar a experiência de desenvolvimento.
Essencialmente, o1js é um framework ZK multifuncional que oferece ferramentas essenciais para criar provas ZK. Ele suporta uma variedade de programas ZK, abrangendo uma variedade de operações comprováveis embutidas, como aritmética básica, hash, assinatura, operações booleanas, comparações e muito mais. Com o framework o1js, você pode construir zkApps no Protocolo Mina, esses contratos inteligentes são executados no lado do cliente com entradas privadas.
Notavelmente, no início de setembro de 2023, a equipe do 0(1) Labs anunciou a transição do SnarkyJS para o o1js, enfatizando seu compromisso em melhorar o desempenho. Particularmente notável é sua conquista em reduzir o tempo de carregamento da biblioteca em 3-4 vezes, que se refere ao tempo necessário para importar o1js, um processo que poderia bloquear o thread principal. Para aplicativos Web, o tempo de carregamento é crucial para o tempo de execução do JavaScript e a renderização geral da página. Além disso, a equipe também atualizou a CLI do Mina zkApp, aprimorando a experiência de construção da interface do usuário, e anunciou mais melhorias na API do Nó de Arquivo para melhorar sua confiabilidade e clareza.
O conceito de Leo tem origem numa equipe de desenvolvimento liderada por Howard Wu, que idealiza um sistema que capacita desenvolvedores a construir aplicativos descentralizados com prioridade em privacidade e segurança. Inspirado nos princípios do Rust, o design do Leo também incorpora elementos similares ao JavaScript, facilitando uma sensação de familiaridade e facilidade durante o processo de desenvolvimento. Além disso, o Leo visa acelerar e simplificar o desenvolvimento ao oferecer uma plataforma de testes integrada, registro de pacotes e conversor de importação. Essa integração permite que os desenvolvedores foquem na lógica central de seus aplicativos sem serem sobrecarregados por questões infraestruturais.
Uma característica notável do Leo é o seu compilador, que transforma programas no formato de prova R1CS de baixo nível. A singularidade do compilador Leo reside em seu rigoroso processo de verificação formal. Esta verificação é crítica, pois vulnerabilidades podem surgir em múltiplos estágios, desde a programação inicial até a auditoria e compilação. Ao realizar verificações matemáticas rigorosas para garantir que o compilador esteja alinhado com a intenção do programador, o Leo visa minimizar o risco de erros não detectados ou vulnerabilidades potenciais, especialmente em contextos L2, ZK-rollups ou programas privados na plataforma Leo.
No entanto, é importante reconhecer que a funcionalidade do Circom é focada principalmente no desenvolvimento de circuitos ZK, o que pode torná-lo menos adequado para tarefas computacionais mais amplas. Os desenvolvedores que buscam recursos mais versáteis para atender a uma gama mais ampla de necessidades de desenvolvimento podem achar as habilidades da Circom um pouco limitadas. Nesses casos, os desenvolvedores podem precisar integrar outras linguagens de programação ou estruturas para atender a requisitos de desenvolvimento mais abrangentes.
Fonte da imagem: CircomA compatibilidade do Circom se concentra principalmente em sistemas amplamente utilizados de Prova de Conhecimento Zero (ZKP), como snarkjs e libsnark. Essa compatibilidade garante integração perfeita com esses sistemas comumente usados, mas também significa que os circuitos Circom herdam características específicas e limitações associadas a essas dependências. Desenvolvedores que preferem ou precisam de sistemas ZKP alternativos podem enfrentar desafios de compatibilidade ou precisar investir esforço extra para adaptar e integrar circuitos gerados pelo Circom em seus sistemas preferidos.
Computação Verificável: Lurk permite a prova da correção de suas expressões em condições de conhecimento zero, aumentando a confiança nos resultados da computação.
Zero Knowledge: Os usuários podem provar conhecimento sem revelar informações específicas além de entradas públicas, protegendo assim a privacidade.
Dados Endereçáveis por Conteúdo: Cada programa Lurk é equipado com um identificador de conteúdo único (CID), tornando-o compatível com IPFS e IPLD.
Turing Completeness: Lurk suporta a criação e prova de declarações computacionais arbitrárias.
Funções de Ordem Superior: Funções ocultas podem aceitar e retornar outras funções, facilitando a programação funcional expressiva.
Cálculos com Dados Privados: O Lurk permite lidar com dados privados garantindo uma saída provavelmente correta sem vazamentos de privacidade.
Ao construir circuitos de propósito geral, Lurk usa extensivamente o alocador de memória "cons" do Lisp, que combina expressões e gera referências através de hash. A chave está em provar que duas expressões realmente geram o mesmo hash. Essa verificação permite que Lurk realize cálculos dentro dos circuitos snark.
A funcionalidade do Lurk é rica, incluindo suporte para recursão infinita, loops, fluxo de controle condicional e vários sistemas de prova de back-end como Groth16, SnarkPack+ e Nova. Essa versatilidade abre portas para várias aplicações, incluindo cálculos verificáveis, manipulação de dados privados e execução de programas Turing-completos dentro de circuitos snark.





