Можно ли скрыть выполнение функции с помощью zkSNARK?

Я читал, что при гипотетической интеграции zCash/zkSNARK с Ethereum можно было бы скрыть отправителя, получателя и стоимость транзакции.

Мой вопрос заключается в том, можно ли также скрыть другие данные, отправленные в транзакции, например, имя функции, которую вы хотите выполнить, и ее параметры. И в таком случае, как это повлияет на состояние контракта.

Ответы (1)

zkSNARK доказывает с нулевым разглашением, что определенный аргумент верен.

Нулевое разглашение здесь означает, что он ничего не сообщает об аргументе, кроме того, является ли он истинным. Например, если вы взяли карту из колоды, и я спросил вас, была ли это черва, вы могли бы показать мне, что это правда, не раскрывая никакой другой информации о карте (например, туз, двойка или что-то еще) с помощью показывая мне все карты, которые не являются червями. Это пример доказательства с нулевым разглашением (zkp).

Я думаю, что в ZCash zkSNARK доказывает, что вы владеете суммой ZEC, превышающей или равной сумме, которую вы пытаетесь потратить в данной транзакции.

Я не думаю, что отправки zkp, который вы назвали функцией, было бы достаточно для фактического вызова функции. Может быть, вы могли бы отправить изменение состояния, которое происходит в результате вызова функции, вместе с zkSNARK, доказывающим, что вы вызвали законную функцию законным способом, и это привело к этому изменению состояния?

В этой ситуации вам потребуется доказать что-то более сложное, чем «у меня есть n ZEC и n>k, где k — стоимость транзакции». В результате получается, что любая функция NP может быть доказана с нулевым разглашением, и я вполне уверен, что zkSNARKs достаточно универсальны, чтобы это было / скоро станет возможным. Из ридми libsnark :

Вычисление может быть выражено как оператор NP в следующих формах:

  • «Программа foo на C при выполнении возвращает код выхода 0, если введена полоса ввода и дополнительный ввод qux».

  • «Булева схема foo выполнима с помощью некоторого входного qux».

  • «Арифметическая схема foo принимает частичное присваивание bar, когда расширяется до некоторого полного присваивания qux».

  • «Набор ограничений foo удовлетворяется полосой частичного присваивания при расширении до некоторого полного присваивания qux».

Вам даже не нужно было бы интегрировать ZCash и Ethereum, просто каким-то образом используйте libsnark и попросите кого-нибудь принять ваш странно сформированный вызов функции. Это может просто занять нетривиальный объем работы;)