¿Puede el pagador malicioso desanonimizar al beneficiario en Zcash?

Mirando tanto el documento original de Zcash como la especificación actualizada del protocolo Zcash , parece que después de que Alice le pagó a Bob, puede revelarle al mundo que lo hizo.

Alice puede hacerlo al revelar la aleatoriedad de los nuevos compromisos de monedas que generó, uno de los cuales contiene el PK de Bob y la cantidad. Por ejemplo, en la imagen a continuación, Alice revela los elementos resaltados en rojo (es decir, la aleatoriedad de Alice) y púrpura (es decir, el PK de Bob y el valor), mientras que los elementos en amarillo ya son públicos.

Descripción de Zcash Pour TXN del periódico de Oakland

El mismo ataque funciona en la propuesta Zcash actualizada (consulte la Sección 4.4 en la página 19 en v2018-beta2.0 , además de la imagen a continuación).

Compromiso de monedas Zcash de su especificación de protocolo

Solo quiero confirmar que (1) no me estoy perdiendo nada y esto es posible y (2) es potencialmente problemático. Por ejemplo, si Alice pagó a Bob por algunos bienes o servicios ilícitos, más tarde puede revelar que lo hizo.

¡Los pensamientos serían bienvenidos!

Respuestas (2)

tl; dr Alice puede revelar los pagos que le hizo a Bob. No puede revelar los pagos que otros le hicieron a Bob, ni revelar qué (si es que hace algo) Bob con el ZEC que envió Alice.


Revelar la preimagen del compromiso de la nota solo prueba que Alice conoce la preimagen. No prueba que Alice envió la transacción, porque la prueba se puede reproducir: una vez revelada, cualquiera puede tomar la aleatoriedad y anotar los datos y mostrárselos a otra persona.

Para que Alice le demuestre a alguien que envió la transacción, puede hacer lo siguiente:

  • Escribe un mensaje que contenga:
    • La clave privada eskutilizada para cifrar la nota (aleatoriedad y valor) a Bob.
    • Dirección de pago de Bob.
    • Una cadena de desafío elegida por la persona a la que Alice está convenciendo.
  • Firme el mensaje utilizando la clave privada joinSplitPrivKeycorrespondiente a la joinsplitPubKeyque se utilizó originalmente para firmar la transacción.

El mensaje firmado es una prueba de que Alice tiene acceso actualmente joinSplitPrivKey(porque la cadena de desafío es nueva). Suponiendo que joinSplitPrivKeynunca se revele, Alice es indistinguible de la persona que creó la transacción (es decir, ella o alguien con sus claves de gasto realizó el pago). Esto es lo que llamamos una divulgación de pago y es cómo, por ejemplo, demostraría a un intercambio (o un servicio de resolución de disputas de terceros) que efectivamente les pagó.

Lo que está describiendo es fundamentalmente el mismo problema que tienen las aplicaciones de mensajería con el cifrado de extremo a extremo: alguien con acceso previsto a los datos puede revelarlos accidental o intencionalmente. Eliminar esta posible fuga de privacidad significaría, por definición, que Alice no puede ver algunos o todos los detalles sobre sus propias transacciones salientes, lo cual es una contradicción (en el modelo Zcash, Alice necesita poder calcular un compromiso a partir de su imagen previa para para crear transacciones válidas), o un sistema de pago completamente inutilizable.

Sin embargo, tenga en cuenta que aunque Alice puede probar que envió una transacción a Bob, no puede revelar nada sobre lo que Bob hace con la nota que recibió (porque no tiene la clave de gastos de Bob y, por lo tanto, no puede calcular el anulador que lo haría). ser revelado en pasar el tiempo). La capacidad de Alice para revelar información se limita a la información que alguna vez pudo ver.

¡Gracias! No estoy seguro de entender por qué "eliminar esta posible fuga de privacidad significaría, por definición, que Alice no puede ver algunos o todos los detalles sobre sus propias transacciones salientes" . Podría imaginar diseños en los que Alice conoce todos los detalles sobre sus transacciones (tal vez algunos de ellos se mantienen fuera de línea), pero estos detalles son completamente "negables": no se pueden usar para probar que Alice alguna vez le envió monedas a Bob. Sin embargo, parece que esto evitará que Alice convenza a Bob de que le pagó, ¡lo que podría ser problemático!

Para agregar a la respuesta de @ str4d, aquí hay enlaces a la documentación pública y la discusión de la función de divulgación de pagos:

Tenga en cuenta que si a Bob le preocupara esta posibilidad, podría haberle dado a Alice una dirección única para pagarle, de modo que un pago revelado a esa dirección no pudiera vincularse con sus otras direcciones. Esto se sugiere en la sección 3.1 de la especificación del protocolo.

En Sapling, hay una nueva función llamada "direcciones de pago diversificadas" que hace que este uso sea más eficiente: Bob puede proporcionar una dirección diversificada única a cada posible pagador y aún puede escanear la cadena de bloques en busca de pagos entrantes tan eficientemente como si hubiera solo una dirección. Estamos planeando que esto se integre en el equivalente de Zcash de BIP 32 (Direcciones deterministas jerárquicas), de modo que todos los secretos asociados con una billetera se puedan respaldar usando una sola semilla.