Разработка DAO-портала: голосование, предложения, делегирование

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка DAO-портала: голосование, предложения, делегирование
Сложный
~2-4 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1362
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1253
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    958
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1190
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    932
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    949

Реализация DAO-портала на сайте

Децентрализованные автономные организации (DAO) сталкиваются с проблемами: газ-затратные транзакции отталкивают участников, отсутствие делегирования снижает влияние мелких держателей, а ручное создание предложений требует calldata — боль для пользователей. Мы построили портал, который закрывает эти пробелы: предложения с квадратичным взвешиванием, делегирование, интеграция off-chain Snapshot для сигнальных голосов и индексация через The Graph. Расскажу как это сделать правильно.

Как DAO-портал решает проблемы управления?

Первая проблема — вовлечённость. Если голосование требует gas, пользователи уходят. Snapshot решает это off-chain, но исполнение остаётся on-chain. Мы подключаем Timelock Controller: сигнальное голосование → исполнительский Governor. Вторая — централизация прав. Без делегирования мелкие держатели не влияют. Вводим Delegation Mapping (как Aave). Третья — сложность создания предложений. Ручное кодирование calldata — боль. Делаем форму с автогенерацией бинарных данных через encodeFunctionData из Viem.

Архитектура DAO-портала

Двухуровневая: off-chain (Snapshot) для сигнальных голосов и on-chain (Governor + Timelock) для обязательных. Governance Token использует EIP-2612 для делегирования без лишних транзакций. Размер одного on-chain голосования — около 200 000 gas, но с L2 (Arbitrum, Polygon) затраты падают до 500 gas.

// 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/GovernorTimelockControl.sol";

contract DAOGovernor is
    Governor, GovernorSettings, GovernorCountingSimple,
    GovernorVotes, GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("DAO Governor")
        GovernorSettings(
            1 days,   // voting delay
            7 days,   // voting period
            100_000e18  // proposal threshold
        )
        GovernorVotes(_token)
        GovernorTimelockControl(_timelock)
    {}

    // 4% токенов нужно для кворума
    function quorum(uint256 blockNumber) public view override returns (uint256) {
        return token.getPastTotalSupply(blockNumber) * 4 / 100;
    }
}

Frontend: создание предложения

Пользователь заполняет форму: адрес контракта, метод (ABI), аргументы. Кодируем вызов, отправляем транзакцию в Governor. Используем wagmi и Viem.

import { useWriteContract, useAccount } from 'wagmi';
import { encodeFunctionData } from 'viem';

function CreateProposal() {
  const { writeContractAsync } = useWriteContract();

  const handleSubmit = async (formData: ProposalFormData) => {
    const calldata = encodeFunctionData({
      abi: treasuryAbi,
      functionName: 'transfer',
      args: [formData.recipient, formData.amount]
    });

    await writeContractAsync({
      address: GOVERNOR_ADDRESS,
      abi: governorAbi,
      functionName: 'propose',
      args: [
        [TREASURY_ADDRESS],
        [0n],
        [calldata],
        formData.description
      ]
    });
  };

  return <ProposalForm onSubmit={handleSubmit} />;
}

Frontend: голосование

Отображаем вес голоса на момент снепшота. Кнопки «За», «Против», «Воздержаться». Опционально — причина.

function VoteOnProposal({ proposalId }) {
  const { writeContractAsync } = useWriteContract();
  const { address } = useAccount();

  const { data: votingPower } = useReadContract({
    address: GOVERNOR_ADDRESS,
    abi: governorAbi,
    functionName: 'getVotes',
    args: [address!, proposalSnapshotBlock]
  });

  const castVote = async (support: 0 | 1 | 2) => {
    await writeContractAsync({
      address: GOVERNOR_ADDRESS,
      abi: governorAbi,
      functionName: 'castVoteWithReason',
      args: [proposalId, support, reason]
    });
  };

  return (
    <div>
      <p>Ваш вес голоса: {formatTokens(votingPower)} токенов</p>
      <button onClick={() => castVote(1)}>За</button>
      <button onClick={() => castVote(0)}>Против</button>
      <button onClick={() => castVote(2)}>Воздержаться</button>
    </div>
  );
}

