WEB3DEV

Cover image for Uso do zk-SNARKs dentro da Infraestrutura Blockchain
Paulo Gio
Paulo Gio

Posted on

Uso do zk-SNARKs dentro da Infraestrutura Blockchain

https://miro.medium.com/v2/resize:fit:1100/format:webp/1*OyC2ztCjXN_-8hR5TYUYgw.png

Existem muitos aspectos positivos da internet atual, também conhecida como Web 2.0. É escalável, rápida e, até certo ponto, segura. Também é amigável ao usuário, ou seja, qualquer pessoa, independentemente da idade, pode acessá-la sem impedimentos - a única coisa necessária é uma conexão com a internet. Mas, apesar de todas as vantagens, um grande problema que não é discutido o suficiente é a centralização. Por que a centralização é um problema tão grande?

As autoridades governam

Cada pedaço de informação transmitida de nossos computadores pela internet, cada conta bancária com nosso saldo sendo apenas um campo de número em um banco de dados que pode ser excluído, cada documento legal que pode ser invalidado por uma única pessoa que não é competente o suficiente e cometeu um erro. Pode haver objeções ao argumento de que tais problemas não ocorreriam no mundo real porque somos protegidos por lei e guiados pela confiança. De fato, isso é verdade. Mas a lei não é um axioma; ela pode ser interpretada e a confiança pode ser quebrada. Isso significa que temos poder limitado sobre nossos ativos digitais e os dados armazenados em bancos de dados estrangeiros, sem capacidade de eliminar erros humanos.

Outra questão relacionada à abordagem-padrão da Web 2.0 na internet é a exploração. Os dados geralmente são armazenados em um único lugar, correndo o risco de perda em caso de eventos inesperados, como um incêndio nos servidores de um provedor de nuvem ou vazamentos de dados devido ao acesso por muitos funcionários. Houve múltiplos exemplos de vazamentos de dados em 2022 em vários setores. A Web 3.0, como a próxima iteração da internet, pode apresentar uma solução potencial para esses problemas. O novo conceito de propriedade e identidade está sendo introduzido, pois finalmente podemos possuir ativos digitais, provas e dados que ninguém pode nos tirar, graças à criptografia. A Web 3.0 aproveita a tecnologia naturalmente imutável da blockchain e armazena simultaneamente dados em vários nós. Se um ou mais nós forem destruídos, outro provavelmente poderá fornecer os dados. Apesar dessas vantagens, a blockchain também possui algumas desvantagens. Algumas serão resolvidas à medida que a tecnologia amadurecer (escalabilidade, experiência do usuário), e outras podem ser resolvidas com novas tecnologias (privacidade). Eu gostaria de focar no elemento de privacidade da blockchain. Cada pedaço de dados que entra e sai da blockchain é público. Mas e se eu quiser encaminhar informações confidenciais? Eu proponho argumentos que o uso de provas de conhecimento zero (zero-knowledge proofs) pode superar essa limitação.

Observação: Este projeto discute o uso de provas de conhecimento zero para blockchains públicas compatíveis com a EVM sem suporte nativo para a ocultação de dados. Se houver a necessidade de privacidade e controle absolutos, o Hyperledger Fabric é uma solução adequada entre muitas outras.

O que é uma prova de conhecimento zero?

Bem, basicamente é uma ferramenta para provar alguma informação sem divulgar essa informação. No contexto de contratos inteligentes, quero provar ao contrato inteligente que conheço, digamos, uma pré-imagem de uma string criptografada com hash (ou seja, uma senha). Um protocolo de conhecimento zero deve satisfazer os seguintes critérios:

  1. Completude: se a afirmação for verdadeira, então um provador pode convencer um verificador
  2. Solidez: um provador desonesto não pode convencer o verificador de uma declaração falsa
  3. Conhecimento zero: a interação só revela se uma afirmação é verdadeira e nada mais

Aplicações

Uma vez que a blockchain é pública por natureza, toda entrada, saída e estado é publicamente visível. Isso é indesejado quando precisamos enviar informações privadas para um contrato inteligente que executa lógica com base nessas informações. Uma solução para esse problema seria usar uma prova de conhecimento zero, implementado em vários domínios.

Saúde

