Me complace anunciar el primer pago contingente de conocimiento cero (ZKCP) exitoso en la red Bitcoin.
ZKCP es un protocolo de transacción que permite a un comprador comprar información de un vendedor utilizando Bitcoin de una manera privada, escalable, segura y que no requiere confiar en nadie: la información esperada se transfiere si y solo si se realiza el pago. El comprador y el vendedor no necesitan confiar el uno en el otro ni depender del arbitraje de un tercero.
Imagine un “intercambio de maletín” al estilo de una película (una parte con un maletín lleno de dinero en efectivo, otra con documentos secretos), pero sin el escenario potencial de que una de las cajas esté llena de periódicos triturados y la resultante emocionante escena de persecución.
Una aplicación de ejemplo sería la de los propietarios de una marca particular de lector de libros electrónicos que cooperan para comprar las claves maestras DRM de un fabricante fallido, de modo que puedan cargar sus propios documentos en sus lectores después de que los servidores del proveedor se desconecten. Este tipo de venta es inherentemente irreversible, potencialmente cruza múltiples jurisdicciones e involucra a partes cuya estabilidad financiera es incierta, lo que significa que ambas partes asumen un gran riesgo o tienen que llegar a acuerdos difíciles. El uso de un ZKCP evita los importantes costos de transacción involucrados en una venta que, de otro modo, fácilmente podría salir mal.
En la transacción de hoy, compré una solución para un Sudoku de 16×16 por 0,10 BTC de Sean Bowe, miembro del equipo de Zcash, como parte de una demostración realizada en vivo en Financial Cryptography 2016 en Barbados. Participé en la transacción de forma remota desde California.
La transferencia implicó dos transacciones:
Casi todo el trabajo de ingeniería detrás de esta implementación de ZKCP fue realizado por Sean Bowe, con el apoyo de Pieter Wuille, yo y Madars Virza.
Vea las diapositivas de la demostración en vivo.
Fondo
Propuse por primera vez el protocolo ZKCP en 2011 en un artículo en Bitcoin Wiki como un ejemplo de cuán tremendamente poderosas ya eran las primitivas existentes en Bitcoin Script.
Pruebas de conocimiento cero
Mi protocolo ZKCP requería como componente básico una prueba de conocimiento cero para programas arbitrarios. Existen muchos tipos de pruebas especializadas de conocimiento cero: las firmas digitales comunes son un ejemplo, al igual que las pruebas de rango en transacciones confidenciales.
Una prueba de conocimiento cero para cálculo general es un sistema criptográfico que permite a una persona ejecutar un programa arbitrario con una combinación de entradas públicas y secretas y demostrar a otros que este programa específico aceptó las entradas, sin revelar nada más sobre su funcionamiento o las entradas secretas.
Si esto parece magia imposible, con fines educativos se me ocurrió un sistema ZKP muy simple pero ineficiente que no utiliza nada más sofisticado que circuitos booleanos y hashes criptográficos, o vea el ejemplo de ZKP para colorear gráficos de Matthew Green.
Como señaló mi artículo inicial sobre ZKCP, dicho sistema no estaba disponible en 2011, pero se creía que era posible, especialmente bajo restricciones específicas que habrían funcionado para ZKCP.
En 2012, Gennaro, Gentry, Parno y Raykova publicaron un artículo (“Quadratic Span Programs and Succinct NIZK without PCP”) que describía una construcción especialmente eficiente. Desde entonces, varios grupos han seguido avanzando en este trabajo, creando compiladores, mejoras de rendimiento y, lo más importante, herramientas prácticas como libsnark. El criptosistema GGPR’12 requiere una configuración confiable, pero para la aplicación ZKCP esto no es una limitación real ya que el comprador puede realizarla. Gracias a este trabajo, ZKCP ahora puede convertirse en una herramienta práctica.
Otras lecturas:
Debido a que estos ZKP eficientes son tecnología de vanguardia que dependen de nuevos supuestos criptográficos sólidos, su seguridad aún no está determinada. Pero en aplicaciones como ZKCP, donde nuestras únicas alternativas son la confianza de terceros, se pueden utilizar de formas que suponen una mejora estricta de lo que podríamos hacer sin ellas.
Cómo funciona ZKCP
Si acepta la existencia del sistema de prueba de conocimiento cero como una caja negra, el resto del protocolo ZKCP es bastante simple.
El comprador primero crea un programa que puede decidir si la información que recibe son los datos que el comprador quiere comprar. Este programa sólo verifica la información, no la produce; el comprador ni siquiera necesita tener idea de cómo producirla. (Por ejemplo, es fácil escribir un programa para verificar que una solución de Sudoku es correcta, pero es más difícil escribir un solucionador de Sudoku, el Sudoku es NP-completo. El comprador aquí solo necesita escribir el verificador de la solución).
El comprador realiza la configuración confiable para el sistema de prueba y envía la información de configuración resultante al vendedor.
El vendedor elige una clave de cifrado aleatoria y cifra la información que el comprador desea comprar.
Utilizando el sistema ZKP, el vendedor prueba una declaración compuesta:
- Ex es un cifrado de una entrada que satisface el programa del Comprador.
- Y es el hash sha256 de la clave de descifrado para Ex.
El vendedor envía Ex, Y, la prueba y su clave pública al comprador. Una vez que la computadora del comprador verifica la prueba, el comprador sabe que si aprende la entrada a SHA256 que produce el hash Y, puede descifrar su respuesta.
Entonces, el comprador inicialmente quería comprar un insumo para su programa, pero ahora estaría igualmente feliz de comprar la preimagen de un hash. Resulta que Bitcoin ya proporciona una forma de vender preimágenes hash de forma segura.
El comprador realiza su pago al siguiente ScriptPubkey:
OP_SHA256
<Y> OP_EQUAL
OP_IF
<Seller Pubkey>
OP_ELSE
<block_height+100> OP_CHECKLOCKTIMEVERIFY OP_DROP
<Buyer Pubkey>
OP_ENDIF
OP_CHECKSIG
El efecto de este pago es que el vendedor puede cobrarlo si proporciona la preimagen hash de Y y una firma con su clave. Para evitar inmovilizar los fondos del comprador para siempre, si el vendedor no cobra su pago dentro de (por ejemplo) un día, el comprador puede reclamar el pago.
Como resultado, cuando el vendedor cobra su pago se ve obligado a revelar la información que el comprador necesita para descifrar la respuesta. Si no lo hace, el comprador recupera sus fondos.
Esta ScriptPubkey también es la misma que se usaría para un intercambio atómico entre cadenas o un canal de pago relámpago.
Se implementó soporte de billetera para estas transacciones para Bitcoin Core en PR#7601. Esta compatibilidad con billetera es utilizada por el cliente y servidor sudoku ZKCP disponible en https://github.com/zcash/pay-to-sudoku.
El programa del comprador puede ser arbitrariamente largo y complejo sin agregar ninguna carga adicional a la cadena de bloques de Bitcoin; el único impacto sería el aumento del tiempo requerido para la configuración y la prueba, todo lo cual sucede fuera de Bitcoin. Nadie fuera del comprador o vendedor aprende nada sobre el programa del comprador (es decir, no aprenden la naturaleza de la información que se vende).
Limitaciones y alternativas
Este enfoque es mucho más escalable y privado que realizar contratos inteligentes dentro de la cadena de bloques, y no está sujeto a limitaciones de rendimiento o funcionalidad en la contratación inteligente de Bitcoin.
Hay dos restricciones principales de este enfoque. Primero, que sea interactivo: el comprador no puede simplemente hacer una oferta transmitida y hacer que cualquier vendedor interesado acepte el pago sin comunicación de ida y vuelta. Y segundo, que el sistema ZKP, aunque lo suficientemente rápido como para ser práctico, todavía no lo es mucho. Por ejemplo, en nuestra demostración, el sistema ZKP prueba 5 ejecuciones de SHA256 y las restricciones del Sudoku, y tarda unos 20 segundos en ejecutarse en una computadora portátil. (La verificación de la prueba sólo lleva unos pocos milisegundos).
Una alternativa a ZKCP es el protocolo «pub de pago» de 2014 de Peter Todd. En Paypub, en lugar de utilizar una prueba de conocimiento cero, al comprador se le muestra un subconjunto aleatorio de los datos que intenta comprar, y el vendedor se ve obligado a desbloquear el resto cuando cobra su pago. Paypub evita la complejidad de lidiar con una prueba de conocimiento cero (y también permite el intercambio de información que solo los humanos pueden verificar), pero a costa de cierta vulnerabilidad a las trampas y solo se puede utilizar con un conjunto relativamente grande de información verificable aleatoriamente. .
En general, creo que los contratos inteligentes “no confiables” como estos tienen mayor valor cuando hay frecuentes transacciones automatizadas de muy bajo valor (de modo que los gastos generales de los métodos tradicionales de resolución de conflictos privan a los participantes de un acceso significativo a la justicia) o en casos muy intercambios de alto valor donde la velocidad, la falta de confiabilidad (especialmente entre jurisdicciones) o la falta de privacidad de la resolución tradicional de conflictos serían inaceptables.
Espero con interés las interesantes aplicaciones que la gente encontrará a medida que la tecnología se vuelva cada vez más práctica.
Gregorio Maxwell