¿Sería posible ocultar la ejecución de una función con zkSNARKs?

Leí que con una integración hipotética de zCash/zkSNARK con Ethereum, sería posible ocultar el remitente, el receptor y el valor de una transacción.

Mi pregunta es si también sería posible ocultar otros datos enviados en una transacción, como el nombre de la función que desea ejecutar y los parámetros de la misma. Y en ese caso, cómo afectaría eso al estado del contrato.

Respuestas (1)

Los zkSNARK prueban, con conocimiento cero, que cierto argumento es verdadero.

El conocimiento cero aquí significa que no filtra nada sobre el argumento, excepto si es cierto o no. Un ejemplo: si elegiste una carta de una baraja y te pregunto si era un corazón, podrías mostrarme que esto es cierto sin filtrar ninguna otra información sobre la carta (como si es un as, 2, lo que sea) por mostrándome todas las cartas que no son corazones. Este es un ejemplo de una prueba en conocimiento cero (zkp).

En ZCash, creo que zkSNARK demuestra que tienes la propiedad de una cantidad de ZEC mayor o igual a la cantidad que estás tratando de gastar en una transacción determinada.

No creo que enviar un zkp al que llamaste función sea suficiente para llamar realmente a la función. ¿Tal vez podría enviar el cambio de estado que ocurre como resultado de llamar a la función, junto con un zkSNARK que demuestre que llamó a una función legítima de una manera legítima y resultó en ese cambio de estado?

Esta situación requeriría que demuestre algo más complejo que 'Tengo n ZEC y n>k, siendo k el valor de la transacción'. Existe el resultado de que cualquier función NP se puede probar con conocimiento cero, y estoy bastante seguro de que los zkSNARK son lo suficientemente generales como para que esto sea / pronto sea una posibilidad. Del archivo Léame de libsnark :

Un cálculo se puede expresar como una instrucción NP, en formas como las siguientes:

  • "El programa C foo, cuando se ejecuta, devuelve el código de salida 0 si se le da la barra de entrada y alguna entrada adicional qux".

  • "El circuito booleano foo se puede satisfacer con alguna entrada qux".

  • "El circuito aritmético foo acepta la barra de asignación parcial, cuando se extiende a una asignación completa qux".

  • "El conjunto de restricciones foo se puede satisfacer mediante la barra de asignación parcial, cuando se extiende a una asignación completa qux".

Ni siquiera tendría que integrar ZCash y Ethereum, simplemente use libsnark de alguna manera y haga que alguien acepte su llamada de función de forma extraña. Puede que solo requiera una cantidad de trabajo no trivial;)