Houve pelo menos dez casos importantes de vazamentos de dados em hospitais em 2022. Os dados são geralmente armazenados em bancos de dados convencionais, que oferecem um alto grau de segurança, mas não são infalíveis. Com a blockchain e as provas de conhecimento zero, podemos superar esse risco. Suponha que tenhamos um sistema de saúde baseado em blockchain e uma identidade blockchain atribuída a cada paciente. Cada paciente poderia provar que sofre de uma doença grave e solicitar tratamento gratuito no hospital sem revelar sua identidade. Outro exemplo de uso seria provar a doença de alguém e, em seguida, receber um pagamento mensal como suporte financeiro em tempos de necessidade.

Social

A prova de conhecimento zero também pode ser usada no domínio social. Uma vez que essa tecnologia preserva bem a privacidade, pode ser usada para construir sistemas de votação privados baseados em blockchain. Um ótimo exemplo desse uso seria em uma Organização Autônoma Descentralizada (DAO). Isso se traduz como um sistema blockchain guiado por contratos inteligentes onde usuários individuais podem votar em mudanças feitas nesse sistema usando tokens (configuração de recompensas de recursos, taxa de negociação em mercados, mudanças de protocolo, etc.). Manter a privacidade dos votos seria um grande benefício quando os endereços da carteira são conhecidos e vinculados a uma pessoa real - isso acontece com bastante frequência se o KYC (Know Your Customer, ou seja, Conheça Seu Cliente) for exigido para usar os serviços blockchain de um provedor. Outro exemplo seria provar à blockchain que uma pessoa está em uma situação de vida difícil e, se algumas condições forem atendidas, essa pessoa pode solicitar suporte financeiro. A blockchain é fenomenal porque cada transação leva apenas alguns segundos no máximo (exceto Bitcoin) - o que significa que os tokens com valor financeiro podem ser transferidos instantaneamente. Isso poderia ter uma importância considerável em caridade e filantropia.

Entretenimento

Como a prova de conhecimento zero é uma ferramenta para provar informações sem divulgá-las ao verificador, há oportunidades ilimitadas para usar essa tecnologia em jogos. Um exemplo seria jogos tipo sudoku (quebra-cabeças, palavras cruzadas, batalha naval, etc.) ou jogos de perguntas e respostas. O jogador provará ao verificador que sabe a resposta para o problema (resposta correta, posição do barco inimigo, etc.) e o verificador verificará a prova. Se a prova estiver correta, o verificador enviará uma recompensa ao jogador na forma de NFT, criptomoeda ou atualizando o estado do jogo. O benefício significativo dessa abordagem é que as respostas permanecem ocultas e a recompensa é processada imediatamente, o que pode motivar os jogadores.

Educação

Blockchain e provas de conhecimento zero podem ser usados de forma eficaz em softwares de governança universitária. Os candidatos podem se tornar estudantes da universidade se atenderem aos requisitos estabelecidos pela universidade. Esses requisitos podem ser uma pontuação acima de 90 pontos percentuais em um teste da empresa SCIO ou um exame de admissão bem-sucedido. Essas informações serão inseridas na blockchain como prova pelas autoridades relevantes; o contrato inteligente de registro verificará então essas provas. Se a verificação for bem-sucedida, o candidato se tornará um aluno. Depois que o aluno estiver registrado, ele pode receber uma bolsa de estudos por suas conquistas, usar descontos para outros serviços que verificarão que essa pessoa é realmente um aluno na universidade, etc.

Houve recentes casos de discriminação estudantil em universidades tchecas. Isso representa outro aspecto positivo de tal sistema baseado em blockchain. Este sistema pode ser construído para que todas as informações dos estudantes sejam públicas, mas anônimas (criptografadas). Isso protegeria os alunos contra a discriminação com base em suas características individuais.

Agora vamos para a parte prática.

Neste exemplo, me concentro em provas de conhecimento zero não interativas, uma vez que não é possível comunicar-se com a blockchain repetidamente dentro da mesma sessão (pelo menos de maneira significativa). Atualmente, existem dois tipos principais de protocolos de provas de conhecimento zero não interativas: zk-SNARK e zk-STARK.

O zk-SNARK foi introduzido em 2012, então já houve uma ampla adoção em projetos como a blockchain ZCash e muitos outros. O zk-STARK existe desde 2018, então é relativamente novo. Eu escolhi o zk-SNARK para este exemplo porque é mais fácil de entender e já oferece algumas fontes para obter informações e uma comunidade sólida de desenvolvedores.

