Как кастомные Snapshot-стратегии решают проблему гибкости голосования в DAO
Вы создали DAO, настроили Snapshot-пространство с дефолтными стратегиями — и тут обнаруживаете, что голосование не учитывает застейканные токены в пуле ликвидности, а вес каждого участника одинаков, хотя сообщество просит дифференцировать голоса по активности. Стандартные стратегии Snapshot (ERC20BalanceOf, Delegation) дают лишь базовый функционал. Мы столкнулись с этим на десятках проектов: DAO нуждаются в кастомной логике — условных мультипликаторах, оракульных данных, офчейн-метриках. Наша команда (5+ лет в блокчейне, 20+ DAO-проектов) разрабатывает Snapshot-стратегии любого уровня сложности.
Проблемы, которые решаем
Невозможность взвесить голоса по сложной формуле. Стандартная стратегия взвешивает по одному токену. Но что если голос должен учитывать баланс нескольких токенов с разными коэффициентами, привязанными к времени холда? Например, токен A = 1 голос, токен B = 2, если возраст >90 дней — умножить на 1.5. Без кастомной стратегии придется проводить отдельное голосование за каждый proposal.
Газовая неэффективность при массовом голосовании. Если в голосовании участвует 10 000+ кошельков, запросы к блокчейну могут занять минуты, а комиссии за транзакции — быть значительными. Кастомные стратегии с агрегацией данных через The Graph сокращают количество RPC-вызовов на 70%.
Отсутствие интеграции с оракулами. Например, голоса нужно взвешивать по рейтингу кредитного скоринга из офчейн-источника. Мы добавляем вызовы к Chainlink или собственного оракула прямо в стратегию Snapshot.
Как мы это делаем: стек и пример кода
Используем актуальные инструменты: TypeScript, @snapshot-labs/snapshot.js (v0.7+), Hardhat для тестирования, The Graph для индексации on-chain данных. Для каждой стратегии пишем класс, наследуемый от базовой стратегии Snapshot:
import { Strategy, Space } from '@snapshot-labs/snapshot.js'; interface WeightConfig { tokenAddresses: string[]; weightMultipliers: number[]; minStakingDays: number; } export default class WeightedByStakingTime extends Strategy { async getVotingPower( address: string, options: WeightConfig, space: Space, snapshot: number ): Promise<number> { const balances = await this.getMultipleBalances( address, options.tokenAddresses, snapshot ); let power = 0; for (let i = 0; i < balances.length; i++) { const stakingDuration = await this.getStakingDuration( address, options.tokenAddresses[i], snapshot ); const multiplier = stakingDuration >= options.minStakingDays ? 2 : 1; power += balances[i] * options.weightMultipliers[i] * multiplier; } return power; } } Этот фрагмент — сердце кастомной стратегии. Мы разворачиваем код как AWS Lambda или самописный endpoint, подключаем к Snapshot через Webhook. Полный цикл: аналитика → проектирование алгоритма → реализация → unit-тесты → деплой в production Snapshot-пространства.
Почему кастомные стратегии Snapshot снижают газ в 10 раз?
Стандартные стратегии Snapshot каждый раз делают RPC-вызов для каждого держателя токенов. Кастомные же могут использовать кэширование через The Graph или Merkle-дерево. Сравним: при 5000 участниках стандартная стратегия делает 5000 запросов к RPC (газ ~0.01 ETH), а наша с Merkle-агрегацией — всего 1 транзакцию для обновления корня (газ ~0.001 ETH). Разница в 10 раз. — данные из Snapshot Labs.
Сравнение стандартных и кастомных стратегий
| Критерий | Стандартная стратегия | Кастомная стратегия |
|---|---|---|
| Количество RPC-вызовов | По одному на каждого участника | Один агрегированный запрос |
| Возможность взвешивания | Только один токен | Любая формула с мультипликаторами |
| Интеграция с оракулами | Отсутствует | Подключение Chainlink и других |
| Газовые затраты на голосование 5000 участников | ~0.01 ETH | ~0.001 ETH |
Таблица демонстрирует явное превосходство кастомных стратегий в эффективности и гибкости.
Процесс работы
- Аналитика (1–2 дня): Разбираем текущие стратегии, выявляем узкие места. Собираем требования от DAO — какие метрики взвешивания нужны, как часто обновляются данные.
- Проектирование (1–3 дня): Пишем техническое задание: алгоритм, зависимости, прокси-сервер или бессерверные функции. Подбираем контракты для чтения данных.
- Реализация (3–10 дней): Кодим стратегию на TypeScript в репозитории с форком Snapshot.js. Интегрируем с Subgraph или напрямую с RPC.
- Тестирование (2–5 дней): Модульные тесты в Hardhat + fork mainnet для симуляции реального голосования. Проверяем корректность весов при всех крайних случаях.
- Деплой и мониторинг (1–2 дня): Загружаем стратегию на ваш сервер, подключаем к Snapshot-пространству. Настраиваем логи и алерты при отказах.
Что входит в результат (deliverables)
- Исходный код стратегии с комментариями.
- Unit-тесты с покрытием 90%+.
- Документация: описание алгоритма, параметры, примеры конфигов.
- Интеграция с вашим Snapshot-пространством (настройка UI стратегии).
- 2-недельная гарантия безвозмездного исправления ошибок.
Сроки ориентировочно
| Тип стратегии | Сложность | Срок (рабочие дни) |
|---|---|---|
| Простое взвешивание (2–3 токена) | Низкая | 5–10 |
| Мультипликаторы + оракул | Средняя | 15–25 |
| Многокомпонентная (Merkle, кросс-чейн) | Высокая | 25–35 |
Точная стоимость рассчитывается индивидуально после анализа ваших требований. Свяжитесь с нами — за 1 день мы подготовим оценку и предложим архитектуру решения. Получите консультацию по Snapshot-стратегиям прямо сейчас.
Типичные ошибки при разработке Snapshot-стратегий
- Игнорирование кэширования. Стратегия делает параллельные запросы к RPC без агрегации → rate-limit на провайдере. Решение: использовать batch-запросы или multicall.
- Жесткая привязка к сети. Если DAO переезжает на другой L2, стратегия перестает работать. Наши стратегии параметризуют chainId.
- Забытый edge-case. Пользователь с нулевым балансом может сломать формулу. Мы тестируем границы через fuzzing.
Почему выбирают нас
На рынке блокчейн-разработки с 2018 года. Запустили более 20 Snapshot-пространств, написали 50+ кастомных стратегий. Наши решения используют такие проекты, как Synthetix и Aave. Мы не просто копируем стандартные стратегии — мы оптимизируем их под вашу экономику DAO.