Индексирование через The Graph

Чтобы показывать историю предложений и результаты без постоянных запросов к ноде, используем The Graph. Поднимаем subgraph для Governor контракта.

const PROPOSALS_QUERY = gql`
  query GetProposals($state: String, $first: Int, $skip: Int) {
    proposals(
      where: { state: $state }
      orderBy: createdAt
      orderDirection: desc
      first: $first
      skip: $skip
    ) {
      id
      proposalId
      proposer { id }
      description
      state
      forVotes
      againstVotes
      abstainVotes
      quorum
      startBlock
      endBlock
      createdAt
    }
  }
`;

Интеграция Snapshot для сигнальных голосов

Для сигнальных голосований без газа — Snapshot. Подписываем мета-транзакцию, данные хранятся в IPFS.

import snapshot from '@snapshot-labs/snapshot.js';

const client = new snapshot.Client712('https://hub.snapshot.org');

await client.proposal(web3, address, {
  space: 'your-dao.eth',
  type: 'single-choice',
  title: 'Принять новую стратегию токенов?',
  body: '## Описание\n\nПолное описание предложения...',
  choices: ['За', 'Против', 'Воздержаться'],
  start: Math.floor(Date.now() / 1000),
  end: Math.floor(Date.now() / 1000) + 7 * 24 * 3600,
  snapshot: await web3.eth.getBlockNumber(),
  plugins: JSON.stringify({}),
  app: 'your-dao-app'
});

Почему on-chain голосование с Timelock безопаснее?

Timelock Controller задерживает исполнение на заданное время (например, 2 дня). Это даёт возможность отменить вредоносное решение, если его заметить. Рекомендуем добавлять роль CANCELLER для мультисига. Такой подход используют ведущие DAO — Compound, Uniswap, Aave.

Процесс разработки DAO-портала

  1. Аналитика: определяем механики голосования, кворум, пороги, типы предложений. Выбираем стандарты токенов (ERC-20, ERC-721). Результат — спецификация контрактов.
  2. Проектирование: архитектура контрактов, схемы данных, frontend-маршруты. Результат — техническое задание.
  3. Разработка: пишем смарт-контракты (OpenZeppelin), frontend (Next.js + Wagmi/Viem), subgraph (The Graph). Результат — код с тестами.
  4. Аудит: статический анализ (Slither, MythX) и внешний аудит. Результат — отчёт аудита.
  5. Деплой: разворачиваем на выбранной сети (Ethereum, Polygon, Arbitrum), настраиваем IPFS, деплоим интерфейс на Vercel/Cloudflare. Результат — запуск в мейннете.
  6. Мониторинг: подключаем дашборд Tenderly для отслеживания транзакций. Результат — дашборд операций.

Сравнение: готовые платформы vs индивидуальная разработка

Критерий Готовые решения (Snapshot, Aragon) Индивидуальная разработка
Кастомизация Ограничена шаблонами Полный контроль над контрактами и интерфейсом
Безопасность Зависит от аудита платформы Возможность усилить аудит под свои риски
Интеграции Только встроенные Любые внешние сервисы
Гибкость механик Фиксированные типы голосования Квадратичное, весовое, multichain
Расходы на газ Нативная оптимизация не всегда Оптимизируем calldata, используем L2

Индивидуальная разработка оправдана, когда нужна уникальная токеномика или строгие требования к безопасности. Она в 3 раза быстрее позволяет адаптировать продукт под специфические задачи сообщества.

Результат и сроки

Вы получаете полный набор смарт-контрактов (Governor, Timelock, Governance Token) с тестами и документацией. Frontend на Next.js с роутингом, формами, отображением данных. Интеграция с Snapshot (опционально). Индексер The Graph. Инструкция по развертыванию и обучение команды.

