ТЛ;ДР

Доказательство с нулевым разглашением позволяет одной стороне (проверяющей стороне) определить достоверность утверждения, сделанного другой стороной (доказывающей), без какого-либо знания содержания утверждения. Например, Binance может захотеть доказать, что она полностью обеспечила средства своих пользователей резервами, не раскрывая балансы всех отдельных пользователей.

«Доказательство резервов» может быть построено с использованием дерева Меркла, которое защищает от фальсификации его внутренних данных, в данном случае его общих чистых балансов клиентов, которые являются обязательствами биржи перед ее пользователями. Затем это можно объединить с zk-SNARK (протокол доказательства с нулевым разглашением), который гарантирует, что пользователи могут проверять свой баланс, являющийся частью общего чистого баланса пользовательских активов, не зная индивидуальных балансов.

Введение

В свете рыночных событий безопасность хранящихся криптоактивов стала критической темой. Пользователи блокчейна высоко ценят прозрачность и открытость, но также поддерживают приватность и конфиденциальность. Это создает дилемму при подтверждении резервов средств, находящихся во владении кастодианов. Часто существует компромисс между прозрачностью, доверием и конфиденциальностью данных.

Однако это не обязательно так. Объединив протоколы доказательства с нулевым разглашением, такие как zk-SNARK, с деревьями Меркла, мы можем найти эффективное решение для всех сторон.

Что такое доказательство с нулевым разглашением?

Доказательство с нулевым разглашением позволяет одной стороне (проверяющей стороне) определить достоверность утверждения, сделанного другой стороной (доказывающей), без какого-либо знания содержания утверждения. Давайте посмотрим на простой пример.

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

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

Вы можете доказать другу, что знаете комбинацию, открыв коробку, сообщив ему, что написано на записке, и снова закрыв ее. Однако вы ни разу не раскрыли комбинацию.

Более сложный пример см. в статье Что такое доказательство с нулевым разглашением и как оно влияет на блокчейн? статья.

Почему мы используем доказательство с нулевым разглашением?

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

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

Для этих примеров (и многих других) доказательство с нулевым разглашением будет использовать алгоритмы, которые принимают входные данные и возвращают «истина» или «ложь» в качестве вывода. 

Определение доказательства с нулевым разглашением в технических терминах

Доказательство с нулевым разглашением, с технической точки зрения, следует определенной структуре с определенными критериями. Мы уже рассмотрели роли доказывающего и проверяющего, но есть также три критерия, которые должно охватывать доказательство с нулевым разглашением:

  1. Полнота. Если утверждение верно, проверяющий будет убежден предоставленными доказательствами без необходимости какой-либо другой информации или проверки.

  2. Прочность. Если утверждение ложно, проверяющий не сможет убедиться в истинности утверждения предоставленными доказательствами.

  3. Нулевое знание. Если утверждение истинно, проверяющий не узнает никакой информации, кроме истинности утверждения.

Что такое zk-СНАРК?

zk-SNARK (Краткий неинтерактивный аргумент знания с нулевым разглашением) — это протокол доказательства, который следует ранее изложенным принципам нулевого разглашения. С помощью zk-SNARK вы можете доказать, что знаете исходное хеш-значение (подробнее обсуждается ниже), не раскрывая, что это такое. Вы также можете доказать действительность транзакции, не раскрывая никакой информации о конкретных суммах, значениях или адресах.

zk-SNARK широко используются и обсуждаются в мире блокчейнов и криптовалют. Но вы можете задаться вопросом, зачем кому-то использовать zk-SNARK, если для защиты информации можно использовать простой метод пары открытого и закрытого ключей. Однако мы не сможем реализовать математическое доказательство, чтобы гарантировать отсутствие отрицательных балансов и суммы дерева Меркла. 

В случае с резервами биржи мы хотим доказать поддержку балансов клиентов в соотношении 1:1 без обнародования идентификаторов и балансов каждой учетной записи. Кроме того, технология zk-SNARK делает фальсификацию данных еще более маловероятной.

Что такое дерево Меркла?

