Разработка контрактов DAO: Governor, Timelock, голосование

DAO на бумаге выглядит просто: токены = голоса, большинство решает. На практике это одна из наиболее сложных областей смарт-контрактов — не потому что код особенно трудный, а потому что цена ошибки в governance механике катастрофически высока. Proposal прошёл с ошибкой в логике кворума — и злоумышле

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

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

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+ лет.