Quatro palavras desta página.
Cada passo elementar da conta que a prova cobre. "Nasceu há 18 anos ou mais" vira uns dois mil passos; conferir um SHA-256 vira duzentos mil. Mais passos, prova mais cara.
Um trabalho feito uma vez antes de qualquer prova, que gera as chaves de provar e de conferir. Não entra no custo de cada prova.
O arquivo que quem prova precisa ter à mão. Pode ser grande: de 371 kB a 51 MB aqui. É pública; não guarda segredo de ninguém.
A receita matemática que transforma a conta numa prova. Medimos dois dos mais usados, Groth16 e PLONK, que trocam tamanho por conveniência.
Quatro afirmações, dois sistemas, uma máquina.
Tudo rodou num Apple M2 com 8 GB de memória, usando a gnark (versão 0.16.3), uma biblioteca aberta em Go, sobre a curva BN254, que é a mais usada nesse tipo de prova. A biblioteca usa todos os núcleos da máquina ao provar e conferir.
Para cada afirmação, contamos quantos passos a conta tem, medimos a preparação uma vez e depois o tempo de gerar a prova (melhor de cinco tentativas no Groth16, de três no PLONK) e de conferir (melhor de vinte). "Melhor de" quer dizer o tempo mais rápido: é o que a máquina consegue quando nada mais atrapalha.
As afirmações não são de brinquedo. A de idade e a de saldo estão presas a um compromisso, um lacre publicado antes pelo emissor, então não dá para provar a idade de um documento inventado. A da lista usa uma árvore com 1.048.576 folhas. A do SHA-256 é a impressão digital usada em quase tudo na internet.
| Afirmação | Sistema | Restrições | Preparação | Gerar a prova | Conferir | Tamanho da prova | Chave de prova |
|---|---|---|---|---|---|---|---|
| Mais de 18 | Groth16 | 2.184 | 184 ms | 26 ms | 1,42 ms | 164 B | 371 kB |
| PLONK | 4.085 | 65 ms | 91 ms | 2,11 ms | 520 B | – | |
| Saldo acima de X | Groth16 | 2.249 | 236 ms | 25 ms | 1,38 ms | 164 B | 381 kB |
| PLONK | 4.212 | 54 ms | 169 ms | 2,12 ms | 520 B | – | |
| Na lista de 1 milhão | Groth16 | 13.261 | 1,9 s | 220 ms | 1,94 ms | 164 B | 2,5 MB |
| PLONK | 17.781 | 414 ms | 859 ms | 2,82 ms | 520 B | – | |
| Texto por trás do SHA-256 | Groth16 | 200.599 | 45,7 s | 1,6 s | 3,25 ms | 196 B | 51,3 MB |
| PLONK | 601.601 | 7,3 s | 40,6 s | 2,49 ms | 584 B | – |
No PLONK, a chave de prova não foi medida, e a preparação usada foi uma versão de teste, gerada na hora. Em produção, ela viria de uma cerimônia pública feita uma vez para todas as afirmações. Isso não muda o tempo de provar nem de conferir.
Provar é caro. Conferir é barato.
O tempo de gerar a prova cresce com o tamanho da conta: 26 ms para a idade, 220 ms para a lista, 1,6 s para o SHA-256 no Groth16, e até 40 s no PLONK. Já conferir fica entre 1,4 e 3,3 milissegundos em todos os casos, não importa quão grande seja a conta por trás.
É essa diferença que torna a ideia útil. Quem prova paga uma vez, no próprio aparelho. Quem confere, um site com milhões de visitas ou um auditor com milhares de relatórios, paga quase nada por prova. Na idade, provar custa o mesmo que umas 18 conferências; no SHA-256 com PLONK, umas 16 mil.
Por que o SHA-256 é tão mais caro? Ele foi desenhado para computadores comuns, feito de operações com bits. Dentro de uma prova, cada bit vira uma conta. A impressão digital que usamos na idade, no saldo e na lista (MiMC) foi desenhada justamente para caber em provas: faz o mesmo papel com centenas de vezes menos passos.
Menor e mais rápido, ou mais fácil de preparar.
A prova mais compacta
Provas de 164 bytes para quase qualquer afirmação, e as mais rápidas de gerar nesta bancada. O preço está na preparação: cada afirmação precisa da sua, e ela usa um número secreto que tem de ser destruído depois.
Se alguém guardar esse número, consegue fabricar provas falsas que passam na conferência. Por isso a preparação real é feita numa cerimônia, com muitos participantes: basta um deles destruir a sua parte para o conjunto ficar seguro.
Uma preparação para todas
Uma única preparação, feita uma vez, serve para qualquer afirmação até um certo tamanho. Mudou a regra, não precisa de cerimônia nova.
O preço: provas de 520 bytes, três vezes maiores, e aqui de 3 a 25 vezes mais lentas para gerar. Conferir custa o mesmo. Nesta bancada, a preparação foi uma versão de teste, que não serve para uso real.
Há ainda sistemas que dispensam qualquer preparação secreta, conhecidos como STARKs, em geral com provas bem maiores. Não os medimos aqui.
Tentamos enganar. Nenhuma prova falsa passou.
Um teste que só mostra o caso certo não diz muito. Então pedimos provas que deveriam ser impossíveis, e conferimos que a biblioteca se recusou a gerá-las ou a aceitá-las.
| Tentativa | Como | Resultado |
|---|---|---|
| Menor de idade | Nascida em 2010, provando mais de 18 em 2026 | recusada |
| Documento de outra pessoa | Data de nascimento que não bate com o lacre publicado pelo emissor | recusada |
| Prova reaproveitada | Prova válida para 2026, apresentada como se fosse do ano 2000 | recusada |
| Saldo insuficiente | Saldo de 9.000 provando que passa de 10.000 | recusada |
O que esta bancada não mediu.
O celular
Na vida real, quem prova a idade é o celular, com menos memória e sem ventoinha. Um M2 com oito núcleos é otimista. A chave de 51 MB do SHA-256 pesaria num aparelho simples.
O navegador
Provas geradas dentro de uma página web costumam ser bem mais lentas que o mesmo código rodando direto na máquina. Não medimos.
Outras bibliotecas
A prova de idade que o Google abriu em 2025 (Longfellow) usa outro desenho, feito para credenciais de celular. Os números dela não são estes.
Uma rodada, uma máquina
"Melhor de cinco" mostra o que a máquina consegue sem interferência, não a média de um servidor ocupado. E a memória usada ao provar ficou de fora.
Rode você mesmo.
O código da bancada tem pouco mais de 200 linhas em Go e está publicado aqui: main.go, falsa_test.go, go.mod e go.sum (com um README). Baixe os quatro numa pasta e, com Go instalado, rode dois comandos:
# imprime a tabela desta página go run . # tenta as quatro trapaças; passa se todas forem recusadas go test -run TestFalsa -count=1 .
Para ir mais fundo.
Isto se aplica ao seu caso?
Conte em duas linhas o que você precisa decidir ou medir. A primeira conversa serve para ver se a medição resolve o seu caso, e, se não resolve, dizemos.
- Bancada própria, 30 de setembro de 2026: gnark v0.16.3 e gnark-crypto v0.21.0 (github.com/Consensys/gnark), curva BN254, Apple M2 com 8 GB. Groth16: melhor de 5 provas e de 20 conferências. PLONK: melhor de 3 provas, preparação de teste (unsafekzg).
- Groth, "On the size of pairing-based non-interactive arguments" (EUROCRYPT 2016).
- Gabizon, Williamson e Ciobotaru, "PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge" (2019).
- As contas por dia do espécime são nossas: tempo medido vezes quantidade, numa máquina igual dedicada.