Primeiramente, devo passar por várias etapas antes de mergulhar neste estudo de caso. Antes que o usuário possa se registrar como estudante na CTU, uma condição deve ser cumprida: eles precisam fazer pelo menos uma tentativa de exame da SCIO com uma pontuação igual ou superior a 90 pontos percentuais. Se essa condição for atendida, então os usuários podem se registrar. O problema é que tudo precisa estar na cadeia para que os contratos inteligentes possam recuperar (e verificar) essas informações, então como a SCIO pode aplicar um teste a uma pessoa? Precisamos criar um contrato inteligente chamado Registry. A autoridade atribuirá, secretamente, os identificadores personID e seedID a cada pessoa (quando essa pessoa fizer 18 anos, por exemplo). Cada pedaço de informação será armazenado como um hash, então não há risco de vazamento de informações. A autoridade da SCIO registrará as tentativas de teste para essa pessoa em seu contrato inteligente para que o contrato inteligente de registro da CTU possa verificar.

Assim que um aluno estiver registrado, teremos a infraestrutura de autenticação pronta para receber recursos adicionais.

Visão geral da infraestrutura da blockchain

A infraestrutura da blockchain consiste em um contrato inteligente de registro (registry), um contrato inteligente da SCIO, um contrato inteligente de cadastro (registration) e um contrato inteligente de login. Um contrato inteligente de verificação verificará as provas para cada um desses contratos inteligentes armazenados na variável verifier.

Cadastro

Sugiro um cadastro totalmente privado e não repetitivo, ou seja, o usuário não pode se cadastrar duas vezes como a mesma pessoa (veja o esquema abaixo).

https://miro.medium.com/v2/resize:fit:933/1*diY885Nvq7Po4aTXWFnx3A.png

Maior resolução aqui

O processo começa com uma pessoa querendo se inscrever na CTU. Em primeiro lugar, a pessoa precisa ter uma identidade na blockchain. Se a pessoa não tiver uma, essa identidade deve ser emitida. Essa identidade é emitida pela autoridade de registro (município, por exemplo) no contrato inteligente Registry.sol. A autoridade de registro gerará uma prova usando o personID e o seedID criados fora da cadeia. Esse personID e seedID serão entregues de modo privado à pessoa. A parte pública desta prova está vinculada ao personID criptografado com hash na blockchain para verificação posterior por meio do método setPerson. Uma vez que a verificação de uma prova é necessária, a prova será verificada usando informações públicas armazenadas no contrato inteligente de registro, para garantir que um usuário externo não possa provar o conhecimento do personID e seedID de outra pessoa. A parte de verificação é feita por meio do método verify, que usa a prova enviada, o personID criptografado com hash e as entradas públicas restantes. O contrato inteligente de registro chamará o contrato inteligente verificador usando o método VerifyTx e incluirá os hashes accessLow e accessHigh dessa pessoa nos atributos da função. O verificador de registro pode verificar a prova enviada pela pessoa criada no cliente com RegistryVerifier.zok.

Em seguida, essa pessoa precisa ter pelo menos um resultado do exame SCIO com pontuação acima de 90 pontos percentuais (o usuário pode fazer quantas tentativas quiser). Os supervisores do exame verificarão se a pessoa que está escrevendo o exame conhece seu personID e seedID (a pessoa divulgará o personID criptografado com hash e uma prova verificável no contrato inteligente Registry.sol). A cada tentativa, a autoridade SCIO adicionará uma prova de uma pontuação à blockchain (de que a pontuação é realmente igual ou superior a 90 pontos percentuais) criada via SCIOVerifier.zok e a vinculará ao personID criptografado com hash dentro do contrato inteligente SCIO via método addExamResult. Uma vez que o usuário esteja confiante com os resultados, ele pode prosseguir com o registro efetivo na CTU.

Primeiramente, precisamos assumir que cada candidato tem uma carteira conectada ao cliente para garantir que a mesma prova (enviada por outra pessoa) dos dados da transação não possa ser retirada da blockchain pública e reutilizada. Isso será garantido com uma chave pública na própria prova e uma chave privada assinando a transação.

Em segundo lugar, o usuário cria um nome de usuário e senha para autenticação dentro da infraestrutura de blockchain da CTU.

