Квадратичное голосование (quadratic voting) решает фундаментальную проблему токен-взвешенного голосования: у кита 1000x токенов → 1000x влияния. Мы проектируем системы, где сила голоса пропорциональна корню квадратному от потраченного ресурса. 100 голосовательных кредитов дают 10 единиц голосовой силы. 900 кредитов — 30. Для такой же силы, что 9 человек с 1 кредитом, нужно потратить 81 кредит. Математика: влияние = √credits. Это делает экономически невыгодным доминирование одного участника по сравнению с широкой коалицией. Наш опыт — 5+ лет в блокчейн-разработке, более 10 реализованных систем голосования. Гарантируем аудит кода и защиту от атак.
Как квадратичное голосование решает проблему доминирования китов?
В стандартном голосовании держатель 10 000 токенов имеет в 100 раз больше влияния, чем держатель 100 токенов. QV меняет это: при кредитах, пропорциональных балансу, сила голоса отличается в √100 = 10 раз. Для DAO с неравномерным распределением токенов это существенно повышает справедливость.
QV был предложен экономистами Эриком Познером и Гленом Вейлом в книге Radical Markets. Intuition за механизмом: в стандартном голосовании 1 человек = 1 голос, но интенсивность предпочтений не учитывается. Тот, кому очень важен результат, и тот, кому безразлично, имеют одинаковый вес. QV позволяет выражать интенсивность через количество потраченных кредитов — это ближе к реальным экономическим предпочтениям.
Пример: 100 человек немного предпочитают вариант A. 10 человек очень хотят вариант B. В стандартном голосовании побеждает A. В QV, если каждый из 10 потратит 100 кредитов на B (сила = 10 × √100 = 100), они могут переголосовать коалицию из 100, каждый из которых потратил 1 кредит (сила = 100 × √1 = 100). При балансе предпочтений победит более интенсивно желаемый результат.
| Критерий | Стандартное (1 токен = 1 голос) | Квадратичное (QV) |
|---|---|---|
| Влияние кита | Линейное (1000x токенов = 1000x сила) | Сублинейное (1000x токенов ≈ 31.6x сила) |
| Выражение интенсивности | Невозможно | Через количество кредитов |
| Sybil-устойчивость | Низкая (каждый адрес = 1 голос) | Требует внешней верификации |
| Газовые затраты | Низкие | Выше (расчёт sqrt) |
| Сложность для участников | Простая | Средняя (стратегия распределения) |
Системы голосовательных кредитов
Voice Credits модель
Стандартная схема: каждый участник получает фиксированный бюджет voice credits на период голосования. Кредиты не переносятся и не передаются — каждый период fresh allocation.
contract QuadraticVoting { struct VotingRound { uint256 startTime; uint256 endTime; mapping(uint256 => int256) optionVotes; // optionId => суммарные голоса (sqrt-взвешенные) } uint256 public constant CREDITS_PER_ROUND = 100; // Потраченные кредиты участника в текущем раунде mapping(address => mapping(uint256 => uint256)) public creditsSpent; function vote( uint256 roundId, uint256 optionId, uint256 credits, // credits to spend on this option bool support ) external { VotingRound storage round = rounds[roundId]; require(block.timestamp >= round.startTime && block.timestamp < round.endTime, "Round inactive"); uint256 totalSpent = creditsSpent[msg.sender][roundId] + credits; require(totalSpent <= CREDITS_PER_ROUND, "Exceeds budget"); // QV: голосовая сила = sqrt(credits) uint256 votes = sqrt(credits); creditsSpent[msg.sender][roundId] = totalSpent; if (support) { round.optionVotes[optionId] += int256(votes); } else { round.optionVotes[optionId] -= int256(votes); } emit VoteCast(msg.sender, roundId, optionId, credits, votes, support); } // Integer square root (Babylonian method) function sqrt(uint256 x) internal pure returns (uint256 y) { if (x == 0) return 0; uint256 z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } Токен-взвешенные кредиты
Альтернативная схема: кредиты пропорциональны балансу токенов (как в Gitcoin Grants). Держатель 1000 токенов имеет 1000 кредитов. Но голосовая сила всё равно √ от потраченных кредитов. Это даёт богатым участникам больше кредитов, но не линейное влияние.
Сравнение: при кредитах пропорциональных балансу и балансе 10 000 vs 100 (100x разница) — голосовая сила отличается в √100 = 10x, не в 100x. Это значительно лучше чем стандартное token-weighted.
Delegated QV
Участник может делегировать свои кредиты другому участнику. Делегат голосует пакетом кредитов, но всё равно применяется корневая функция к суммарным кредитам на каждый вариант от каждого первоначального владельца.
Важный нюанс: агрегация кредитов от делегатов должна сохранять информацию об источнике. Если просто суммировать кредиты делегатора в пуле делегата — теряется QV свойство.
// Правильная агрегация: каждый delegation entry отдельно struct Delegation { address delegator; uint256 credits; } // Голосование делегата: применяет QV к каждому делегированию отдельно function voteAsDelegate( uint256 roundId, uint256 optionId, Delegation[] calldata delegations ) external { int256 totalVotes = 0; for (uint i = 0; i < delegations.length; i++) { require( delegatedCredits[delegations[i].delegator][msg.sender][roundId] >= delegations[i].credits, "Insufficient delegated credits" ); totalVotes += int256(sqrt(delegations[i].credits)); } rounds[roundId].optionVotes[optionId] += totalVotes; } Почему Sybil-атака критична для QV и как мы её предотвращаем?
QV полностью ломается без защиты от Sybil-атак. Один участник с 100 кредитами получает силу 10. Сто участников с 1 кредитом каждый получают суммарную силу 100. Разделив идентичность на N адресов, атакующий умножает свою силу в √N раз.
Proof of Humanity
Зарегистрированная уникальная личность в Proof of Humanity или Worldcoin получает 1 аллокацию кредитов. Не поддаётся Sybil — создать тысячу реальных людей нельзя.
Интеграция через on-chain проверку:
interface IProofOfHumanity { function isRegistered(address _submissionID) external view returns (bool); } contract QVWithPoH { IProofOfHumanity public poh; function registerForRound(uint256 roundId) external { require(poh.isRegistered(msg.sender), "Not registered in PoH"); require(!registeredForRound[roundId][msg.sender], "Already registered"); registeredForRound[roundId][msg.sender] = true; creditsBalance[roundId][msg.sender] = CREDITS_PER_ROUND; } } Проблема PoH: охват ограничен, регистрация занимает время, оспариваема. Для DAO с глобальной аудиторией — барьер входа.
Worldcoin World ID
Более масштабируемое решение. Iris scan → ZK proof уникальности. Верификация on-chain через семафор протокол без раскрытия личных данных.
import "@worldcoin/world-id-contracts/src/interfaces/IWorldID.sol"; import { ByteHasher } from "@worldcoin/world-id-contracts/src/helpers/ByteHasher.sol"; contract QVWithWorldID { using ByteHasher for bytes; IWorldID internal worldId; uint256 internal groupId = 1; // Orb-verified uint256 internal externalNullifierHash; function registerWithWorldID( address signal, uint256 root, uint256 nullifierHash, uint256[8] calldata proof ) external { // Верифицирует ZK proof уникальности worldId.verifyProof( root, groupId, abi.encodePacked(signal).hashToField(), nullifierHash, externalNullifierHash, proof ); require(!nullifierUsed[nullifierHash], "Already registered"); nullifierUsed[nullifierHash] = true; // выдать кредиты } } Stake-based anti-sybil
Для DeFi-oriented DAO: требовать stake токенов для участия. Создание многих Sybil аккаунтов становится дорогим. Комбинация с QV: stake определяет базовый кредит, но голосовая сила всё равно √ от потраченного.
Полная архитектура системы
On-chain компоненты
- QuadraticVoting.sol: core контракт с логикой кредитов и голосования
- IdentityRegistry.sol: связь адресов с верифицированными идентичностями (PoH/Worldcoin)
- VotingRoundFactory.sol: создание раундов с параметрами (duration, options, credit allocation)
Off-chain компоненты
Snapshot integration: большинство DAO используют Snapshot для off-chain QV голосований — бесплатно и без ограничений по числу участников. Snapshot поддерживает QV стратегию.
Results calculator: off-chain сервис для сложных QF расчётов, с последующей публикацией результатов on-chain.
Frontend: интерфейс, где участник видит свой бюджет кредитов, слайдеры для распределения по вариантам, live preview голосовой силы каждого решения.
| Параметр | Рекомендация | Обоснование |
|---|---|---|
| Базовые кредиты | 99-100 | Удобный для √ расчётов |
| Длительность раунда | 7-14 дней | Время для осознанного участия |
| Перенос кредитов | Нет | Предотвращает накопление и атаки |
| Минимальный stake | 0.01-0.1% supply | Базовый anti-sybil без высокого барьера |
| Sybil protection | PoH + stake | Многоуровневая защита |
Ограничения и честный взгляд
QV не решает все проблемы governance. Слабые места:
- Collusion: группа участников может координировать распределение кредитов для максимизации суммарного влияния. Это сложнее чем в стандартном голосовании, но не невозможно. MACI (Minimum Anti-Collusion Infrastructure) решает это через ZK cryptography.
- Rational ignorance: большинство участников не будут тратить время на изучение 20 предложений в раунде. QV снижает стоимость игнорирования, но не устраняет её.
- Оптимальная стратегия: математически оптимальная стратегия для участника — не очевидна. Это может снижать participation у нетехнических участников.
QV лучше подходит для ограниченных наборов вариантов (выбор приоритетов, распределение грантов) чем для бинарных да/нет решений по протоколу.
Что входит в работу
- Аудит текущей структуры управления и постановка задачи
- Проектирование архитектуры смарт-контрактов (Solidity/Foundry или Rust/Anchor)
- Реализация core-контрактов QV с voice credits и квадратичным подсчётом
- Интеграция Sybil-защиты (PoH, Worldcoin, или stake-based)
- Разработка фронтенда (React/viem/RainbowKit) с визуализацией влияния
- Написание unit-тестов и integration-тестов (Foundry/Tenderly)
- Развёртывание и настройка раунда голосования
- Документация для пользователей и администраторов
- Пост-релизная поддержка на 1 месяц
Как мы разрабатываем систему квадратичного голосования: пошагово
- Аналитика (2-3 дня): разбираем текущие процессы, выявляем боль и требования к голосованию.
- Проектирование (3-5 дней): создаём архитектуру смарт-контрактов, выбираем методы Sybil-защиты и платформу.
- Разработка (14-30 дней): пишем контракты на Solidity, интегрируем PoH/Worldcoin, разрабатываем фронтенд.
- Тестирование (5-7 дней): проводим unit- и integration-тесты, используем Slither и Mythril для статического анализа.
- Деплой (1-2 дня): развёртываем контракты в mainnet, настраиваем раунд голосования.
- Пост-релизная поддержка: 1 месяц мониторинга и исправления.
Сроки: от 3 недель (базовый QV без anti-sybil) до 12 недель (полный продукт с PoH/Worldcoin и делегированием). Стоимость рассчитывается индивидуально — инвестиции в справедливое голосование окупаются благодаря снижению конфликтов и повышению активности сообщества.
Пример расчёта голосов
Участник с 9 кредитами получает 3 голоса (√9). Если он хочет поддержать два варианта, распределение 4 и 5 кредитов даёт 2 + 2.236 = 4.236 голоса, что больше, чем 3 при концентрации на одном варианте. Это стимулирует распределять кредиты, а не концентрировать.Получите консультацию по внедрению квадратичного голосования в вашу DAO. Наши инженеры предложат оптимальное решение под ваши задачи. Свяжитесь с нами, чтобы обсудить детали.







