A criptografia homomórfica com limiar (threshold) é um bloco de construção fundamental do protocolo de votação DAVINCI. Ela garante que nenhuma parte consiga descriptografar sozinha os resultados da votação: a chave de descriptografia é dividida entre múltiplos nós independentes, e os resultados só podem ser descriptografados quando um número suficiente deles coopera.
Antes de qualquer descriptografia, porém, esses nós precisam primeiro criar a chave em conjunto. Esse processo se chama geração distribuída de chaves (DKG, Distributed Key Generation). Estamos construindo uma versão de DKG projetada especificamente para ambientes blockchain, nos quais cada participante deve provar que sua contribuição está correta antes que ela seja aceita on-chain.
O DAVINCI garante a privacidade do processo de votação por meio de um esquema de criptografia homomórfica com limiar. Especificamente, é usado um criptossistema ElGamal com limiar sobre curvas elípticas. Mensagens criptografadas podem ser combinadas para produzir uma criptografia da soma dos textos originais sem descriptografá-las. Esse esquema permite descriptografar um texto cifrado específico sem jamais revelar a chave secreta de limiar, de modo que a apuração final pode ser descriptografada enquanto as cédulas individuais permanecem confidenciais.
Visão geral do protocolo¶
O NI-DKG é um protocolo nativo de blockchain projetado para ser completamente não interativo, impondo a correção no momento da submissão por meio de provas ZK.
Em vez de fases de reclamação e rodadas de disputa, cada participante deve provar que sua contribuição está correta no momento em que a submete. O contrato inteligente (smart contract) verifica a prova imediatamente: submissões válidas são aceitas, e as inválidas são rejeitadas na hora. Não há idas e vindas nem contestações reativas. Como todo o histórico fica registrado on-chain, também obtemos verificabilidade pública.
Além de ser não interativo por design, o protocolo NI-DKG também é operacionalmente assíncrono na prática. Suas fases são definidas por números de bloco, e não por prazos de resposta frágeis.
Por que isso importa¶
Os protocolos de DKG assistidos por blockchain existentes hoje dependem de fases de disputa: se um nó recebe dados ruins, registra uma reclamação on-chain, e o acusado deve responder antes de um prazo. Isso adiciona rodadas, custos de gas e superfície de ataque: nós honestos podem ser excluídos se sua resposta atrasar, e atores maliciosos podem apresentar reclamações frívolas para sabotar o processo. Trabalhos acadêmicos recentes sobre DKG totalmente assíncrono produziram resultados teóricos impressionantes, mas esses protocolos são altamente complexos.
Mais importante: o NI-DKG é construído inteiramente a partir de primitivas criptográficas padrão, bem compreendidas. Não introduzimos novas suposições; em vez disso, aplicamos técnicas estabelecidas de maneira mais prática. O protocolo ocupa um meio-termo pragmático e prático: mais simples que as construções totalmente assíncronas, porém mais robusto que esquemas síncronos ingênuos. Ele herda o modelo de tempo da blockchain subjacente, natural para aplicações on-chain, e o combina com provas de conhecimento zero proativas para eliminar procedimentos interativos de reclamação, um ponto fraco comum nos designs existentes. O resultado é um protocolo mais seguro e adequado a implantações no mundo real.
Fases do protocolo NI-DKG¶
Geração
- Iniciação: o organizador publica os parâmetros
(n, t).
- Manifestação de interesse: os nós elegíveis sinalizam que estão prontos (opcionalmente com stake).
- Seleção de nós: seleção de
n nós usando a aleatoriedade da chain; o processo é abortado se a política não for atendida.
- Processo principal de DKG: cada nó publica compromissos polinomiais e frações (shares) criptografadas, junto com uma prova ZK de correção.
- Finalização: o organizador calcula a chave pública
PK e os compromissos das frações privadas, e os publica na blockchain junto com uma prova ZK de correção.

Descriptografia
- Publicação do texto cifrado: um texto cifrado
(C1, C2) é publicado junto com o identificador da rodada. Os nós sabem quando esses textos cifrados são publicados.
- Publicação das descriptografias parciais: os nós publicam uma descriptografia parcial de
C1, junto com uma prova de igualdade de logaritmo discreto.
- Descriptografia: assim que
t ou mais descriptografias parciais tiverem sido publicadas, o contrato inteligente pode ser chamado para recuperar a mensagem.

