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).
Процесс работы
- Дизайн governance (1-2 недели). Определение voting model, параметров, структуры комитетов, Guardian схемы.
- Разработка контрактов (2-3 недели). Governor + Timelock + Governance token + тесты атака-сценариев.
- Безопасность (1-2 недели). Внутренний review всех сценариев, flash loan тесты.
- Аудит (2-3 недели). Внешний аудит обязателен.
- Frontend и интеграция (2-3 недели). Tally.xyz, Snapshot, SafeSnap.
- Постепенный launch. Начало с Guardian мультисигом, снижение централизации по roadmap.
Полный цикл: 3-4 месяца. Стоимость рассчитывается индивидуально в зависимости от сложности governance модели и наличия существующего токена. Экономия на gas оптимизации может достигать 30%, а снижение стоимости аудита — 20% за счёт нашей подготовки.
Готовы приступить? Свяжитесь с нами для детального обсуждения вашей DAO.
Подробнее о пост-лаунч поддержке
Мы обеспечиваем мониторинг и обновление контрактов при изменении стандартов.Получите консультацию: свяжитесь с нами для обсуждения вашего проекта — мы оценим его бесплатно и предложим оптимальное решение. Закажите разработку контрактов DAO с гарантией аудита и нашим опытом 10+ лет.







