Короткий зміст
Доведення із нульовим розголошенням дозволяє одній стороні (тому, хто підтверджує) визначити достовірність твердження, наданого іншою стороною (тим, хто доводить), не знаючи змісту твердження. Наприклад, Binance може захотіти довести, що повністю підтримує кошти своїх користувачів у резервах, не розкриваючи всі баланси окремих користувачів.
"Підтвердження резервів" може бути побудовано за допомогою дерева Меркла, яке захищає від фальсифікації внутрішні дані, в даному випадку, загальні чисті баланси клієнтів, які є зобов'язаннями біржі перед її користувачами. Потім ці дані можна комбінувати зі zk-SNARK (протокол доведення з нульовим розголошенням), який гарантує, що користувачі можуть перевіряти, що їхній баланс є частиною загального балансу чистих активів користувачів, не знаючи окремих балансів.
Вступ
У світлі ринкових подій, безпека криптоактивів, які перебувають на зберіганні, стала критичною темою. Користувачі блокчейну високо цінують прозорість та відкритість, але також підтримують приватність та конфіденційність. Це створює дилему під час підтвердження резервів коштів, що утримуються зберігачами. Часто доводиться йти на компроміс між прозорістю, довірою та конфіденційністю даних.
Однак, це не обов'язково так. Комбінуючи протоколи доведення з нульовим розголошенням, такі як zk-SNARK, з деревами Меркла, ми можемо знайти ефективне рішення для всіх сторін.
Що таке доведення з нульовим розголошенням?
Доведення з нульовим розголошенням дозволяє одній стороні (тому, хто підтверджує) визначити достовірність твердження, наданого іншою стороною (тим, хто доводить), не знаючи змісту твердження. Розгляньмо простий приклад.
У вас є замкнений сейф, і як його відкрити знаєте лише ви. Сейф, наприклад, не можна підняти, зламати або відкрити будь-яким іншим способом, крім використання комбінації. Цей факт також встановлений, перевірений і відомий вашому другові, який бере участь в експерименті.
Ви заявляєте своєму другові, що знаєте комбінацію, але не хочете її називати або розкривати сейф перед ним. У верхній частині сейфу є отвір, через який ваш друг може покласти записку. Щоб зробити це доведенням з нульовим розголошенням, ваш друг не повинен мати жодної додаткової інформації про процес, крім цього твердження.
Ви можете довести своєму другові, що знаєте комбінацію, якщо відкриєте сейф, скажете йому, що написано на записці, і знову закриєте його. Проте ви жодного разу не розкрили комбінації.
Більш складний приклад ви можете переглянути у нашій статті "Все про технологію доведення з нульовим розголошенням та її вплив на блокчейн".
Навіщо використовувати доведення з нульовим розголошенням?
Доведення з нульовим розголошенням підходять для доказу чогось без розкриття конфіденційної інформації чи деталей. Це можна використати в тому випадку, якщо ви не бажаєте передавати свою фінансову чи особисту інформацію, яка може бути використана неналежним чином.
У криптовалюті ви можете довести, що маєте приватний ключ, не розкриваючи його і не використовуючи будь-який цифровий підпис. Криптовалютна біржа може також захотіти підтвердити стан своїх резервів, не розкриваючи конфіденційну інформацію про своїх користувачів, зокрема баланси їх індивідуальних акаунтів.
Для цих прикладів (і багатьох інших) доведення з нульовим розголошенням буде використовувати алгоритми, які приймають вхідні дані та повертають значення "true" або "false" (правда або неправда) як вихід.
Визначення доведення з нульовим розголошенням у технічних термінах
З технічного погляду, доведення з нульовим розголошенням слідує певній структурі з певними критеріями. Ми вже розглянули ролі того, хто доводить і того, хто підтверджує, але є ще три критерії, яким має відповідати доведення з нульовим розголошенням:
Завершеність. Якщо твердження правдиве, той, хто підтверджує, буде переконаний наданим доказом без необхідності надання будь-якої іншої інформації чи перевірки.
Надійність. Якщо твердження є неправдивим, той, хто підтверджує, не буде переконаний в істинності твердження, наданим як доказ.
Нульове доведення. Якщо твердження є правдивим, той, хто підтверджує, не дізнається жодної інформації, крім істинності твердження.
Що таке zk-SNARK?
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 $.
Випадок з підтвердженням резервів відрізняється від випадку з коренем Меркла, оскільки користувачі можуть бачити всі транзакції, що містяться в блоці, у блокчейн explorer. Однак, з міркувань безпеки та конфіденційності даних, CEX не захоче розкривати баланс кожного акаунту. Клієнти також не будуть задоволені тим, що баланси їхніх акаунтів стануть надбанням громадськості. У цьому випадку CEX не може довести, що баланси користувачів складають правильну загальну суму, не зробивши баланси інших користувачів видимими.
Одне з рішень, яке біржі можуть розглянути – це залучення довіреної третьої сторони-аудитора. Аудитор може перевірити окремі акаунти та резерви, перш ніж остаточно засвідчити достовірність наданого кореня Меркла. Однак для користувачів цей метод вимагає довіри до аудитора та даних, що використовуються для аудиту. Вам не потрібно покладатися на третю сторону, коли ви можете довіряти даним.
Поєднання zk-SNARK з деревами Меркла
Вищезгадана проблема є ідеальним випадком для використання zk-SNARK. Ми хочемо довести, що резерви повністю покривають зобов'язання користувачів і не є фальсифікованими. Однак з міркувань конфіденційності та безпеки ми не хочемо показувати верифікатору точний склад балансів і резервів користувачів.
Використовуючи zk-SNARK, криптовалютна біржа може довести, що всі набори балансів нод листків дерева Меркла (тобто, баланси акаунтів користувачів) роблять свій внесок у заявлений біржею загальний баланс активів користувачів. Кожен користувач може легко отримати доступ до своєї ноди листків, оскільки вона була включена в процес. zk-SNARK також гарантує, що будь-яке згенероване дерево Меркла не містить користувачів з від'ємним загальним балансом чистих активів (що означало б фальсифікацію даних, оскільки всі позики мають надмірне забезпечення). Також використовується розрахунок глобального стану Binance, тобто список загального чистого балансу кожного активу, яким володіє кожен клієнт Binance.
Давайте подивимось, як Binance підходить до цієї ситуації. Для початку Binance визначає обмеження обчислень, які потрібно довести, і визначає їх як програмовану схему. Нижче представлений набір із трьох обмежень, які Binance використовує у своїй моделі.
Для набору балансів кожного користувача (нода листків дерева Меркла) наша схема гарантує, що:
Баланси активів користувача включаються в розрахунок суми загальних чистих балансів користувачів на Binance.
Загальний чистий баланс користувача більше або дорівнює нулю.
Зміна кореня дерева Меркла є дійсною (тобто без використання фальсифікованої інформації) після оновлення інформації користувача в хеші ноди листків.
Після цього Binance може згенерувати доказ zk-SNARK для побудови дерева Меркла відповідно до схеми. Це призводить до того, що біржа виконує важкі обчислення хешування ID користувачів і балансів, гарантуючи, що доказ проходить обмеження.
Той, хто підтверджує, дослідить доказ (і його відкритий код), щоб переконатися, що обчислення виконано з дотриманням усіх обмежень. Верифікаційні обчислення займають надзвичайно короткий час у порівнянні з часом доведення.
Після кожного випуску підтвердження резервів, біржа буде публікувати інформацію:
1. Доказ Меркла для кожного користувача.
2. Доказ zk-SNARK та публічні входи (хеш списку загального чистого балансу кожного активу та корінь Меркла) схеми для всіх користувачів.
Зацікавлені сторони можуть перевірити доказ Меркла, переконавшись, що їхні індивідуальні баланси внесені в корінь дерева Меркла. Вони також можуть перевірити доведення zk-SNARK, щоб переконатися, що побудова дерева Меркла відповідає обмеженням, визначеним у схемі. Для більш детального пояснення рішення zk-SNARK та його ефективності, будь ласка, перегляньте наш блог "Як zk-SNARK покращують систему підтвердження резервів Binance".
Підсумки
zk-SNARK надають технологію, необхідну для забезпечення цілісності та конфіденційності даних одночасно. Його застосування для підтвердження резервів і підвищення прозорості CEX має сприяти зміцненню довіри до блокчейн-індустрії. Для багатьох такий розвиток подій був довгоочікуваним і припадає на переломний момент для CEX.
Це перша версія нашого zk-SNARK, і ми з нетерпінням чекаємо на відгуки спільноти, щоб продовжувати вдосконалювати систему.