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

В мобильном DAO голоса теряются, когда делегирование требует десятков ручных действий и не учитывает цепочки. Мы разрабатываем модуль делегирования голосов под ключ: от логики учёта до интерфейса. Заказчик получает прозрачный механизм, который сокращает время на голосование и снимает нагрузку с команды.

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

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

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

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

Почему делегирование голосов ломается в мобильном DAO

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

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

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

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

Разбираем, как это закрывается: идемпотентные операции, явные состояния ожидания вместо оптимистичного обновления интерфейса и пересборка снимка голосов из подтверждённых событий, а не из локальных догадок.

Что даёт корректная реализация делегирования

Корректная реализация делегирования голосов упирается в три вещи: как приложение считает вес голоса на момент снимка блокчейна, как оно показывает пользователю, на кого и на какой срок он передаёт право голоса, и как отменяет делегирование без потери уже учтённых голосов. Если хотя бы один слой реализован «на глазок», пользователь видит одно, сеть учитывает другое — и первым это замечает не разработчик, а поддержка.

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

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

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

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

Способы учёта голосов: сравнение подходов

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

Вариант учёта Когда подходит Ограничения
Прямое делегирование по адресу Небольшое сообщество, голосующая база стабильна, важна простота При росте числа делегатов дорожает пересчёт весов; ручное переназначение при смене кошелька
Делегирование по кампаниям Голосования идут волнами, у каждого — свой состав участников Нужна отдельная логика снапшотов на каждую кампанию; сложнее аудит истории
Суб-делегирование (цепочки) Крупные структуры с представителями и подпредставителями Риск зацикливания цепочек; нужен контроль глубины и защита от петель
Гибрид: прямое + пул Часть голосов держат сами, часть отдают в общий пул Двойной учёт при неаккуратном снапшоте; прозрачность требует отдельного экрана

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

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

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

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

Как мы внедряем модуль делегирования голосов

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

Дальше выстраиваем схему делегирования: кто может быть делегатом, на какой срок, можно ли отозвать право досрочно и что происходит при повторном делегировании. Отдельно прорабатываем сценарии, когда делегат теряет доступ или сам отказывается от голосов — такие случаи чаще всего ломают голосование в реальных сообществах.

  1. Аудит текущего приложения — разбираем учётные записи, хранение ключей, подключённые сети и контракты, фиксируем ограничения.
  2. Проектирование схемы делегирования — определяем роли, сроки, правила отзыва и повторной передачи голосов.
  3. Настройка модуля — подключаем логику к кошельку и контрактам, настраиваем подпись операций делегирования.
  4. Проверка сценариев — прогоняем передачу, отзыв, повторное делегирование и голосование от имени делегата.
  5. Тестирование на тестовой сети — проверяем поведение модуля без риска для реальных голосов и активов.
  6. Передача и документация — описываем схему, правила и порядок действий для команды поддержки.

Каждый этап заканчивается проверкой: если сценарий отзыва или повторного делегирования отрабатывает неверно, возвращаемся к схеме, а не латаем поведение на уровне интерфейса. Так модуль остаётся предсказуемым и при росте числа участников, и при смене делегатов.

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

Что заказчик получает на руки

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

  • Конфигурации модуля делегирования — параметры сети, адреса контрактов, пороги веса голоса и правила пересчёта при смене делегата. Вынесены в отдельные файлы окружений, чтобы переключение между тестовым и рабочим контуром не требовало правок кода.
  • Схемы потоков голосов — как голос идёт от владельца к делегату, где фиксируется снапшот, в какой момент вес перестаёт учитываться при отзыве. Схема снимает половину вопросов на созвонах с юристами и аудиторами.
  • Политики доступа и ролей — кто из администраторов может менять параметры делегирования, кто только читает, как выдаются и отзываются права. С матрицей ролей и журналом действий.
  • Документация по интеграции — описание методов, форматов запросов и ответов, кодов ошибок. Достаточно, чтобы сторонняя команда подключила модуль, не читая исходники.
  • Регламенты эксплуатации — что делать при расхождении веса голоса, как откатить неудачное изменение параметров, куда смотреть в первую очередь. С чек-листом для дежурного.
  • Набор проверок — тесты на сценарии делегирования и отзыва, включая граничные: делегат ушёл, вес изменился между голосованиями, двойное делегирование.
  • Запись передачи — разбор архитектурных решений и открытых вопросов, чтобы контекст не остался только в переписке.

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

