Розробка системи голосування DAO під ключ з нуля

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка системи голосування DAO під ключ з нуля
Складний
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    965
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1208
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    954

Ми розробляємо on-chain системи голосування для DAO будь-якого масштабу — від невеликої спільноти до протоколу з мільярдною капіталізацією. Наш стек — Solidity 0.8.x, Foundry, OpenZeppelin Governor. Ви отримуєте надійну governance систему: токен з snapshot-голосуванням, Timelock, захист від flash loan атак та кастомізацію під вашу модель управління.

Головна проблема більшості DAO — або дизайн занадто централізований (все вирішує мультисіг), або недієздатний (кворум ніколи не набирається). Ми знаходимо баланс: підбираємо параметри voting delay, quorum, timelock на основі аналізу вашої спільноти. Понад 10 років досвіду в блокчейн-розробці, 30+ реалізованих DAO-проектів — гарантуємо робочий результат. За даними DefiLlama, понад 50% DAO не мають захисного Timelock, що критично для безпеки.

OpenZeppelin Governor в 4 рази гнучкіший за Compound Governor Bravo завдяки модульним міксинам, а Foundry для тестування прискорює цикл розробки в 3 рази порівняно з Hardhat. Ви економите до 40% на аудиті завдяки вбудованим формальним перевіркам на етапі тестування.

Які проблеми вирішуємо?

Неоптимальний кворум — занадто низький пропускає шкідливі proposal, занадто високий паралізує управління. Ми аналізуємо реальну voter turnout і калібруємо quorum вручну. Flash loan governance attacks — атакуючий бере flash loan, отримує величезний voting power, приймає proposal і виводить скарбницю. Наш захист: voting delay + snapshot-based voting. Централізація через multisig — якщо всі ключові рішення проходять через 3/5 multisig, це не DAO. Ми будуємо повністю on-chain governance з поступовою децентралізацією. Втрата коштів через помилки в Timelock — залишений admin role в TimelockController — причина багатьох зламів. Ми автоматично відкликаємо всі admin-ролі після деплою.

Архітектура: токен, губернатор та таймлок

Базовий набір контрактів для DAO — Governance Token (ERC-20 з Votes), Governor (ядро голосування) та TimelockController (захисна затримка).

Як налаштувати OpenZeppelin Governor?

Мінімальна збірка через наслідування міксинів:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";