Divulgação opcional da chave
Observe que a divulgação da chave não faz parte do protocolo DAVINCI; normalmente essa etapa não é necessária, já que é possível provar a fase de descriptografia sem precisar publicar a chave secreta.
- Iniciação: o pedido de divulgação da chave secreta pode ser enviado pelo organizador ou disparado automaticamente, desde que os parâmetros da política permitam.
- Publicação das frações da chave secreta: cada nó participante publica sua fração do segredo.
- Cálculo da chave secreta: assim que
t ou mais valores tiverem sido submetidos, qualquer pessoa pode calcular a chave secreta.

Por dentro do protocolo¶
O protocolo cobre o ciclo de vida completo: geração de chaves, descriptografia com limiar e divulgação opcional da chave. Em cada etapa, o contrato inteligente atua como camada de coordenação e verificação, enquanto as provas de conhecimento zero movem todas as verificações criptográficas pesadas para fora da chain. Há uma separação clara de responsabilidades: a blockchain cuida da ordenação e do registro público; o sistema de provas garante a correção.
Os blocos de construção criptográficos são os seguintes:
- Shamir + Feldman VSS: polinômios com compromissos públicos dos coeficientes.
- Hashed ElGamal para criptografar as frações.
- Prova de igualdade DLOG de Chaum-Pedersen, usada nas descriptografias parciais.
- zk-SNARKs (Groth16, FFLONK, …) para verificação on-chain.
Circuitos:
<!--kg-card-begin: html-->
| Fase |
Propósito |
Saída / O que prova |
| Geração, fase 4: processo principal de DKG |
Prova de contribuição por participante |
A contribuição de DKG de cada participante é válida. |
| Geração, fase 5: cálculo das frações secretas e da chave pública |
Finalização |
A chave pública final e os compromissos das frações são derivados corretamente. |
| Descriptografia, fase 2: publicação das descriptografias parciais |
Descriptografia parcial + prova DLEQ (por nó) |
A descriptografia parcial de cada nó está correta e acompanhada de uma prova DLEQ de correção. |
| Descriptografia, fase 3: descriptografia |
Combinar descriptografias parciais → texto original |
A combinação de descriptografias parciais válidas produz o texto original correto. |
| Divulgação opcional da chave, fase 2: publicação das frações da chave secreta |
Verificação de fração vs. compromisso (por nó) |
Cada nó prova que sua fração revelada corresponde ao compromisso publicado anteriormente. |
| Divulgação opcional da chave, fase 3: cálculo da chave secreta |
Reconstruir a chave secreta a partir de t frações |
A reconstrução da chave secreta a partir das (t) frações do limiar está correta. |
<!--kg-card-end: html-->
Limitações¶
Como as fases estão atreladas a números de bloco, o protocolo herda a sincronia parcial da chain que o hospeda. A verificação on-chain também impõe restrições de escala, mas, com as estratégias de redução de entradas descritas no artigo, podemos realisticamente comportar comitês de 40 a 50 participantes. Isso está bem dentro da faixa necessária para a maioria das implantações práticas.
Embora o DKG proposto seja flexível e possa ser adaptado a outros esquemas de criptografia, o uso do Groth16 sobre a BN254 implica que a escolha mais eficiente é um esquema de criptografia definido sobre o corpo escalar da BN254, ou seja, usando a curva BabyJubJub.
Onde estamos¶
O design do protocolo está completo. Um rascunho de artigo científico descreve a construção completa, apresenta especificações detalhadas dos circuitos e analisa estratégias para reduzir os custos on-chain. Os próximos passos são a implementação e o benchmarking nas chains EVM alvo.
Aqui está uma PoC em Golang para validar o esquema básico.
O artigo completo está disponível aqui.
Este é um projeto de código aberto. Se você quiser contribuir, seja com desenvolvimento, ideias, recursos ou financiamento, entre em contato conosco.
Contato