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.
Cairo é a linguagem central para programas de computação geral que suportam provas STARK. Tem desempenhado um papel fundamental no sucesso do StarkNet e StarkEx, impulsionando a escalabilidade de aplicações na mainnet Ethereum. Notavelmente, Cairo tem sido fundamental no suporte a uma variedade de aplicações, incluindo dYdX, Sorare e Immutable X. O nome "Cairo" é derivado da abreviatura de "Representação Intermediária Algébrica da CPU." No âmbito das provas de conhecimento zero, funciona de forma semelhante a uma linguagem de montagem, permitindo que desenvolvedores familiarizados com linguagens de programação de baixo nível como C, C++ ou Solidity comecem mais facilmente.
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.
Zinc é uma linguagem de programação projetada especificamente para criar contratos inteligentes e circuitos SNARK na plataforma zkSync. Ela adota a sintaxe Rust, integra elementos do Solidity e oferece funcionalidades únicas.
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, uma DSL de código aberto desenvolvida pela Aztec e baseada em Rust, tem como objetivo simplificar a criação de circuitos ZK e programas ZK sem exigir um conhecimento criptográfico aprofundado. É considerada uma das linguagens mais acessíveis para escrever aplicações ZK compatíveis com qualquer sistema de prova. Noir foca em segurança, simplicidade e desempenho, oferecendo uma sintaxe de alto nível semelhante ao Rust. Ele abstrai a segurança criptográfica, simplificando o uso de primitivas criptográficas mantendo um alto desempenho.
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, anteriormente conhecido como SnarkyJS, é uma biblioteca TypeScript desenvolvida pela 0(1) Labs para criar contratos inteligentes usando a linguagem de programação SNARK. Ele aproveita totalmente tecnologias estabelecidas como Node.js e compatibilidade com navegadores para garantir fácil acesso e conveniência para os desenvolvedores.
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.
A blockchain Aleo se destaca no campo dos contratos inteligentes com um forte foco na proteção da privacidade. Em seu núcleo está a linguagem de programação Leo, uma linguagem tipada estaticamente inspirada no Rust. Projetada especificamente para desenvolver aplicativos privados, o Leo apoia os criadores que visam construir ecossistemas descentralizados seguros e confidenciais. O que realmente diferencia o Leo é seu papel pioneiro na introdução de um conjunto abrangente de ferramentas para aplicativos universais de conhecimento zero. Esse conjunto de ferramentas inclui um framework de testes, registro de pacotes, analisador de importação, compilador remoto e gerador de teoremas.
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.
Circom, uma Linguagem Específica de Domínio (DSL) meticulosamente elaborada para o desenvolvimento de circuitos ZK, é uma criação colaborativa de Jordi Baylina e da equipe iden3. O compilador Circom, escrito em Rust, funciona principalmente para compilar circuitos desenvolvidos usando a linguagem Circom. Notavelmente, Circom emergiu como a escolha preferida para aplicativos ZK excepcionais no mundo real, como Dark Forest e Tornado Cash. Sua popularidade é atribuída ao seu impressionante desempenho, que inclui tempos de prova no navegador rápidos por meio de provas WASM otimizadas, provas eficientes no lado do servidor via rapidsnark e verificação eficaz on-chain.
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: Circom
A 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.
Lurk é um dialeto Lisp de escopo estático influenciado por Scheme e Common Lisp, com uma característica única: permite a prova direta da correção da execução do programa usando zk-SNARKs, possibilitando verificação compacta e eficiente. Os principais usos do Lurk incluem:
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.
À medida que a diversidade de aplicações ZK cresce, as perspectivas para DSLs no domínio ZK são amplas. A chave para o sucesso de uma DSL reside em estabelecer uma comunidade próspera e uma biblioteca rica para enriquecer as experiências dos desenvolvedores. Aquelas DSLs que priorizam a compatibilidade com bibliotecas existentes podem aproveitar plenamente o conhecimento e os recursos de uma comunidade de desenvolvedores mais ampla. Essa abordagem auxilia na integração mais suave, acelera o desenvolvimento e oferece maior flexibilidade na implementação de aplicações ZK. Tais esforços colaborativos são cruciais para nutrir um ecossistema mais robusto em torno de DSLs, oferecendo benefícios tangíveis aos desenvolvedores e impulsionando ainda mais a adoção e a eficácia da tecnologia ZK.
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.
Cairo é a linguagem central para programas de computação geral que suportam provas STARK. Tem desempenhado um papel fundamental no sucesso do StarkNet e StarkEx, impulsionando a escalabilidade de aplicações na mainnet Ethereum. Notavelmente, Cairo tem sido fundamental no suporte a uma variedade de aplicações, incluindo dYdX, Sorare e Immutable X. O nome "Cairo" é derivado da abreviatura de "Representação Intermediária Algébrica da CPU." No âmbito das provas de conhecimento zero, funciona de forma semelhante a uma linguagem de montagem, permitindo que desenvolvedores familiarizados com linguagens de programação de baixo nível como C, C++ ou Solidity comecem mais facilmente.
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.
Zinc é uma linguagem de programação projetada especificamente para criar contratos inteligentes e circuitos SNARK na plataforma zkSync. Ela adota a sintaxe Rust, integra elementos do Solidity e oferece funcionalidades únicas.
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, uma DSL de código aberto desenvolvida pela Aztec e baseada em Rust, tem como objetivo simplificar a criação de circuitos ZK e programas ZK sem exigir um conhecimento criptográfico aprofundado. É considerada uma das linguagens mais acessíveis para escrever aplicações ZK compatíveis com qualquer sistema de prova. Noir foca em segurança, simplicidade e desempenho, oferecendo uma sintaxe de alto nível semelhante ao Rust. Ele abstrai a segurança criptográfica, simplificando o uso de primitivas criptográficas mantendo um alto desempenho.
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, anteriormente conhecido como SnarkyJS, é uma biblioteca TypeScript desenvolvida pela 0(1) Labs para criar contratos inteligentes usando a linguagem de programação SNARK. Ele aproveita totalmente tecnologias estabelecidas como Node.js e compatibilidade com navegadores para garantir fácil acesso e conveniência para os desenvolvedores.
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.
A blockchain Aleo se destaca no campo dos contratos inteligentes com um forte foco na proteção da privacidade. Em seu núcleo está a linguagem de programação Leo, uma linguagem tipada estaticamente inspirada no Rust. Projetada especificamente para desenvolver aplicativos privados, o Leo apoia os criadores que visam construir ecossistemas descentralizados seguros e confidenciais. O que realmente diferencia o Leo é seu papel pioneiro na introdução de um conjunto abrangente de ferramentas para aplicativos universais de conhecimento zero. Esse conjunto de ferramentas inclui um framework de testes, registro de pacotes, analisador de importação, compilador remoto e gerador de teoremas.
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.
Circom, uma Linguagem Específica de Domínio (DSL) meticulosamente elaborada para o desenvolvimento de circuitos ZK, é uma criação colaborativa de Jordi Baylina e da equipe iden3. O compilador Circom, escrito em Rust, funciona principalmente para compilar circuitos desenvolvidos usando a linguagem Circom. Notavelmente, Circom emergiu como a escolha preferida para aplicativos ZK excepcionais no mundo real, como Dark Forest e Tornado Cash. Sua popularidade é atribuída ao seu impressionante desempenho, que inclui tempos de prova no navegador rápidos por meio de provas WASM otimizadas, provas eficientes no lado do servidor via rapidsnark e verificação eficaz on-chain.
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: Circom
A 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.
Lurk é um dialeto Lisp de escopo estático influenciado por Scheme e Common Lisp, com uma característica única: permite a prova direta da correção da execução do programa usando zk-SNARKs, possibilitando verificação compacta e eficiente. Os principais usos do Lurk incluem:
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.
À medida que a diversidade de aplicações ZK cresce, as perspectivas para DSLs no domínio ZK são amplas. A chave para o sucesso de uma DSL reside em estabelecer uma comunidade próspera e uma biblioteca rica para enriquecer as experiências dos desenvolvedores. Aquelas DSLs que priorizam a compatibilidade com bibliotecas existentes podem aproveitar plenamente o conhecimento e os recursos de uma comunidade de desenvolvedores mais ampla. Essa abordagem auxilia na integração mais suave, acelera o desenvolvimento e oferece maior flexibilidade na implementação de aplicações ZK. Tais esforços colaborativos são cruciais para nutrir um ecossistema mais robusto em torno de DSLs, oferecendo benefícios tangíveis aos desenvolvedores e impulsionando ainda mais a adoção e a eficácia da tecnologia ZK.