Розробка контрактів DAO: Governor, Timelock, голосування

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

DAO на папері виглядає просто: токени = голоси, більшість вирішує. На практиці це одна з найскладніших областей смарт-контрактів — не тому що код особливо важкий, а тому що ціна помилки в governance механіці катастрофічно висока. Proposal пройшов з помилкою в логіці кворуму — і зловмисник злив treasury. Так сталося з Beanstalk, коли flash loan governance атака вивела $182M.Beanstalk incident Розробка контрактів DAO — проектування економічно-безпечної системи прийняття рішень. Ми виконуємо роботу під ключ: від дизайну економічної моделі до аудиту та запуску. Наш досвід — понад 10 років у блокчейн-розробці, понад 50 успішних проєктів, включаючи інтеграцію з OpenZeppelin Governor та SafeSnap. Гарантуємо аудит контрактів провідними фірмами.

Decentralized autonomous organization

Як влаштована архітектура DAO?

Governor + Timelock

Стандарт де-факто — OpenZeppelin Governor з TimelockController. Governor керує lifecycle proposal (створення, голосування, постановка в чергу), Timelock додає затримку між прийняттям proposal та його виконанням.

// 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 DAOGovernor is
    Governor,
    GovernorSettings,
    GovernorCountingSimple,
    GovernorVotes,
    GovernorVotesQuorumFraction,
    GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("DAO Governor")
        GovernorSettings(
            1,          // votingDelay: 1 блок (~12 сек на Ethereum)
            50400,      // votingPeriod: ~7 днів в блоках
            100_000e18  // proposalThreshold: мінімум 100K токенів для proposal
        )
        GovernorVotes(_token)
        GovernorVotesQuorumFraction(10)  // 10% від total supply = кворум
        GovernorTimelockControl(_timelock)
    {}

    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, calldatas, descriptionHash);
    }

    function _executor()
        internal view override(Governor, GovernorTimelockControl)
        returns (address)
    {
        return super._executor();
    }
}

TimelockController налаштування

Timelock — критично важливий компонент. Він дає спільноті час зреагувати на прийнятий proposal до його виконання. Мінімальна затримка для treasury операцій — 48 годин, для оновлення контрактів — 72 години.

// Деплой TimelockController
// minDelay: 172800 (48 годин в секундах)
// proposers: [address(governor)]
// executors: [address(0)] — будь-хто може виконати після затримки
// admin: address(0) — немає суперадміна, тільки через Timelock

TimelockController timelock = new TimelockController(
    172800,
    proposers,  // тільки Governor може ставити в чергу
    executors,  // address(0) = будь-хто може виконати
    address(0)  // admin revoked
);

executors: [address(0)] означає що виконати операцію після затримки може будь-хто — це правильно. Інакше створюється centralization point, де конкретний адрес має натиснути «execute».

Proposal lifecycle

Pending → Active → Succeeded/Defeated → Queued → Executed
                          ↓
                       Canceled

Pending: proposal створено, чекає votingDelay блоків. Snapshot голосів береться в останньому блоці перед переходом в Active. Active: відкрито голосування на votingPeriod блоків. Голосування: For, Against, Abstain. Succeeded: кворум досягнуто, For > Against. Queued: в черзі Timelock, чекає minDelay. В цей період Guardian (якщо є) може скасувати. Executed: виконано on-chain.

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

Beanstalk-сценарій: зловмисник бере flash loan на величезну суму, отримує тимчасовий governance контроль (delegateVote для governance ваги), створює і негайно проводить malicious proposal, повертає loan. Все в одній транзакції.

Ключовий захист — snapshot timing. GovernorVotes використовує getPastVotes(account, proposalSnapshot) — вага голосу визначається на блоці snapshot, а не на блоці голосування. votingDelay = 1 (один блок) вже ламає flash loan атаку: не можна зайняти токени і використати їх в тому ж блоці для snapshot. Додаткові заходи: Timelock затримка (48-72 години), proposal threshold (мінімальний баланс для створення proposal) та кворум, прив'язаний до total supply.

Які voting моделі вибрати?

Три основні моделі: token-weighted, quadratic та optimistic. Token-weighted голосування просте і передбачуване, але великі холдери домінують. Quadratic voting справедливіше — вартість N голосів дорівнює N², але потребує Sybil resistance. Optimistic governance виконує proposal автоматично, якщо не було veto — знижує voter apathy.

Token-weighted голосування на L2 (Arbitrum, Optimism) коштує в 10 разів дешевше, ніж на L1, а квадратичне — тільки в 2 рази дорожче звичайного.

