Una prueba de conocimiento cero te permite demostrar que una afirmación es verdadera sin revelar por qué lo es.
El ejemplo canónico: imagínate un amigo daltónico sosteniendo dos pelotas que parecen idénticas, una roja y otra verde. Puedes demostrarle que las pelotas realmente son de colores distintos sin decirle nunca cuál es cuál. Lo haces pidiéndole que las intercambie (o no) detrás de la espalda y luego diciéndole si las intercambió. Después de suficientes rondas queda convencido de que sabes distinguir el rojo del verde, pero sigue sin saber cuál pelota es de qué color.
Esa es toda la idea. SolMask usa pruebas de conocimiento cero para una afirmación específica:
"Conozco un secreto que corresponde a uno de los depósitos en este pool blindado, y he autorizado un retiro de N tokens hacia la wallet X."
La prueba no dice nada sobre qué depósito. La cadena ve un retiro válido pero no puede emparejarlo con ningún depósito específico.
Qué entra en la prueba
Cuando depositaste, SolMask calculó un compromiso:
commitment = Poseidon(secret, nullifier_secret, amount, unlock_slot)
Solo el compromiso queda en la cadena. Las cuatro entradas —tu secreto, el nullifier, la cantidad y el tiempo que acordaste esperar— nunca salen de tu navegador. No se guardan en ningún archivo que tengas que custodiar: tu wallet las vuelve a derivar bajo demanda firmando un mensaje fijo, y el depósito publica on-chain un blob de recuperación cifrado para tu wallet, de modo que la misma wallet pueda volver a descubrir la nota en cualquier lugar.
Cuando retiras, tu navegador genera una prueba Groth16 que, en términos matemáticos:
- El compromiso es una de las hojas en el árbol de Merkle del pool (sin decir cuál hoja).
- El nullifier que estás revelando ahora es el hash del nullifier secreto al que te comprometiste.
- Ha pasado suficiente tiempo (
current_slot >= unlock_slot). - La cantidad que retiras es consistente con el valor del compromiso.
- Cualquier vuelto se hashea en un compromiso nuevo que añades al árbol.
La prueba ocupa unos 200 bytes. El programa de Solana la verifica en unos pocos milisegundos.
¿Por qué nullifiers?
Cada depósito viene con un secreto único. Cuando retiras, revelas un hash de ese secreto: el nullifier. La cadena registra cada nullifier visto hasta el momento; si intentas retirar el mismo depósito dos veces, el segundo intento revela el mismo nullifier y se rechaza.
Lo crucial es que el nullifier se genera a partir de tu secreto privado, así que solo tú puedes producirlo para tu depósito, pero la cadena puede verificarlo sin aprender el secreto en sí.
¿Por qué Poseidon?
Los hashes estándar como SHA-256 son terriblemente caros de expresar como pruebas de conocimiento cero (piensa: cientos de miles de restricciones). Poseidon es un hash diseñado para ser barato dentro de los circuitos ZK: aproximadamente 5× menos restricciones que Keccak para el mismo nivel de seguridad. La contrapartida: es más lento que SHA-256 si lo calculas directamente en una CPU, lo cual no importa para nuestro caso.
¿Por qué Groth16?
Groth16 es el sistema de pruebas más probado en producción dentro de ZK. Sus pruebas son diminutas (3 puntos de curva elíptica, unos 200 bytes) y verifican en tiempo constante. El truco: necesita una ceremonia de configuración confiable única para generar parámetros públicos. La ceremonia de SolMask está documentada en nuestras notas de configuración confiable.
En qué no tienes que confiar
No necesitas confiar en los operadores de SolMask. El código del verificador está on-chain y es público. El circuito es público y reproducible. El relayer puede negarse a transmitir tu retiro, pero no puede robar tus fondos: la prueba está atada a la dirección del destinatario, así que cualquier intento de redirigir la invalidaría.
En qué sí tienes que confiar
La configuración confiable. Si alguien que participó en la ceremonia conservó el secreto "tóxico", podría falsificar pruebas y vaciar el pool. La ceremonia de SolMask usa un beacon público de bloque de Bitcoin como ancla de aleatoriedad; una ceremonia pública multipartita está planeada a medida que el protocolo madura.