Як завдяки zk-SNARK вдосконалюється система підтвердження резервів Binance
Ключові моменти
У листопаді 2022 року Binance випустила свою систему підтвердження резервів, в якій використовується криптографія дерева Меркла. Завдяки цій системі користувачі можуть перевіряти свої активи.
А зараз Binance покращила своє рішення, впровадивши zk-SNARK – форму доведення з нульовим розголошенням.
Тепер користувачі можуть перевірити, чи не є від’ємним загальний чистий баланс кожного акаунту та що всі активи користувача є частиною заявленого Binance загального чистого балансу активів користувачів, у конфіденційний і безпечний спосіб.
Зазирніть всередину нового рішення Binance для підтвердження резервів. Завдяки поєднанню zk-SNARK та дерева Меркла користувачі отримали новий і вдосконалений спосіб перевірки стану резервів Binance.
Протягом останніх кількох місяців команда розробників Binance невпинно працювала над створенням передових рішень для підтвердження платоспроможності (proof-of-solvency). Такі інструменти стали критично важливими для централізованих криптобірж на тлі так званої кризи довіри, яка охопила галузь після краху FTX. Кошти користувачів, які зберігаються на Binance, забезпечені у співвідношенні 1:1 плюс резерви, і пошук способу якомога простіше довести це громадськості став основною частиною плану Binance щодо відновлення довіри в галузі.
У листопаді 2022 року ми випустили нашу систему підтвердження резервів, в якій використовується криптографічна техніка дерева Меркла. Завдяки цьому користувачі отримали змогу перевіряти свої активи на Binance. Хоча Binance зробила крок вперед до прозорості щодо активів користувачів, початкова модель цього рішення мала два недоліки:
Щоб захистити конфіденційність користувачів, ноди листків у доказі Меркла представляли хеш активів користувачів – таким чином, корінь Меркла не міг відображати суму інформації про баланс у нодах листків.
Організація, чиї резерви перевірялися, могла потенційно додати від’ємний баланс під фіктивний акаунт десь у дереві, щоб загальні обов’язкові резерви виглядали меншими. Наступна діаграма з блогу Віталіка Бутеріна – приклад такого, назвемо це "оманливого", дерева Меркла (хоча в цьому випадку корінь відображає суму всіх балансів нод листків, що може викликати проблеми з конфіденційністю).
Тепер у нас є рішення, завдяки якому можна усунути ці недоліки та таким чином посилити систему підтвердження резервів Binance. Покладаючись на протоколи доведення з нульовим розголошенням, zk-SNARK, ми можемо довести, що:
Усі ноди листків дерева Меркла є частиною заявленого Binance загального балансу користувачів для кожного активу.
У дереві Меркла немає користувачів із від’ємним загальним чистим балансом (загальна вартість усіх активів, якими володіє користувач, у доларах США).
Декілька слів про від’ємні баланси та ефективність
Оскільки на Binance представлені маржинальні продукти, криптопозики та ф’ючерси, баланс кожного криптоактиву кожного користувача може складатися з активів і зобов’язань. Баланс певного криптоактиву користувача може бути від’ємним, але його загальний чистий баланс усіх криптоактивів не має бути від’ємним (оскільки всі позики повністю забезпечені).
За таким гіпотетичним сценарієм припустимо, що Олена здійснила депозит на Binance на суму 10 000 BUSD, а потім використала 4000 BUSD як забезпечення, щоб позичити 2 BNB (за ставкою 1 BNB = 1000 BUSD, припускаючи, що Binance завжди використовує забезпечення, що перевищує вартість активу). У наведеній нижче таблиці показано звіт з балансу Олени.
Якщо потім Олена здійснить з Тарасом (який також здійснив депозит на суму 10 000 BUSD) обмін 1 BNB на 1000 BUSD, після виконання угоди їхні баланси виглядатимуть так:
У цьому випадку баланс BNB Олени становитиме -1, що не є дійсною нодою в дереві Меркла та охоплює лише один актив: BNB. Однак, якщо ми дивимося на загальний чистий баланс Олени, він все ще становить 10 000.
Інша проблема пов’язана з величезною базою користувачів Binance. Ефективне рішення має забезпечувати підтвердження користувача та підтвердження zk-SNARK для десятків мільйонів користувачів, деякі з яких можуть мати понад 300 криптоактивів на нашій платформі.
Загалом ми хочемо, щоб користувачі могли протягом прийнятного періоду часу отримати такі докази:
Активи кожного користувача Binance є частиною нашого заявленого загального балансу користувачів, показаного на знімку. Користувачі можуть перевірити заявлений нами загальний баланс користувачів щодо активів, які зберігаються на адресах, контрольованих Binance, за допомогою блокчейн-експлорера для відстежування блоків (наприклад, Etherscan для гаманців Ethereum або BscScan для гаманців BNB Chain).
Загальний чистий баланс кожного користувача не є від’ємним, що означає, що Binance не створювала фіктивні акаунти з від’ємним балансом, щоб штучно зменшити розмір наших перевірених резервів.
Що таке zk-SNARK?
Перш ніж ми заглибимося в деталі нашого рішення, коротко оглянемо механізм доведення з нульовим розголошенням. За допомогою протоколів із нульовим розголошенням, як zk-SNARK, одна сторона (та, що має надати підтвердження) може продемонструвати іншій стороні (та, що перевіряє) що вона виконала певні обчислення з певними вхідними даними за певних обмежень, не розкриваючи вхідні дані. Обчислення може зайняти багато часу, але основний математичний механізм може допомогти стороні, що перевіряє, оцінити доказ швидко та безпечно.
Сторона, що має надати підтвердження, (Binance) починає з визначення набору обмежень для обчислень, докази за якими вона хоче надати. Обмеження визначені в схемах, які можна виразити мовою програмування вищого рівня (у нашому випадку це форк gnark).
Потім сторона, що має надати підтвердження, виконує важкі обчислення, хешуючи ID та баланси всіх користувачів, і генерує підтвердження того, що обчислення відповідають встановленим обмеженням. Для цього вона використовує слід обчислень (свідок) і публічні чи приватні вхідні дані.
Сторона, що проводить перевірку, (користувач) отримує підтвердження та перевіряє його за допомогою публічних даних схеми, щоб переконатися, що обчислення було виконано з дотриманням усіх встановлених обмежень. Порівняно з часом на надання підтвердження, обчислення для перевірки відбуваються надзвичайно швидко. Якщо сторона, що має надати підтвердження, генерує підтвердження не на попередньо визначених схемах, вона не зможе пройти перевірку підтвердження.
Щоб дізнатися більше про zk-SNARK, ви можете прочитати цю серію статей.
Наше рішення
Основою оновленого рішення для підтвердження резервів залишається дерево Меркла. Для наведеного вище прикладу це виглядатиме так:
На додаток до дерева Меркла ми також підтримуємо глобальний баланс, який представляє список загальних чистих балансів кожного активу, яким володіє кожен клієнт Binance.
Щоб підтвердити наші резерви, ми створимо підтвердження за допомогою zk-SNARK для побудови дерева Меркла. Для кожного набору балансів користувачів – ноди листка дерева Меркла – наша схема гарантує, що:
Кожен баланс активів цього користувача включено до згаданого вище списку глобального балансу.
Загальний чистий баланс користувача не є від’ємним.
Зміна кореня дерева Меркла дійсна після оновлення інформації цього користувача в хеші ноди листка.
Щоб дізнатися деталі впровадження, перегляньте технічну специфікацію та наш вихідний код схеми (обмеження).
У кожному випадку підтвердження наших резервів ми публікуватимемо:
1. Доказ Меркла: хеші для кожного користувача (для Олени представлені синіми нодами на зображенні вище).
2. Докази zk-SNARK і публічний вхід (хеш списку загальних чистих балансів кожного активу та кореня Меркла) схеми для всіх користувачів.
Перевіривши доказ Меркла, користувачі можуть переконатися, що їхній баланс включено в корінь дерева Меркла. Перевіривши доказ zk-SNARK, користувачі можуть переконатися, що конструкція дерева Меркла відповідає обмеженням, визначеним у схемі.
Безпека цього рішення значною мірою залежить від налаштування ключа підтвердження та ключа перевірки. Ми працюємо над децентралізованим налаштуванням ключів. Якщо говорити про надійні децентралізовані системи, то тут гарним прикладом є Ethereum. Ми дуже близькі до того, щоб отримати рішення MPC, що забезпечить надійність системи.
Ефективність
Враховуючи кількість користувачів Binance, чиї баланси слід включити, єдиний доказ конструкції дерева Меркла, який охопив би всіх користувачів одночасно, отримати неможливо. Вирішити це можна за допомогою розділення користувачів на групи по 864 користувача в кожній, щоб мати схему меншого масштабу та паралельні процедури надання підтвердження.
Для групи з 864 користувачів, де кожен користувач володіє 350 різними активами, припустимо, що баланс кожного активу знаходиться в діапазоні [0, 2^64-1]. З 32-ядерним сервером на 128 ГБ генерування підтвердження zk займе близько 110 секунд, а на перевірку підтвердження піде менше 1 мілісекунди.
Binance запустить 1000 операцій із надання підтверджень одночасно, щоб створити підтвердження для всіх акаунтів за 2 години. Вартість цього сервера для надання підтвердження за одну годину становить близько 0,56 долара США, отже, загальна вартість створення всіх підтверджень zk, що охоплюють усіх користувачів, становитиме приблизно 1000 доларів США.
Висновок
Ми надамо першу ітерацію підтвердження для користувачів, створеного за допомогою цього нового рішення, у наступному оголошенні про підтвердження резервів. Крім того, ми відкрили доступ до вихідного коду нашого процесора даних користувачів, сторони надання підтвердження, схеми та сторони, що перевіряє, щоб кожна централізована біржа, яка покладається на ту саму модель, що й ми, могла легко генерувати підтвердження для своїх користувачів і активів.
Ми сподіваємося, що це допоможе підняти прозорість індустрії цифрових активів на новий рівень. Ми також працюємо над впровадженням рішення, про яке згадував у своєму блозі Віталік Бутерін, щоб досягти кращої ефективності, що дозволить нам надавати підтвердження частіше за меншу вартість.
Оскільки це перша спроба впровадження zk-SNARK, ми з нетерпінням чекаємо на відгуки спільноти. Лише так ми зможемо й надалі вдосконалювати систему.
Код та пов’язані статті
Стежте за нами в соцмережах Binance Ukraine:
Telegram канал | Telegram група | TikTok | Twitter | Facebook | Instagram | YouTube