Кейс: ускорение делегирования в мобильном кошельке

Клиент — команда мобильного DAO-кошелька на NEAR — пришёл с жалобой: делегирование голосов работало, но пользователи доходили до него редко. Операция занимала 6 экранов и 4 подтверждения, среднее время прохождения — 3 минуты 40 секунд, а доля брошенных на середине попыток держалась на 38%. Поддержка получала по 40-60 обращений в неделю, и почти все — «не понимаю, кому делегирую» и «голос ушёл не туда».

Что изменили

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

Отдельно закрыли класс ошибок, который давал больше всего шума: несовпадение выбранного делегата и фактически подписанной транзакции. Теперь параметры делегирования собираются в одном месте и проверяются перед подписью, а не по пути через несколько экранов.

Что стало

Среднее время операции упало до 50 секунд, доля брошенных попыток — до 9%. Обращения в поддержку по делегированию сократились в четыре раза, а повторные делегирования (смена делегата) выросли втрое — люди начали пользоваться функцией, а не пробовать её один раз. Нагрузка на сеть при этом не выросла: число транзакций на пользователя осталось прежним, изменилось только то, сколько из них доходят до подписи.

Чем отличается прямое делегирование от цепочки?

Прямое делегирование — это одна связь: держатель токенов назначает делегата, и вес его голоса целиком уходит этому адресу. Цепочка возникает, когда делегат сам кому-то делегирует свой совокупный вес, и голос продолжает движение дальше по графу. Разница не косметическая: она определяет, как приложение считает итоговый вес на момент голосования и что происходит при отзыве.

При прямом варианте учёт голосов тривиален — вес голосующего равен сумме делегированных ему токенов плюс собственный баланс. Пересчёт локальный, состояние сходится за один проход, а отзыв делегирования мгновенно возвращает вес владельцу. Цепочка требует обхода графа до конечных адресов: нужно найти всех, кто фактически голосует, и просуммировать вес по путям. Здесь появляются два инженерных риска — зацикливание (A делегирует B, B делегирует A) и «зависший» вес, когда промежуточный узел отозвал делегирование уже после начала голосования.

На практике это влияет на три вещи. Первая — момент фиксации веса: снимок состояния до старта голосования исключает манипуляции с перекладыванием голосов по цепочке. Вторая — лимит глубины: ограничение в 3-5 переходов защищает от бесконечного обхода и делает расчёт предсказуемым. Третья — обработка циклов: узел, попавший в кольцо, исключается из подсчёта, иначе транзакция голосования не завершится.

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

Частые технические сомнения

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

Как защищены ключи и подписи при делегировании?

Приватный ключ не покидает защищённый контур устройства: подпись формируется в аппаратном хранилище (Secure Enclave / Keystore), приложение получает только результат. Делегат задаётся по адресу, лимиты по весу и сроку прописываются в самом вызове контракта — даже при компрометации сессии злоумышленник не выведет больше, чем разрешено. Дополнительно логируем каждое действие и шлём пуш при смене делегата.

Совместимо ли с уже развёрнутыми контрактами и кошельками?

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

Что происходит при откате транзакции?

В блокчейне откат — это не «отмена», а новая транзакция с обратным действием. Мы проектируем делегирование идемпотентным: повторный вызов с теми же параметрами не дублирует вес, а отзыв возвращает голоса владельцу. Если транзакция не прошла по газу или реверту — состояние не меняется, приложение показывает понятную причину и предлагает повторить.

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

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

Обсудим вашу задачу по делегированию голосов

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

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

  • Текущая модель делегирования: прямая передача голоса, цепочки делегатов или гибрид с частичным весом.
  • Сеть и стандарт: где живёт учёт голосов, как приложение читает состояние и подтверждает транзакции.
  • Кошелёк и подписи: какие способы подключения поддерживаются, нужна ли поддержка аппаратных кошельков.
  • Сценарии отзыва и перераспределения: как голос возвращается делегату и что видит пользователь в этот момент.
  • Офлайн-поведение: что показываем при потере связи и как синхронизируем состояние при возврате.
  • Существующий код: есть ли прототип или приложение, которое нужно доработать, а не писать с нуля.
  • Ограничения по срокам и платформам: iOS, Android или обе, нужна ли синхронность релизов.

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

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

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

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714