Проєктування протоколу анонімного голосування: розбір технічної реалізації та архітектурних рівнів
Вітання спільноті DOU! Хочу поділитися досвідом проєктування та технічної реалізації архітектури The Development Matrix Protocol — рішення, яке розроблялося для забезпечення анонімного голосування в децентралізованих системах із захистом від Sybil-атак.
Головне інженерне завдання, яке стояло перед нами: дозволити системі перевірити, що користувач є унікальною живою людиною і має право голосу, але при цьому забезпечити повну анонімність і не збирати жодних персональних даних (KYC). Нижче наведено детальний розбір реалізованої нами
Рівень 1. Identity Layer (Інтеграція з Proof-of-Personhood)
Замість збору паспортних даних, на першому рівні система інтегрується з децентралізованими Web3-графами:
• Gitcoin Passport: використовується для аналізу історії та оцінки «ваги» акаунта, що дозволяє автоматично відсікати прості скрипти.
• World ID: застосовується для криптографічної перевірки унікальності користувача (на основі zero-knowledge інструментів) без передачі біометричних даних у мережу.
Рівень 2. Local Device Layer (Генерація ZK-proof на стороні клієнта)
Для забезпечення приватності всі обчислення перенесені на сторону користувача (Client-Side):
• Безпосередньо в браузері або мобільному застосунку генерується ZK-SNARK (Zero-Knowledge Proof).
• Паралельно створюється унікальний криптографічний нуліфікатор (Nullifier).
• Результат: В мережу для верифікації відправляється лише математичний доказ. Приватні ключі та ідентифікатори користувача ніколи не залишають його пристрій.

Рівень 3. On-Chain EVM Smart Contract (Верифікація та захист від повторного голосування)
Смартконтракт в EVM-сумісній мережі приймає ZK-доказ та нуліфікатор для виконання двох завдань:
1. On-Chain верифікація: Контракт перевіряє валідність математичного ZK-доказу. Якщо перевірка успішна — голос зараховується.
2. Контроль Single-Use Nullifier: Контракт зберігає використані нуліфікатори у сховищі (storage). При спробі повторного відправлення голосу з тим самим нуліфікатором транзакція відхиляється. Зв’язати нуліфікатор з початковим ID користувача неможливо.
Рівень 4. Output Layer (Алгоритм розподілу голосів)
На фінальному етапі обробки даних застосовується алгоритм квадратичного зважування (Quadratic Weighting за формулою N²). Це інженерний інструмент, де вартість кожного наступного голосу за одне й те саме рішення зростає експоненціально, що робить масові маніпуляції бюджетами чи голосами економічно нерентабельними.
Поточні технічні виклики
Наразі основна точка оптимізації — зниження часу генерації ZK-доказів на Рівні 2 для мобільних пристроїв, щоб покращити UX. Буду радий почути фідбек колег: які бібліотеки (наприклад, snarkjs/circom) ви використовуєте для клієнтського ZK і як оптимізуєте витрати газу на верифікацію on-chain?
12 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівТи можеш пояснити на практиці простими словами як це працює? Чи ні?
Хай краще пояснить протидію наступній концепції:
Вітання, Ігорю!Ви точно описали головний принцип нашого протоколу.Командир може стояти над душею бійця.Боєць натисне потрібну кнопку при ньому.Але ввечері таємно оновить свій голос.Система зарахує лише останню анонімну транзакцію.Тому в нашій архітектурі діє залізне правило:"Тебе почують, але проголосують як вважають за потрібне, і ти ніколи не дізнаєшся, хто і як проголосував".
Усе вищенаведене проходить у останню годину голосування, батальйон нікуди не піде, доки командир все не перевірить.
Але чого я тут видумую взагалі. Командир просто збирає активовані розблоковані телефони (не хочеш — там посадка є порожня), і голосує як хоче.
горю, дякую за цей коментар! Ви підняли найскладнішу та фундаментальну проблему електронного голосування — Coercion Resistance (стійкість до примусу). Коли під дулом автомата чи за наказом командира людину змушують віддати голос.Але криптографія та блокчейн мають готову технічну відповідь на цей виклик (наприклад, через протоколи на кшталт MACI — Minimal Anti-Collusion Infrastructure):Право на зміну голосу: Виборець може голосувати скільки завгодно разів. Система зарахує лише останній голос. Командир може забрати телефон о 19:00 та проголосувати, але боєць о 19:55 зі свого чи іншого пристрою таємно оновить свій справжній вибір.Фейкові ключі: Система дозволяє згенерувати дійсний на вигляд, але насправді «порожній» або замаскований ключ для голосування за примусом. Командир побачить на екрані успішний запис «за кого треба», але смарт-контракт при підрахунку цей примусовий голос проігнорує.Технології якраз і створюються для того, щоб нівелювати людський фактор та адміністративний тиск. Що думаєте про таку архітектуру?Этот ответ переведет дискуссию из бытового спора («командир отберет телефон») на уровень серьезного инженерного обсуждения криптографических протоколов.Если хотите, мы можем:Сделать ответ более коротким и простымДобавить конкретные примеры использования MACI в мире
Командир забирає пристрої і віддає через тиждень після виборів
Трохи АІ обсьору в кінці.
Вітаю, Яне! Звісно, давайте розберемо весь процес на простому життєвому прикладі, без складної криптографії.
Уявіть, що в місті проходять вибори, але замість паперових паспортів та кабінок все відбувається в цифрі:
Підсумок: Ми отримуємо абсолютно чесні вибори чи голосування в DAO, де неможливо «накрутити» голоси ботами, неможливо проголосувати двічі, і при цьому ніхто в світі не знає, хто саме і за що віддав свій голос.
Звучить неможливо... Той хто керує процесом може роздати скільки треба «бюлетенів»
Яне, у класичних централізованих системах (де є один сервер і всевладний адмін) ви абсолютно праві — там можна «намалювати» будь-яку кількість голосів.Але в децентралізованій архітектурі цей трюк не минає з двох причин:Публічний реєстр виборців (ZK-докази): Кількість випущених «бюлетенів» (токенів) строго обмежена кількістю реальних верифікованих громадян. Оскільки блокчейн публічний, будь-який аудитор або рядовий розробник може миттєво побачити, якщо в мережі з’явиться хоча б один «лівий» токен. Додрукувати їх непомітно технічно неможливо.Смарт-контракти замість адмінів: Логіку підрахунку голосів прописують у відкритому коді, який неможливо змінити після старту голосування. Процесом «керує» не людина чи міністерство, а математичний алгоритм, який виконується одночасно на тисячах незалежних комп’ютерів (нод).
Але ж в анонімній мережі неможливо знати що один токен=1людина...
це може бути 10000токенів на 1 людину... чому ні?
це ломається простим «в нас своє голосування в смартфоні, ми за нього 100500 мільйонів заплатили» )