Параметр Token-weighted Quadratic Optimistic
Швидкість прийняття рішень Висока Середня Миттєва
Стійкість до whale-домінування Низька Висока Середня
Складність реалізації Низька Висока (потрібна Sybil) Середня
Gas cost на L1 $5-20 $10-40 $2-5 (off-chain)
Параметр Рекомендоване значення Примітка
votingDelay 1 блок Захист від flash loan
votingPeriod 50400 блоків (~7 днів) Достатньо для глобальної спільноти
proposalThreshold 100 000 токенів Знижує спам
quorum 10% від total supply Баланс між безпекою та прохідністю

Як працює multi-sig як Guardian?

Повністю on-chain governance вразливе на ранніх стадіях: мало токенів в обігу, низька явка, легко маніпулювати. Стандартна практика — Guardian мультисиг (Gnosis Safe 3/5 або 4/7), який може скасувати queued proposals, але не може їх ініціювати або виконувати.

// В TimelockController: CANCELLER_ROLE для Guardian Safe
timelock.grantRole(timelock.CANCELLER_ROLE(), guardianSafe);

Guardian не повинен мати PROPOSER_ROLE або EXECUTOR_ROLE — тільки CANCELLER. Це створює asymmetric protection: Guardian захищає від атак, але не контролює governance. Зі зростанням спільноти Guardian поступово виводиться.

Sub-DAO та спеціалізовані комітети

Монолітний Governor для всіх рішень — антипатерн. Типова багаторівнева структура: Core DAO Governor (великі рішення, 7-14 днів голосування), Treasury Committee (швидкі операції < $100K), Technical Committee (аудит, emergency pause), Grants Committee (бюджет $5-20K, off-chain голосування через Snapshot).

Gasless voting через EIP-712

Основна проблема on-chain голосування — gas cost. На Ethereum mainnet один голос коштує $5-20. Більшість DAO вирішує це через off-chain voting (Snapshot) з on-chain execution. Hybrid підхід: голосування в Snapshot (безкоштовно, підпис EIP-712), результат реалізується через SafeSnap. Для on-chain голосування на L2 (Arbitrum, Optimism, Base) gas вже прийнятний — $0.05-0.50 за транзакцію.

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

  • Дизайн governance моделі: параметри, комітети, Guardian схема.
  • Розробка смарт-контрактів: Governor, Timelock, токен, тести атака-сценаріїв.
  • Внутрішній security review та формальна верифікація найбільш критичних модулів.
  • Зовнішній аудит (опціонально — з нашою рекомендацією топових фірм).
  • Інтеграція з Snapshot, Tally.xyz, SafeSnap.
  • Документація: технічна специфікація, deploy runbook, опис emergency процедур.
  • Навчання команди: як створювати proposal, інтерпретувати результати, реагувати на інциденти.
  • Пост-лаунч підтримка: моніторинг, оновлення при зміні стандартів (EIP).

Процес роботи

  1. Дизайн governance (1-2 тижні). Визначення voting model, параметрів, структури комітетів, Guardian схеми.
  2. Розробка контрактів (2-3 тижні). Governor + Timelock + Governance token + тести атака-сценаріїв.
  3. Безпека (1-2 тижні). Внутрішній review всіх сценаріїв, flash loan тести.
  4. Аудит (2-3 тижні). Зовнішній аудит обов'язковий.
  5. Frontend та інтеграція (2-3 тижні). Tally.xyz, Snapshot, SafeSnap.
  6. Поступовий launch. Початок з Guardian мультисигом, зниження централізації по roadmap.

Повний цикл: 3-4 місяці. Вартість розраховується індивідуально залежно від складності governance моделі та наявності існуючого токена. Економія на gas оптимізації може досягати 30%, а зниження вартості аудиту — 20% за рахунок нашої підготовки.

Готові розпочати? Зв'яжіться з нами для детального обговорення вашої DAO.

Докладніше про пост-лаунч підтримкуМи забезпечуємо моніторинг та оновлення контрактів при зміні стандартів.

Отримайте консультацію: зв'яжіться з нами для обговорення вашого проєкту — ми оцінимо його безкоштовно та запропонуємо оптимальне рішення. Замовте розробку контрактів DAO з гарантією аудиту та нашим досвідом 10+ років.

Розробка 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 подібних проєктів і знаємо, де приховуються ризики. Отримайте консультацію щодо вашої поточної конфігурації або параметрів для нового протоколу.