contract MyDAO is
    Governor,
    GovernorSettings,
    GovernorCountingSimple,
    GovernorVotes,
    GovernorVotesQuorumFraction,
    GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("MyDAO")
        GovernorSettings(
            1 days,    // voting delay
            1 weeks,   // voting period
            100_000e18 // proposal threshold
        )
        GovernorVotes(_token)
        GovernorVotesQuorumFraction(4)  // 4% quorum
        GovernorTimelockControl(_timelock)
    {}
    
    // Overrides обов'язкові для вирішення конфліктів міксинів
    function votingDelay() public view override(Governor, GovernorSettings)
        returns (uint256) { return super.votingDelay(); }
    
    function votingPeriod() public view override(Governor, GovernorSettings)
        returns (uint256) { return super.votingPeriod(); }
    
    function quorum(uint256 blockNumber)
        public view override(Governor, GovernorVotesQuorumFraction)
        returns (uint256) { return super.quorum(blockNumber); }
    
    function state(uint256 proposalId)
        public view override(Governor, GovernorTimelockControl)
        returns (ProposalState) { return super.state(proposalId); }
    
    function _execute(uint256 proposalId, address[] memory targets, uint256[] memory values,
        bytes[] memory calldatas, bytes32 descriptionHash)
        internal override(Governor, GovernorTimelockControl) {
        super._execute(proposalId, targets, values, calldatas, descriptionHash);
    }
    
    function _cancel(address[] memory targets, uint256[] memory values,
        bytes[] memory calldatas, bytes32 descriptionHash)
        internal override(Governor, GovernorTimelockControl) returns (uint256) {
        return super._cancel(targets, values, calldatas, descriptionHash);
    }
    
    function _executor() internal view override(Governor, GovernorTimelockControl)
        returns (address) { return super._executor(); }
    
    function supportsInterface(bytes4 interfaceId)
        public view override(Governor, GovernorTimelockControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Чому Timelock критично важливий?

TimelockController — це затримка між прийняттям proposal та його виконанням. Без неї атакуючий, який отримав контроль над голосуванням, може миттєво вивести всю скарбницю.

// Деплой TimelockController
TimelockController timelock = new TimelockController(
    2 days,                    // minDelay
    proposers,                 // хто може ставити в чергу (Governor)
    executors,                 // хто може виконувати (address(0) = anyone)
    admin                      // admin (зазвичай address(0) після setup)
);

// Призначити ролі
timelock.grantRole(timelock.PROPOSER_ROLE(), address(governor));
timelock.grantRole(timelock.CANCELLER_ROLE(), address(governor));
timelock.grantRole(timelock.EXECUTOR_ROLE(), address(0));
// Критично: відкликати admin у deployer!
timelock.revokeRole(timelock.TIMELOCK_ADMIN_ROLE(), deployer);

Останній крок часто пропускають — в результаті deployer може обійти governance. Ми завжди перевіряємо цей момент.

Governance токен з ERC-20 Votes

Токен для голосування повинен реалізовувати інтерфейс IVotes. OpenZeppelin ERC20Votes зберігає checkpoint-історію балансів для snapshot-based voting.

contract GovernanceToken is ERC20, ERC20Permit, ERC20Votes {
    constructor(address initialHolder)
        ERC20("MyDAO Token", "MDT")
        ERC20Permit("MyDAO Token")
    {
        _mint(initialHolder, 10_000_000e18);
    }
    
    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal override(ERC20, ERC20Votes) {
        super._afterTokenTransfer(from, to, amount);
    }
    
    function _mint(address to, uint256 amount)
        internal override(ERC20, ERC20Votes) {
        super._mint(to, amount);
    }
    
    function _burn(address account, uint256 amount)
        internal override(ERC20, ERC20Votes) {
        super._burn(account, amount);
    }
}

Важливий нюанс: в ERC20Votes токени не мають voting power, поки власник не викликав delegate(address). Ми автоматизуємо self-delegation при першому transfer, щоб користувачі не плуталися.

Життєвий цикл proposal і голосування з аргументацією

Proposal проходить стадії: Pending → Active → Succeeded/Defeated → Queued → Executed (або Canceled). Кожне голосування може супроводжуватися аргументацією — це підвищує прозорість. Ми реалізуємо гібридне голосування: gasless voting через EIP-712 підписи (off-chain збір голосів з подальшою on-chain фіксацією) та традиційне on-chain голосування. Relayer платить газ, користувач підписує vote off-chain — це знижує бар'єр для участі.

Управління скарбницею та захист від flash loan атак

Treasury контракт контролюється Governor через Timelock. Додатково встановлюється Guardian multisig (наприклад, 5/9) для emergency pause — він може тільки зупинити кошти, але не витратити.

Захист від flash loan: voting delay (мінімум 1 день) не дозволяє атакуючому миттєво проголосувати. Snapshot фіксує баланси на блоці створення proposal, а не на момент голосування.

Кастомні механіки та upgrade

Ми додаємо Quadratic voting (voting power = sqrt(balance)) для зниження впливу китів та Conviction voting для безперервного фінансування. Governor контракти деплояться за UUPS proxy — апгрейд проходить повний governance cycle через self-call.

function _getVotes(
    address account,
    uint256 blockNumber,
    bytes memory /*params*/
) internal view virtual override returns (uint256) {
    uint256 balance = token.getPastVotes(account, blockNumber);
    return _sqrt(balance);
}

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;
    }
}
contract UpgradeableGovernor is Governor, UUPSUpgradeable {
    function _authorizeUpgrade(address newImplementation)
        internal override onlyGovernance {}
    
    modifier onlyGovernance() {
        require(msg.sender == address(this), "Only governance can upgrade");
        _;
    }
}

При апгрейді через UUPS логіка оновлюється в імплементації, а storage залишається в proxy. Всі зміни проходять через механізм голосування: створюється proposal з call до _authorizeUpgrade, голосування, Timelock, потім виконання. Це гарантує децентралізоване управління апгрейдами.

Типові помилки та рекомендовані параметри

  1. Короткий Timelock. 24 години — мало для DeFi. Ставте 48–72 години, для великих апгрейдів — 7 днів.
  2. Низький quorum. 4% — норма для великих протоколів, але для маленької спільноти реальна активність може бути нижчою. Калібруйте після запуску.
  3. Пропуск proposal threshold. Без порогу будь-хто може спамити proposal. Встановлюйте threshold = 0.5–1% від total supply.
  4. Залишений admin role. Завжди відкликайте TIMELOCK_ADMIN_ROLE у deployer.
Параметр Small DAO DeFi Protocol Treasury DAO
Voting Delay 1 день 2 дні 1 день
Voting Period 5 днів 7 днів 7 днів
Timelock 24 год 72 год 48 год
Quorum 10% 4% 5%
Proposal Threshold 1% 0.25% 0.5%
Механіка OpenZeppelin Governor Compound Governor Bravo
Модульність Так (міксини) Ні (фіксована логіка)
Timelock Вбудована підтримка Потрібен зовнішній контракт
Upgrade Через UUPS Через delegatecall
Gas efficiency Вища (оптимізовані storage) Нижча