Представление суммированных средств на счетах пользователей Binance требует работы с большим набором данных. Один из способов представить этот большой объем данных в криптографическом виде — использовать дерево Меркла. В нем можно эффективно хранить огромное количество информации, а его криптографический характер позволяет легко проверить его целостность.

Хэш-функции

Для краткого кодирования входных данных дерево Меркла зависит от использования хеш-функций. Короче говоря, хеширование — это процесс генерации выходных данных фиксированного размера из входных данных переменного размера. Другими словами, когда входные данные любой длины хешируются с помощью алгоритма, он генерирует зашифрованный вывод фиксированной длины.

Пока входные данные остаются прежними, выходные данные тоже будут. Это означает, что мы можем взять огромные объемы транзакционных данных и хешировать их в управляемый результат. Выходные данные будут радикально отличаться, если какая-либо информация будет изменена во входных данных.

Например, мы могли бы взять содержимое 100 книг и ввести их в хеш-функцию SHA-256. Затем в качестве вывода будет выдано что-то вроде этого:

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

Если бы мы затем изменили один символ входных данных (эти 100 книг), хэш был бы совершенно другим, например:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

Это важное свойство хеш-функций, поскольку оно позволяет легко проверить точность данных. Если кто-нибудь повторит процесс хеширования тех же 100 книг с использованием алгоритма SHA-256, он получит тот же хеш, что и на выходе. Если выходные данные отличаются, мы можем с уверенностью утверждать, что входные данные были изменены. Это означает, что нет необходимости индивидуально или вручную проверять различия между входными данными, что может быть трудоемким.

Деревья Меркла в мире криптовалют

При хранении данных транзакций в блокчейне каждая новая транзакция передается через хеш-функцию, которая генерирует уникальные хеш-значения. Представьте, что у нас есть восемь транзакций (от A до H), которые мы хэшируем индивидуально, чтобы получить их хэшированные выходные данные. Это то, что мы называем листовыми узлами Меркла. На изображении ниже вы можете увидеть уникальное значение хеш-функции каждой буквы: hA для A, hB для B, hC для C и т. д.

Затем мы можем взять пары хешированных выходных данных, объединить их и получить новый хешированный результат. Например, хэши hA и hB, хешированные вместе, дадут нам новый хэшированный результат hAB, известный как ветвь Меркла. Обратите внимание, что каждый раз, когда генерируется новый результат, он имеет фиксированную длину и размер в соответствии с используемой хэш-функцией.

Теперь у нас есть данные двух транзакций (например, A и B), объединенные в один хеш (hAB). Обратите внимание: если мы изменим какую-либо информацию из A или B и повторим процесс, наш хешированный результат hAB будет совершенно другим.

Процесс продолжается, поскольку мы объединяем новые пары хешей, чтобы снова их хешировать (см. изображение ниже). Мы хешируем hAB с hCD, чтобы получить уникальный хэш hABCD, и делаем то же самое с hEF и hGH, чтобы получить hEFGH. В конце концов мы получаем один хэш, представляющий хешированные результаты всех хэшей предыдущих транзакций. Другими словами, хешированный вывод hABCDEFGH представляет всю информацию, которая была до него.

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

Ограничения деревьев Меркла

Давайте вернемся к нашему примеру с резервами CEX. CEX хочет доказать поддержку 1:1 всех активов своих клиентов и строит дерево Меркла, которое объединяет UID своих клиентов с их чистыми активами (за вычетом активов и обязательств) на уровне токенов. После выпуска (и подписания для подтверждения права собственности на предоставленный корень Меркла) у отдельного пользователя не будет возможности проверить, является ли дерево Меркла действительным, без доступа ко всем его входным данным.

При обмене могли быть пропущены некоторые входные данные. Он также может создавать поддельные учетные записи с отрицательным балансом, чтобы изменить общую сумму обязательств. Например, хотя активы клиентов могут составлять 1 000 000 долларов США, фальшивый аккаунт может быть добавлен с балансом -500 000 долларов США. Это создаст целевой показатель резервов всего в 500 000 долларов США.

