Telegraft

Тип бота

Управление там, где уже идёт разговор

Telegram-бот DAO-управления ведёт предложения, считает вес голоса по снапшоту блока, собирает подписанные бюллетени и публикует результат, который любой желающий может пересчитать самостоятельно. Он переносит управление туда, где идёт обсуждение. Он не исполняет решения в сети и не создаёт кворум там, где его нет.

Боты DAO-управления: цена, сроки и ограничения

Фиксированная цена
$8,000 USD
Срок
32 календарных дня с момента старта
Подписи
Доказывают контроль над адресом, но в сети не исполняют ничего
Блок снапшота
Обязателен — балансы меняются непрерывно, без него вес бессмыслен
Привязка аккаунта
Telegram не умеет криптографически связать аккаунт с кошельком
Потолок на группу
~20 сообщений/мин в один групповой чат

As of 2025-10-01, Telegram Bot API 13.4

Какую задачу это решает

Почти у каждого DAO один и тот же разрыв. Обсуждение идёт в Telegram, где участники есть. Голосование идёт на платформе управления, где их нет. В итоге спор и решение разъезжаются: предложение долго обсуждают люди, которые потом не голосуют, а проходит оно или нет — решает явка другой, гораздо меньшей группы.

Перенести голосование туда, где идёт обсуждение, звучит очевидно, и у этого есть одно жёсткое требование: результат должен проверяться тем, кто не доверяет оператору. Голоса, посчитанные внутри бота, без возможности проверить веса и пересчитать бюллетени, — это опрос. Он может быть совершенно честным и при этом не иметь никакой силы, что и выясняется при первом же спорном результате.

Настоящим управлением это делают вес по снапшоту и подписанные бюллетени. Сила голоса считается по балансам токенов на номере блока, зафиксированном в момент открытия предложения, — значит, докупить токены, уже прочитав предложение, бессмысленно. Каждый голос подписан кошельком держателя, поэтому третья сторона может пересчитать всё заново по публичным данным. Бот при этом становится удобным интерфейсом к проверяемому процессу, а не инстанцией сам по себе, — и только такую версию стоит строить.

Как идёт разработка

  1. Предложение сначала пишут и обсуждают, и только потом по нему голосуют

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

    forum-topics
  2. Блок снапшота фиксируется в момент открытия голосования

    Вес голоса считается по балансам на этом блоке и публикуется вместе с ним. Фиксация на открытии, а не на закрытии, убирает выгоду от покупки токенов после прочтения предложения.

    webhook
  3. Участник голосует подписью своего кошелька

    Подпись над идентификатором предложения и выбранным вариантом, сделанная в том кошельке, которым участник и так пользуется. Газ не тратится, потому что в сеть ничего не отправляется, а проверить подпись может кто угодно.

    web-app-initdata
  4. Текущий счёт виден, а чей голос чей — только после закрытия

    Итоги обновляются вживую, отдельные голоса раскрываются на закрытии. Живая атрибуция превращает управление в присоединение к большинству: опоздавшие голосуют за ту сторону, что впереди.

    inline-keyboard
  5. Кворум и порог проверяются по опубликованным правилам

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

    commands
  6. Результат публикуется вместе со всем, что нужно для пересчёта

    Блок снапшота, веса, подписи и сделанные выборы. Любой может пересчитать итог по публичным данным — именно это даёт результату силу, которую сам бот дать не в состоянии.

    webhook

Что Telegram разрешает, а что нет

Подпись кошелька доказывает контроль над адресом и ничего не исполняет в сети.

Голосование проходит вне сети и без газа, а исполнение остаётся отдельным шагом того, у кого есть эти полномочия. Боту, который заявлял бы об исполнении, понадобились бы ключи, а это совсем другой и гораздо больший вопрос доверия.

Балансы токенов меняются непрерывно, поэтому без фиксированного блока вес не имеет смысла.

Блок снапшота публикуется вместе с предложением. Без него вес, посчитанный на закрытии, позволяет участнику докупить влияние, уже прочитав аргументы.

Сам Telegram не может криптографически связать аккаунт с кошельком.

Связка устанавливается подписанным челленджем и сохраняется. Любая повторная привязка требует нового челленджа, иначе непроверенная связка позволит участнику проголосовать чужим весом.

Отправитель может отредактировать своё сообщение в Telegram уже после публикации.

Текст предложения хешируется при создании, и хеш публикуется. Иначе предложение можно переформулировать после поданных голосов — управленческий аналог переноса ворот по ходу матча.

Бот отправляет порядка 20 сообщений в минуту в один групповой чат.

Подтверждения голоса уходят в личные сообщения, а не объявляются в группе: там они упёрлись бы в лимит на любом активном голосовании и в любом случае залили бы обсуждение.

Когда это не нужно строить

  • Ваше управление обязано исполняться в сети автоматически. Подпись вне сети не исполняет ничего, а бот, держащий ключи исполнения, — это принципиально другая модель доверия.
  • У вас нет проблемы с кворумом. Если явка на существующей платформе и так здоровая, перенос голосования добавит систему, не решив ничего.
  • Ваше распределение токенов сильно сконцентрировано. Удобство голосования не меняет исход, который уже определяют три кошелька, — оно лишь делает этот факт заметнее.
  • Вы не готовы публиковать полные данные бюллетеней. Без них результат — это опрос, а опрос, выданный за управление, рушится на первом же спорном голосовании.

На чём это работает

КомпонентВерсияЗачем
grammY1.45Фреймворк бота, сценарий предложений и ветки обсуждения в темах форума.
TON Connect2.xПривязка кошелька и подписи голосов вне сети.
Cloudflare WorkerscurrentСреда исполнения, расчёт снапшотов и проверка подписей.
Cloudflare D1currentПредложения, снапшоты, бюллетени и опубликованные результаты.
TypeScript5.9Строгий режим, веса голосов целыми числами, а не числами с плавающей точкой.

О чём спрашивают перед стартом

Тратится ли газ на голосование?

Нет. Голос — это подпись кошелька над идентификатором предложения и выбранным вариантом, проверяемая вне сети. В сеть ничего не отправляется, поэтому участие не стоит ничего, и это важно: платное голосование системно отсекает мелких держателей.

Как проверить итог голосования самостоятельно?

На закрытии публикуются блок снапшота, все веса, все подписи и все сделанные выборы. Третья сторона может пересчитать итог по публичным данным, не доверяя боту, — именно это и придаёт результату силу.

Почему снапшот фиксируется на открытии голосования, а не на закрытии?

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

Может ли бот исполнить принятое предложение в сети?

Нет, и не должен. Исполнение требует ключей, а бот, который их держит, — заметно больший вопрос доверия, чем бот, который считает подписи. Исполнение остаётся у того, кому эти полномочия даёт ваша модель.

Что мешает проголосовать с чужого кошелька?

Привязка требует подписанного челленджа от этого кошелька, то есть контроль надо продемонстрировать. Повторная привязка запрашивает челлендж заново, потому что непроверенная связка позволила бы одному участнику отдать чужой вес.

Видно ли отдельные голоса, пока голосование ещё идёт?

Видны итоги, а чей голос чей — только после закрытия. Живая атрибуция даёт эффект присоединения к большинству: опоздавшие идут за той стороной, что впереди. Эффект вполне реальный, и его стоит закладывать в конструкцию.