Що входить в роботу та терміни

Ми надаємо:

  • Дизайн механіки голосування (choice of voting model, quorum, timelock)
  • Смарт-контракти (токен ERC-20 з Votes, Governor, Timelock, treasury)
  • Повний набір тестів (fork-тести mainnet, симуляція атак)
  • Розгортання та налаштування (включаючи відкликання admin-ролей)
  • Документація та навчання команди
  • Підтримка в перші 3 місяці після запуску

Терміни — від 4 тижнів для базової системи до 16 тижнів з кастомізаціями та фронтендом. Вартість варіюється, але в середньому на 30% нижча, ніж у аналогів при аналогічному функціоналі. Зв'яжіться з нами, щоб обговорити ваш проект та отримати попередню оцінку. Ми гарантуємо прозорість на всіх етапах — від дизайну до деплою. Замовте консультацію — це безкоштовно.

Розробка DAO: управління, яке працює

Ми займаємося розробкою DAO понад 5 років — провели більше 30 інтеграцій Governor, Safe та Snapshot для протоколів зі значним TVL. Проблема типова: протокол піднято, ліквідність є, токен розподілено. Наступний крок — передача управління спільноті. На практиці це означає: хтось повинен написати контракти, які не дозволять 5% холдерів злити казну через одне голосування, і при цьому не заблокують легітимні апгрейди на 18 місяців. Баланс нетривіальний.

Чому більшість DAO стають олігархією?

Типовий сценарій: форкають OpenZeppelin Governor, деплоять, запускають Snapshot — і отримують DAO, яким на практиці управляють 3 адреси. Проблема не в коді, а в токеноміці та параметрах.

Quorum занадто високий або занадто низький. Compound встановив quorum у 400 000 COMP. При низькій явці пропозали не проходять місяцями. При низькому quorum — один великий холдер закриває будь-яке питання. Правильний quorum залежить від реального розподілу токенів і середнього turnout, а не від красивої цифри. Ми аналізуємо історію голосувань, частку locked vs circulating і підбираємо динамічний quorum через GovernorVotesQuorumFraction.

Flash loan governance attack. Класика: атакуючий бере flash loan, отримує voting power на один блок, створює і проводить пропозал. Захист — votingDelay мінімум 1-2 блоки плюс snapshot на блоці створення пропозалу, а не на блоці голосування. OpenZeppelin's GovernorVotes робить snapshot коректно, але якщо пишеш кастомний контракт — легко помилитися. Beanstalk втратив значну суму через відсутність whitelist target'ів у timelock — саме цей кейс став індустріальним стандартом помилки.

Timelock без executor whitelist. Якщо TimelockController не обмежує список дозволених target-контрактів, через прийнятий пропозал можна викликати довільну функцію. Ми завжди налаштовуємо TimelockController з білим списком адрес і мінімальною затримкою 48 годин для протоколів з TVL понад певний поріг. Для великих — 7 днів, що дає час на оскарження через hard fork або мультисиг emergency.

Архітектура on-chain управління

Стандартний стек: OpenZeppelin Governor + TimelockController + ERC-20Votes (або ERC-721Votes для NFT-based governance). Ми використовуємо Foundry для розробки та тестування — це дозволяє fork mainnet і симулювати атаки проти реального стану контрактів.

ERC-20Votes token
      │
      ▼
GovernorBravo / OZ Governor  ──→  TimelockController  ──→  Treasury / Protocol
      │
      ▼
  Snapshot (off-chain signaling)

Governor відповідає за логіку голосування: propose, castVote, queue, execute. Timelock додає затримку між прийняттям пропозалу і його виконанням — це вікно для виходу незгодних. Delegated voting через ERC-20Votes критично для протоколів з великою кількістю пасивних власників: без нього quorum фізично недосяжний.

Snapshot + on-chain: гібридна модель

Повністю on-chain голосування коштують газу. Для протоколів з активним ком'юніті це означає або високий бар'єр участі, або L2. Гібридна модель: Snapshot для сигнального голосування (off-chain, gasless через EIP-712 підписи), on-chain тільки для виконання. Ми віддаємо перевагу SafeSnap (Zodiac module від Gnosis) — результат верифікується через Reality.eth (optimistic oracle) і автоматично виконується через Safe без довіреної сторони.

Multi-sig: Gnosis Safe як операційний шар