Em terceiro lugar, o usuário precisa apresentar uma prova de que realmente possui a identidade (ou seja, conhece o personID e o seedID) e uma prova de que conhece a pré-imagem da senha criada juntamente com a senha criptografada e a chave pública gerada (ou seja, o endereço da carteira, que por padrão está disponível dentro do contexto da função do contrato inteligente graças à assinatura da chave privada).

Em quarto lugar, o contrato inteligente de cadastro verifica se o usuário tem pelo menos uma tentativa com mais de 90 pontos percentuais no contrato inteligente SCIO, o contrato inteligente SCIO verifica a identidade e o contrato inteligente de cadastro da CTU verifica se o usuário sabe a senha da pré-imagem. Se tudo ocorrer sem problemas, o contrato inteligente adicionará uma entrada ao contrato inteligente de cadastro e a pessoa finalmente será cadastrada como estudante.

Login

https://miro.medium.com/v2/resize:fit:933/1*JW3tMfjZZasZ1OhD_4WiEA.png

Maior resolução aqui

Suponha que o usuário queira usar um contrato inteligente com autenticação como requisito (o método authenticate do contrato inteligente de login precisa retornar verdadeiro). Nesse caso, o usuário deve enviar uma prova para o contrato inteligente de login de que ele conhece a senha (que ele enviou durante o processo de cadastro). O contrato inteligente também verifica se o usuário é um aluno da CTU. Se tudo for verificado, então a funcionalidade pode ser usada. Uma desvantagem desse método é que o usuário (ou outra pessoa) só pode reutilizar uma prova que gerou anteriormente e passar na autenticação desse sistema. Podemos superar esse problema da mesma forma que no processo de cadastro. No lado do cliente, a chave pública da carteira do usuário será incluída na prova e a chave privada assinará a transação. Dessa forma, podemos garantir que ninguém além do usuário com o par de chaves correto possa enviar uma prova válida obtida de uma entrada pública da blockchain.

Este sistema de autenticação pode ser conectado a todos os contratos inteligentes e habilitar recursos apenas para os alunos. Recursos possíveis incluem sacar o subsídio ou recompensas, solicitar um exame, competir em mini-jogos, etc. É também muito mais seguro do que as soluções convencionais que usam a abordagem da Web 2.0, porque o nome de usuário, a senha e outras informações não serão transmitidos pela internet.

Possíveis melhorias

Neste exemplo, apenas aqueles usuários (que se candidatam a uma CTU) que já possuem uma carteira são considerados (a assinatura do cadastro é necessária, caso contrário a prova pode ser reutilizada). Seria bem fácil criar um acesso Web2 a este sistema Web3 simplesmente usando uma metatransação com a geração de uma carteira para cada transação, e então as autoridades teriam que pagar pelas taxas de gás. O usuário pode então criar um nome de usuário e senha no contrato de cadastro da CTU e autenticar cada vez que quiser usar uma funcionalidade, usando apenas o formulário de login clássico.

Conclusão

A Web 2.0 é notável, mas tem algumas grandes desvantagens em relação à privacidade e propriedade. Estamos em uma fase de experimentação com o que podemos fazer com a tecnologia blockchain em termos de privacidade, propriedade e transparência. Embora a blockchain seja impressionante, ela é limitada em casos em que a privacidade é o aspecto mais importante de um sistema. A prova de conhecimento zero representa uma abordagem que pode resolver apenas alguns dos problemas. No entanto, funciona muito bem em protocolos blockchain como o protocolo ZCash ou o famoso rollup de conhecimento zero (zero-knowledge rollup, ou zkRollup), amplamente utilizado em soluções de camada 2, como a Polygon. Como este projeto demonstra, também pode funcionar suficientemente em áreas onde manter a privacidade em cadeias compatíveis com a EVM é uma prioridade. A comunidade de desenvolvedores está interessada em aprimorar as provas de conhecimento zero, já que existem protocolos que prevalecerão na era pós-quântica, sugerindo que essa tecnologia será mais amplamente utilizada no futuro.

Hoje, a blockchain é diferente da blockchain que veremos amanhã. É um ecossistema em constante evolução com grande potencial, mas às vezes precisa de um pequeno impulso tecnológico para atender às demandas das pessoas.

Este artigo é baseado no meu projeto semestral como parte do curso B4BPROJ6 da CTU em 2023.

Repositório Github com prova de conceito funcional aqui.

Artigo original publicado por Jakub Strnad. Traduzido por Paulinho Giovannini

Latest comments (0)