Мы гарантируем чистоту кода, следование Solidity best practices и использование проверенных паттернов OpenZeppelin. Каждый контракт проходит многоуровневый аудит. Более 50 успешных запусков DAO в мейннете — от DeFi до NFT-сообществ.

Типичные ошибки при разработке DAO: неправильная настройка quorum (слишком низкий или высокий), игнорирование отзыва голоса (revocation), отсутствие механизма обновления контрактов (upgradeability).

Сроки реализации: базовая реализация (контракты + full-stack) занимает от 4 до 8 недель. Стоимость рассчитывается индивидуально. Для оценки вашего проекта свяжитесь с нами — мы подготовим предложение в течение 2 дней.

Разработка корпоративных порталов и внутренних систем

Мы занимаемся разработкой корпоративных порталов — CRM, ERP, LMS и Intranet. Каждый такой проект начинается не с вёрстки лендинга, а с того, как бизнес-правила лягут в архитектуру: кто видит какие данные, как синхронизируются 1С и учётная система, как 500 контактов превращаются в 500 000 без падения производительности. За 7 лет мы реализовали более 40 порталов для компаний с численностью от 50 до 5000 сотрудников. Оценим ваш проект за два рабочих дня — просто свяжитесь с нами.

Публичный сайт можно запустить без детального проектирования — итеративно править по фидбеку. С корпоративным порталом так не работает: стоимость исправления архитектурных решений после запуска на 200 пользователей несопоставимо выше. Поэтому мы уделяем 70% времени аналитике и прототипированию, а код пишем только после согласования ролевой матрицы и интеграционной схемы.

Три зоны, где чаще всего принимаются плохие решения, — модель прав доступа, производительность на больших данных и real-time обновления.

Как построить ролевую модель для 30 отделов?

Модель прав доступа. «Менеджер видит только своих клиентов, руководитель отдела — весь отдел, директор — всю компанию, но финансовые данные — только финансовый директор и выше». Это не три роли — это матрица из ролей, разрешений, организационных единиц и владения записями. Если это реализовать через if ($user->role === 'manager') в контроллерах — через полгода код станет неподдерживаемым.

Правильный подход: Spatie Laravel Permission для базовой ролевой модели + Policy классы для object-level permission (can('view', $deal) проверяет не только роль, но и владение). Для сложных иерархических структур — ABAC (Attribute-Based Access Control) вместо RBAC.

Производительность на больших данных. CRM с 500 000 контактов, фильтрация по 10 полям, сортировка по активности — это задача, где наивная реализация выдаёт 15-секундные запросы. Composite indexes, денормализация агрегатов (last_activity_at на самой записи вместо MAX по связанной таблице), Elasticsearch для full-text поиска по контактам.

Real-time обновления. Несколько сотрудников работают с одним документом или задачей. Без WebSocket — постоянные setInterval с polling каждые 5 секунд, лишняя нагрузка на сервер, задержка обновлений. Laravel Broadcasting + Pusher/Soketi или собственный WebSocket сервер на Node.js — для уведомлений и изменений в реальном времени.

CRM-системы

Типичный набор: контакты, компании, сделки, активности, воронка продаж, отчёты. Технически это несложно. Сложность — в деталях.

Pipeline с кастомными стадиями. Каждая компания хочет свою воронку. Стадии должны быть настраиваемыми без деплоя. Таблица pipeline_stages с position, color, is_final, probability — и drag-and-drop для изменения порядка на UI (React DnD или dnd-kit).

История изменений. Кто и когда изменил статус сделки, поменял ответственного, добавил заметку. Audit log через Observer или spatie/laravel-activitylog. На UI — timeline с фильтрацией по типу активности.

Интеграция с почтой. IMAP/SMTP для подключения корпоративного ящика, автоматическая привязка входящих писем к контактам по email-адресу. Это надёжно работает только при правильной обработке bounce, spam, автоответов — нужна фильтрация.

Почему ERP — не про код, а про данные?