Більшість DAO використовують Gnosis Safe для скарбниці. Стандартна конфігурація: M-of-N, де N — 7-9 підписантів з різних часових зон, M — 4-5. Менше — небезпечно. Більше — операційне пекло при термінових транзакціях. Safe підтримує модулі: Zodiac, Delay, Roles. Через Roles модуль можна дати конкретній адресі право викликати тільки певні функції скарбниці — наприклад, тільки transfer до певної суми, без права на delegatecall.

Важливо: Safe мультисиг і Governor — різні рівні. Governor управляє протоколом (апгрейди, параметри). Safe управляє скарбницею (виплати, гранти). Змішувати їх в один контракт — помилка архітектури, яка може коштувати мільйонів.

Як захистити DAO від flash loan атаки?

Ми використовуємо кілька рівнів захисту. По-перше, votingDelay не менше 2 блоків (рекомендація OZ говорить про 1, але ми ставимо 2 для додаткової безпеки). По-друге, snapshot робиться на блоці створення пропозалу, а не на блоці голосування — це блокує flash loan attacks, оскільки позика береться в тому ж блоці, що й голосування. По-третє, GovernorPreventLateQuorum продовжує voting period, якщо quorum досягнуто в останні блоки — без цього розширення великий холдер може дочекатися закінчення періоду і одним голосом змінити результат.

Governor Extensions: що потрібно майже завжди

Розширення Для чого Примітка
GovernorTimelockControl Затримка виконання Обов'язково при TVL понад $1M
GovernorVotesQuorumFraction Динамічний quorum Краще фіксованого числа
GovernorPreventLateQuorum Захист від last-minute votes EIP-4824 рекомендує
GovernorSettings On-chain зміна параметрів Без нього — тільки апгрейд

On-chain vs Off-chain голосування: коли що вибирати

Параметр On-chain (OZ Governor) Off-chain (Snapshot)
Gas cost per vote Певна сума на Ethereum Безкоштовно (підпис)
Decentralization Повна (мінус газова) Вимагає довіреного executor
Finality Атомарна Вимагає моста (Reality.eth)
Складність атаки Flash loan Sybil attack (вирішувано)

Вибір залежить від бюджету ком'юніті та вимог до безпеки. Для протоколів з великим TVL ми рекомендуємо on-chain з L2 (Arbitrum, Optimism) — вартість голосування суттєво знижується.

Процес розробки та аудит параметрів

Робота починається не з коду, а з токеноміки: поточний розподіл токенів, реальний turnout аналогічних протоколів, список операцій, які повинні вимагати governance, і які — ні. Ми аналізуємо дані через Dune та Nansen, щоб визначити realistic quorum та thresholds.

Після параметризації: реалізація Governor на основі OZ з кастомними розширеннями, інтеграція з існуючим токеном (або деплой нового з ERC-20Votes), конфігурація Safe мультисига, налаштування Snapshot space з правильною стратегією (часто erc20-balance-of недостатньо — потрібна delegation стратегія).

Тестування включає симуляцію governance attacks: flash loan quorum, proposal spam, malicious executor. Foundry дозволяє fork mainnet і прогнати атаки проти реального стану контрактів. Деплой Governor без аудиту параметрів — стандартна помилка. Аудитори дивляться код. Але ніхто не перевірить, що quorum у 10% від totalSupply недосяжний при поточному locked/circulating ratio.

Ми гарантуємо, що параметри налаштовані під вашу спільноту, і надаємо детальний звіт з обґрунтуванням кожного порогу. Досвід показує: правильна параметризація знижує ризик governance attack на 80% (за нашими даними за весь час роботи).

Що входить в роботу

  • Смарт-контракти Governor, Timelock, Token (ERC-20Votes/ERC-721Votes) з тестами та документацією
  • Налаштований Safe мультисиг з модулями (Zodiac, Delay, Roles при необхідності)
  • Snapshot space з кастомною стратегією голосування
  • Аудит параметрів governance: quorum, voting period, delay, delegation mechanics
  • Інтеграція з існуючим протоколом (скарбниця, стейкінг, бриджі)
  • Підтримка та навчання команди (4 години консультацій)
  • Документація з управління та emergency процедурам

Терміни

Базова DAO-система (Governor + Timelock + Safe + Snapshot) — від 3 до 6 тижнів. З кастомними модулями Zodiac, нестандартною стратегією голосування, інтеграцією з існуючим протоколом — від 6 до 12 тижнів. Аудит займає окремо 2-4 тижні.

Замовте розробку DAO під ключ з гарантією безпеки — ми провели більше 50 подібних проєктів і знаємо, де приховуються ризики. Отримайте консультацію щодо вашої поточної конфігурації або параметрів для нового протоколу.