Розробка zkApps на Mina
Цей документ містить детальний огляд основних тем, ідей та фактів, пов’язаних із розробкою децентралізованих додатків з нульовим розголошенням (zkApps) на блокчейні Mina.
1. Вступ до zkApps та Zero-Knowledge Proofs (ZKP)
zkApps (Zero-Knowledge Applications) використовують переваги доказів з нульовим розголошенням (ZKP). Концепція ZKP дозволяє одній стороні (доказувачу) переконати іншу сторону (верифікатора), що вона знає певну інформацію або виконала певні обчислення, не розкриваючи при цьому саму інформацію або деталі обчислень.
Приклад замка
Розглянемо приклад, коли у нас є замок, і ви знаєте комбінацію до нього. Ви хочете переконати мене, що ви знаєте комбінацію, але не хочете розкривати цю комбінацію. Це хороший сценарій для нульового розголошення, тому що ви не хочете розкривати цю інформацію, ви хочете зберегти її приватною. Доказувач може відкрити замок, тим самим переконавши верифікатора, що він знає комбінацію, без фактичного розкриття комбінації.
Застосування в обчисленнях
Переносячи це на обчислення, я міг би бути переконаний, що ви виконали якийсь код, але вам не доведеться розкривати будь-які ваші приватні дані або будь-які приватні вхідні дані для цього коду.
Перевага Mina
Mina — це блокчейн-протокол, який сам використовує рекурсивні докази з нульовим розголошенням і дозволяє розробляти zkApps на своїй основі. Це дозволяє перевіряти ZKP децентралізовано за допомогою блокчейну Mina.
2. Основні Компоненти zkApp
Розробка zkApp на Mina включає в себе створення двох основних частин: верифікатора (розгорнутий смарт-контракт) та доказувача (локальний код, що генерує докази).
2.1. Верифікатор (Смарт-контракт)
Розгортання
Смарт-контракт, такий як add.ts (приклади з джерел), розгортається в мережі Mina. “Ми створюємо смарт-контракт під назвою ad, ініціалізуємо його певним значенням, в даному випадку один, а потім у нас є метод для оновлення цього значення шляхом додавання 2 до цього значення”.
Верифікаційний ключ
Розгорнутий смарт-контракт на мережі Mina є по суті верифікатором і містить лише верифікаційний ключ. “У нашому сценарії цей обліковий запис, розгорнутий у мережі, є верифікатором, тому він завжди матиме цей верифікаційний ключ. Він використовується для перевірки доказів з нульовим розголошенням.”
Відсутність коду на ланцюгу
Важливо зазначити, що фактичний код смарт-контракту (add.ts) не зберігається на блокчейні. “Весь код виконання, цей add.ts, є локальним, тому ви насправді можете бачити цей код контракту в Explorer, тому що він не пов’язаний з ZK-додатком, тільки верифікаційний ключ.”
Перевірка виконання
Верифікаційний ключ використовується для перевірки, чи були обчислення виконані коректно. Якщо доказувач намагається “змінити його або зробити щось дивне, це буде виявлено, і верифікація не вдасться”.
2.2. Доказувач (Локальний код)
Створення доказів
Доказувач – це локальний скрипт (наприклад, interact.ts), який генерує докази з нульовим розголошенням. “Це зразок скрипта, що показує, як взаємодіяти з цим смарт-контрактом, і це, по суті, місце, де ви будете генерувати свої докази з нульовим розголошенням.”
Локальне виконання
Всі обчислення, визначені у смарт-контракті (наприклад, метод update, що додає 2 до стану), виконуються локально. “Вся ця частина коду є локальною, тому вона буде виконувати цей код локально, і тут ми бачимо одну з переваг доказів з нульовим розголошенням.”
Відправка доказів
Створений доказ потім відправляється на блокчейн Mina, де верифікатор використовує верифікаційний ключ, щоб перевірити його дійсність. “Ми будемо доказувачем локально на нашому власному комп’ютері, а потім ми будемо відправляти наші докази верифікатору, який є зовнішнім для нашого комп’ютера в мережі блокчейну.”
Оновлення стану
Якщо доказ є дійсним, стан смарт-контракту в блокчейні оновлюється. “Якщо доказ є дійсним, тобто ви виконали код правильно, то оновлення стану відбудуться. Якщо доказ недійсний, то нічого не відбувається.”
3. Налаштування Середовища Розробки
Для розробки zkApps потрібні наступні інструменти:
Node.js та npm
Смарт контракти в Mina пишуться на JavaScript або TypeScript. Node.js надає середовище виконання JavaScript, а npm (Node Package Manager) використовується для встановлення бібліотек.
Редактор коду
Visual Studio Code або WebStorm.
ZK App CLI
Інструмент командного рядка для розробки zkApps на Mina. Він дасть нам всі інструменти, необхідні для початку розробки додатків з нульовим розголошенням.
Встановлення
npm install -g zkapp-cli
Створення проекту
zk project <project_name> #(наприклад, zk project learning)
Перевірка версій
zk version
and
zkapp system
4. Ключові Концепції та Операції
4.1. Генерація та Управління Парами Ключів
Приватний та публічний ключ
Кожен обліковий запис у Mina має пару приватного та публічного ключів. Публічний ключ може бути виведений з приватного, але не навпаки. “Публічний ключ завжди може бути згенерований з приватного ключа, але не навпаки, тому, якщо ви збираєтеся робити щось на кшталт відправки транзакцій, вам знадобиться цей приватний ключ.
Генерація
Приватний ключ генерується за допомогою PrivateKey.random(), а публічний – за допомогою privateKey.toPublicKey().
Формати
Ключі можуть бути конвертовані у формат Base58
для зручного збереження та використання: методами privateKey.toBase58()
та publicKey.toBase58()
.
Використання
- Ключ zkApp: Пара ключів, що належить розгорнутому смарт-контракту.
- Ключ взаємодії (sender account): Приватний ключ, що використовується для підписання транзакцій, які взаємодіють зі смарт-контрактом. Цей обліковий запис платить комісії за транзакції.
- Ключ розгортача (deployer account): Окремий обліковий запис, рекомендований для оплати комісії за розгортання смарт-контракту.
4.2. Взаємодія з Мережею Mina
- Мережеві конфігурації: Використовуйте zk config для налаштування мережевих ендпоінтів (наприклад, testnet) та комісій за транзакції.
- Приклад: zk config -> назва: testnet, URL: https://berkeley.graphql.minaexplorer.com/, комісія: 0.1.
- Фауцет (Faucet): Для отримання тестових монет Mina (testnet Mina) для оплати комісій за транзакції.
- Explorer: Веб-інтерфейс для перегляду транзакцій та стану блокчейну Mina.
- GraphQL Endpoint: Програмний доступ до даних блокчейну Mina. “Це дозволить вам, по суті, виконувати команди, схожі на SQL, graphql, і ви можете бачити документацію тут.”
4.3. Розгортання zkApp
- Команда:
zk deploy <config_name>
(наприклад, zk deploy testnet). - Процес: Команда zk deploy компілює код смарт-контракту та створює верифікаційний ключ, який потім надсилається до мережі Mina як частина транзакції розгортання.
4.4. Взаємодія з Розгорнутим zkApp
- Ініціалізація Mina.Network: Mina.set_active_instance(network) для підключення до мережі. Отримання посилання на zkApp: new Add(zkAppPublicKey).
- Читання стану: Використовуйте
zkApp.num.get()
для отримання значення зі стану смарт-контракту. Перед читанням стану необхідно викликатиawait Mina.fetchAccount({ publicKey: appKey })
. - Створення транзакцій:
await Mina.transaction(feePayer, callback)
- Це створює об’єкт транзакції.- feePayer: Публічний ключ облікового запису, який платить комісію за транзакцію.
- callback: Функція, що визначає дію, яку необхідно виконати (наприклад, ‘zkApp.update()’).
- ‘await zkApp.compile()’: Компіляція та Доведення (Необхідно викликати перед створенням доказів. Цей процес може зайняти деякий час).
- ‘await transaction.prove()’: Генерує доказ з нульовим розголошенням. Також може зайняти час. Це необхідно для створення доказів з нульовим розголошенням.
- ‘await transaction.sign([privateKey]).send()’ - Підписання та Відправка. Приватні ключі облікових записів, які повинні підписати транзакцію, передаються в масиві.
4.5. Валідація Доказів
- Локальне виконання: Код контракту виконується локально для генерації доказу.
- Перевірка верифікаційним ключем: Верифікаційний ключ, розгорнутий у мережі, зможе дізнатися, чи ми виконали цей код правильно. Якщо ми спробували змінити його або зробити щось дивне, це буде виявлено, і верифікація не вдасться.
- Зміна коду: Будь-які зміни до цього коду створять недійсні докази. Для оновлення логіки смарт-контракту та отримання дійсних доказів необхідно повторно розгорнути контракт з новим верифікаційним ключем.
5. Прискорення Розробки за допомогою LocalBlockchain
- Локальний блокчейн:
Mina.LocalBlockchain()
дозволяє виконувати всі операції (компіляцію, розгортання, створення доказів, транзакції) локально, без взаємодії з мережею Mina. Це значно збільшить вашу швидкість розробки, тому що ви зможете робити все локально, вам не доведеться витрачати багато часу на очікування компіляції, перевірки або надсилання речей до мережі для підтвердження. - Тестові облікові записи:
LocalBlockchain
надає попередньо фінансовані тестові облікові записи:local.testAccounts[0]
. Також можна генерувати випадкові облікові записи:PrivateKey.random()
. - Локальне розгортання: За допомогою
LocalBlockchain
, смарт-контракти розгортаються локально при кожному запуску скрипта, що дозволяє швидко тестувати зміни у коді контракту. “Кожен раз, коли ми запускаємо код, він розгортається локально, ви можете швидко змінювати код свого смарт-контракту, щоб перевірити ці зміни. - Управління доказами: Можливість увімкнути/вимкнути докази (proofsEnabled: true/false) під час ініціалізації LocalBlockchain для подальшої економії часу.
Висновок
Розробка zkApps на Mina включає в себе створення смарт-контрактів (верифікаторів) та локальних скриптів для генерації доказів (доказувачів). Основою є взаємодія через ZKP, де локально виконані обчислення перевіряються верифікаційним ключем на блокчейні Mina. Використання інструментів CLI та LocalBlockchain значно спрощує та прискорює процес розробки та тестування.