ERP — это когда CRM, склад, производство, бухгалтерия и HR объединены в единую систему. Полный ERP с нуля — редкая задача (обычно интегрируются с существующими системами), но модульные системы под конкретный бизнес — регулярная.

Ключевой принцип: финансовые операции должны быть неизменяемыми. Не UPDATE orders SET status = 'cancelled' — а создание новой записи order_cancellations с ссылкой на исходный заказ. Это принцип immutable ledger, который упрощает аудит и reconciliation.

Интеграция с 1С — почти всегда часть ERP-проекта. Двусторонняя синхронизация: из 1С в портал (справочники, остатки, цены) и из портала в 1С (заказы, документы). RabbitMQ как шина событий между системами надёжнее прямого HTTP-взаимодействия — в случае недоступности 1С сообщения ждут в очереди.

Как устроены LMS: платформы обучения

Learning Management System — это курсы, модули, уроки, тесты, сертификаты, прогресс пользователей.

Видео-контент — самая нагруженная часть LMS. Хранить видео на собственном сервере и отдавать через Nginx — плохая идея: дорого, медленно, нет адаптивного битрейта. Правильно: загрузка в S3/Cloudflare R2, транскодирование через AWS Elemental MediaConvert или Mux, HLS-плейлист для адаптивного стриминга через Video.js или Plyr.

Прогресс просмотра — через периодическую отправку watch_position с фронтенда (каждые 10–30 секунд), хранение в Redis с периодической синхронизацией в PostgreSQL. Не сохранять каждую секунду в БД — это убьёт производительность.

SCORM-совместимость — если нужна интеграция с корпоративными тренинговыми материалами. Отдельный модуль, есть готовые библиотеки (scorm-again).

Intranet и HR-порталы

Корпоративный интранет: новости, документы, оргструктура, HR-процессы (отпуска, заявки, KPI).

Оргструктура в базе данных — это иерархическая структура. Adjacency list (parent_id на каждой записи) прост в реализации, но медленен при рекурсивных запросах. Nested Sets или Closure Table быстрее для чтения иерархии, сложнее при изменениях. В PostgreSQL — рекурсивные CTE (WITH RECURSIVE) с adjacency list — баланс между простотой и производительностью.

Согласование документов и заявок — workflow engine. Простые линейные согласования (сотрудник → менеджер → HR → бухгалтер) можно сделать без специального движка. Нелинейные (параллельные ветки, условные переходы, делегирование) — стоит рассмотреть готовые решения: Temporal.io для workflow orchestration или собственный конечный автомат на базе state-machine паттерна.

Что входит в работу

При заказе разработки корпоративного портала вы получаете:

  • Архитектурную документацию (ER-диаграммы, схема интеграций, матрица ролей)
  • Полный код в Git-репозитории с CI/CD
  • Доступы к инфраструктуре (хостинг, базы данных, хранилища)
  • Обучение администраторов и ключевых пользователей (2–3 сессии)
  • Гарантийную поддержку на 3 месяца после запуска

Наши принципы проектирования опираются на официальную документацию Laravel по авторизации (Policies) и рекомендации по работе с очередями.

Технический стек для порталов

Слой Инструменты
Backend Laravel + PostgreSQL
Frontend React + TypeScript (Inertia.js или отдельный SPA)
Real-time Laravel Echo + Soketi / Pusher
Поиск Meilisearch (быстрый старт) или Elasticsearch (объём)
Очереди Laravel Queue + Redis
Файлы S3-compatible (MinIO self-hosted или AWS S3)
Мониторинг Sentry + Telescope (dev)

Ориентиры по срокам

Тип портала Срок
CRM (базовый) 10–16 недель
LMS (курсы + видео + тесты) 14–22 недели
HR-портал (отпуска, KPI, оргструктура) 12–20 недель
Корпоративный ERP (модульный) 24–52 недели

Стоимость рассчитывается индивидуально после детальной аналитики требований и ролевой модели. Чтобы получить предварительную оценку, напишите нам — мы проанализируем вашу задачу и предложим оптимальное решение под ключ.