SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
07.12.2024

Lição 255: Provas de Conhecimento Zero

As Provas de Conhecimento Zero (ZKP) são um conceito criptográfico fascinante que permite que uma parte prove a outra que conhece um valor sem revelar o próprio valor. No contexto de blockchain e contratos inteligentes, as ZKPs podem aumentar a privacidade e segurança, garantindo que dados sensíveis não precisem ser compartilhados diretamente com outros.

Nesta lição, abordaremos os conceitos básicos das Provas de Conhecimento Zero, seus tipos e como podem ser implementadas em um contrato inteligente Solidity.

Entendendo Provas de Conhecimento Zero

Uma Prova de Conhecimento Zero possui três características principais:

  1. Completude: Se a afirmação é verdadeira, um provador sincero pode convencer um verificador sincero desse fato.
  2. Solidez: Se a afirmação é falsa, nenhum provador desonesto pode convencer o verificador de que ela é verdadeira, exceto com uma pequena probabilidade.
  3. Zero Conhecimento: Se a afirmação é verdadeira, o verificador não aprende nada além desse fato.

Tipos de Provas de Conhecimento Zero

  1. ZKPs Interativas: Estas requerem múltiplas rodadas de comunicação entre o provador e o verificador.
  2. ZKPs Não Interativas: Estas não requerem comunicação de ida e volta e podem ser conduzidas em uma única mensagem, utilizando frequentemente uma string de referência comum.

Exemplo: Prova de Conhecimento Zero Interativa

Neste exemplo, ilustraremos uma simples Prova de Conhecimento Zero interativa, onde um provador demonstra que conhece o logaritmo discreto de um número sem revelá-lo.

Cenário

Alice quer provar a Bob que ela conhece o segredo x tal que g^x ≡ y (mod p), sem revelar x. Aqui:

  • g é um gerador,
  • y é o resultado da exponenciação,
  • p é um grande número primo.

Implementação Passo a Passo

  1. Pré-requisitos: Certifique-se de ter um ambiente Solidity configurado (por exemplo, Remix IDE) para implantar e interagir com o contrato.

  2. Código do Contrato Inteligente

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ProvaConhecimentoZero {
    uint256 public g; // Gerador
    uint256 public p; // Número primo
    uint256 public y; // g^x mod p

    constructor(uint256 _g, uint256 _p, uint256 _y) {
        g = _g;
        p = _p;
        y = _y;
    }

    // Função do provador para gerar prova
    function provarConhecimento(uint256 r) public view returns (uint256) {
        // Calcula a prova: z = g^r mod p
        return powMod(g, r, p);
    }

    // Função do verificador para verificar a prova
    function verificar(uint256 z, uint256 desafio) public view returns (bool) {
        // Verifica se g^r mod p é congruente a y^desafio * z mod p
        return (powMod(g, desafio, p) * z) % p == y;
    }

    // Função de exponenciação modular
    function powMod(uint256 base, uint256 expoente, uint256 modulo) internal pure returns (uint256) {
        uint256 resultado = 1;
        base = base % modulo;
        while (expoente > 0) {
            // Se o expoente é ímpar, multiplica a base pelo resultado
            if (expoente % 2 == 1) {
                resultado = (resultado * base) % modulo;
            }
            // Desloca o expoente para a direita por 1
            expoente = expoente >> 1; 
            // Base = base^2 % modulo
            base = (base * base) % modulo; 
        }
        return resultado;
    }
}

Explicação do Código

  • Construtor: Inicializa o contrato com o gerador g, o primo p e y.
  • provarConhecimento: Recebe um valor aleatório r como entrada e calcula a prova z como g^r mod p.
  • verificar: Recebe a prova z e um desafio para verificar se a relação é válida. Utiliza exponenciação modular para realizar os cálculos necessários.
  • powMod: Esta é uma função auxiliar para exponenciação modular eficiente.

Conclusão

As Provas de Conhecimento Zero são uma ferramenta poderosa para aumentar a privacidade e segurança em aplicações de blockchain. Elas permitem que os usuários provem o conhecimento de certas informações sem revelar as informações em si. Esta lição forneceu uma implementação simples de Prova de Conhecimento Zero interativa em Solidity. Ao utilizar as ZKPs, os desenvolvedores podem criar aplicativos descentralizados mais seguros e privados.

Como próximo passo, considere explorar as ZKPs não interativas, pois elas podem ser mais eficientes em blockchains onde os dados on-chain podem ser sensíveis.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!