Случай подтверждения резервов отличается от корня блока Меркла, поскольку пользователи могут видеть все транзакции, содержащиеся в блоке, в обозревателе блокчейна. Однако CEX не захочет раскрывать баланс каждого счета по соображениям безопасности и конфиденциальности данных. Клиенты тоже были бы недовольны, если бы баланс их счетов был обнародован. В этом случае CEX не может доказать, что балансы пользователей составляют правильную сумму, не делая видимыми балансы других пользователей.

Одним из решений, которое биржи могут рассмотреть, является использование доверенного стороннего аудитора. Аудитор может проверить отдельные счета и резервы, прежде чем окончательно подтвердить достоверность предоставленного корня Меркла. Однако для пользователей этот метод требует доверия к аудитору и данным, используемым для аудита. Вам не нужно полагаться на третью сторону, если вы можете доверять данным.

Объединение zk-SNARK с деревьями Меркла

Вышеупомянутая проблема является идеальным случаем для использования zk-SNARK. Мы хотим доказать, что резервы полностью покрывают обязательства пользователей и не являются фальсифицированными. Однако по соображениям конфиденциальности и безопасности мы не хотим показывать верификатору точный состав пользовательских балансов и резервов. 

Используя zk-SNARK, криптобиржа может доказать, что все наборы балансов конечных узлов дерева Меркла (т. е. балансы учетных записей пользователей) вносят вклад в заявленный общий баланс пользовательских активов биржи. Каждый пользователь может легко получить доступ к своему конечному узлу, поскольку он включен в процесс. Zk-SNARK также гарантирует, что любое сгенерированное дерево Меркла не будет содержать пользователей с отрицательным общим балансом чистых активов (что будет означать фальсификацию данных, поскольку все кредиты имеют чрезмерное обеспечение). Также используется расчет глобального состояния Binance, то есть список общего чистого баланса каждого актива, которым владеет каждый клиент Binance.

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

Для каждого набора баланса пользователя (листового узла дерева Меркла) наша схема гарантирует, что:

  1. Балансы активов пользователя включаются в расчет суммы общих чистых балансов пользователей на Binance.

  2. Общий чистый баланс пользователя больше или равен нулю.

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

Затем Binance может сгенерировать доказательство zk-SNARK для построения дерева Меркла в соответствии со схемой. Это влечет за собой выполнение биржи тяжелых вычислений по хешированию идентификаторов и балансов пользователей, одновременно гарантируя, что доказательство проходит ограничения.

Верификатор проверит доказательство (и его публично опубликованный открытый исходный код), чтобы убедиться, что вычисление выполняется с соблюдением всех ограничений. Вычисление проверки занимает чрезвычайно короткое время по сравнению со временем проверки.

При каждом выпуске Proof of Reserves биржа будет публиковать:

1. Доказательство Меркла для каждого пользователя.

2. Доказательство zk-SNARK и публичные входные данные (хэш списка общего чистого баланса каждого актива и корня Меркла) схемы для всех пользователей.

Заинтересованные стороны могут проверить доказательство Меркла, гарантируя, что их индивидуальные балансы внесли вклад в корень дерева Меркла. Они также могут проверить доказательство zk-SNARK, чтобы убедиться, что построение дерева Меркла соответствует ограничениям, определенным в схеме. Более подробное объяснение решения zk-SNARK и его производительности можно найти в нашем блоге «Как zk-SNARKs улучшает систему подтверждения резервов Binance».

Заключительные мысли

zk-SNARK предоставляют технологию, необходимую для одновременного обеспечения целостности и конфиденциальности данных. Его применение для подтверждения резервов и повышения прозрачности CEX должно помочь укрепить доверие к индустрии блокчейнов. Для многих такое развитие событий было долгожданным и произошло в решающий момент для CEX.

Это первая версия нашего zk-SNARK, и мы с нетерпением ждем отзывов сообщества, чтобы продолжать совершенствовать систему.

Дальнейшее чтение

  • (Блог) Как zk-SNARKs улучшают систему подтверждения резервов Binance

  • (Академия) Доказательство резервов (PoR)

  • (Академия) Что такое подтверждение резервов и как оно работает на Binance

  • (Объявление) Binance выпускает систему подтверждения резервов