Что такое Zero Knowledge Proof (технология реализованная в протоколе Zcash и его форках)
Почему это действительно крутая технология?
Zero Knowledge Proof сейчас реализован в протоколе Zcash и его форках, и более продвинутая версия планируется в Tezos. Он позволяет полностью скрыть например то, с какого адреса ушел платеж, на какой адрес ушел платеж и сколько ушло денег. И при этом доказать, что всё, что произошло - действительно произошло, что отправитель имел достаточное количество денег и что получатель действительно получил эти деньги. Но при этом транзакцию невозможно отследить от слова никак.
Начнем с самых основ – что такое хеширование. Хеширование – перевод любых данных (хоть все тома Войны и мира) в строку фиксированной длины, выполняемое определённым алгоритмом. Но при этом задача хеширования в криптографии – невозможность вернуть эту строку обратно в изначальные данные, но при этом если брать одни и те же изначальные данные – у вас всегда будет получаться один и тот же хеш. Условно 358х784=280672. Каждый раз, когда мы умножаем 358 на 784, мы получим 280672, однако если нам известен только ответ (280672) нам достаточно сложно вычислить, как же он появился.
Теперь возьмем пример с судоку. Мне лень решать судоку и я нанял человека, чтобы он решил его за меня. Но если он просто пришлет мне решение, я могу его обмануть и не заплатить. А если я отправлю ему деньги, то он меня может обмануть и не прислать решение. Как найти выход из этой ситуации без помощи 3 лица (арбитра)? Вот один из вариантов: я говорю исполнителю чтобы он показал мне, например, 3 строку из судоку (номер строки придумывается рандомно) и, например, правый нижний квадрат. Если он мне отправил верные данные (в строке и квадрате нет повторяющихся цифр), то скорее всего он решил судоку верно. Однако он же мог просто нагенерить эти числа случайным образом, главное чтобы не повторялись. Здесь нам на помощь приходит хеширование: исполнитель заранее присылает мне хеши всех строк, столбцов и квадатов судоку и только потом я говорю ему показать, например, 5 столбец и левый нижний квадрат. Эту последовательность чисел в столбце и квадрате я могу захешировать определенным алгоритмом и сравнить с теми хешами, что заранее мне прислал исполнитель.
Решение проблемы весьма изящно, НО это не доказательство с НУЛЕВЫМ разглашением, это доказательство с ЧАСТИЧНЫМ разглашением (исполнитель же показывал мне те строки, столбцы или квадраты, что я рандомно ему говорил).
Одна из больших проблем Zero Knowledge Proof заключается в том, что как работает этот протокол реально знает, от силы, пару сотен человек на всей планете, настолько это сложная тема. Однако отдаленно прикоснуться к пониманию попробуем на следующем примере:
Для начала посмотрите на эту картинку:
Итак, постановка проблемы: есть дверь и у вас есть от нее ключ и есть человек, которому нужно доказать, что у вас есть ключ от этой двери, но при этом ни в коем случае НЕЛЬЗЯ:
1. Показывать ключ
2. Показывать процесс открытия двери
3. Даже показывать с какой стороны вы открыли дверь.
Решение весьма нетривиально, посмотрите на картинку выше, пусть это будет такая интересная пещера. Черная полоска внизу – дверь. Проверяющий стоит в точке А, вы в точке В. Проверяющий не видит в какую сторону вы пойдете (к точке С или точке D). Вы наугад выбираете, в какую сторону идти и идете. После этого проверяющий переходит из точки А в точку В и кричит, опять же наугад: «Выходи со стороны С». И вы выходите со стороны точки С. Если провести такой эксперимент только один раз, то вероятность того, что вы обманули – 50%. Вы же могли изначально пойти в сторону точки С и тогда вам не нужно было бы открывать дверь. Однако если провести такой эксперимент хотя-бы 20 раз подряд и каждый раз вы будете выходить с той стороны, с которой вам говорит проверяющий, то вероятность того, что у вас нет ключа от двери, становится запредельно малой.
Итак мы смогли доказать с запредельно высокой вероятностью, что ключ у нас таки есть, не показывая ни сам ключ, ни процесс открывания, ни даже с какой стороны мы открыли дверь.
Именно так реализован алгоритм работы криптовалюты Zcash. Полная анонимность транзакций. Кстати стоимость данной криптовалюты на бирже Bitfinex на данный момент составляет 254$ за 1 единицу.
