Розробка дашборда токенсейлу: архітектура, real-time дані, UX

Під час пікового навантаження вітрина продажів токена перестає відповідати, і замовник втрачає довіру покупців. Ми розробляємо дашборд токенсейлу під ключ: проєктуємо архітектуру, потокові дані та зрозумілі екрани для команди й інвесторів. Рішення витримує піки продажів і знімає ручні вивантаження з аналітиків.
Часті запитання

Чому дашборд токенсейлу падає на піковому навантаженні

Дашборд токенсейлу падає не тому, що «мало серверів», а тому що перші хвилини старту продажів — це ступінчасте зростання навантаження в десятки разів. Тисячі гаманців одночасно надсилають транзакції, і вітрина намагається показати по кожній актуальний стан.

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

Другий клас відмов тихіший: розходження балансів. Вітрина збирає числа з кількох джерел — агрегатів за подіями контракту та прямих читань стану мережі Ethereum — а між ними завжди є лаг.

Якщо агрегат рахується за «сирими» подіями без звірки з фінальним станом, сума проданого та залишок у пулі розходяться. Помічає це зазвичай не інженер, а покупець — і довіра до цифр втрачається разом із ним.

Затримка даних про продажі — те саме вузьке місце з іншого боку. Коли події обробляються по одній, а зрізи перераховуються на кожен запит, вітрина відстає від мережі на десятки секунд: графік показує минулу картину, а в чаті вже запитують про «завислі» цифри.

Усі три сценарії — про архітектуру: де рахується агрегат, що кешується, чим підтверджується фінальність. Розбираємо, як це закривається, щоб пікове навантаження на вітрину було розрахунковим режимом, а не аварією.

Що дає керований дашборд токенсейлу: вимірюваний ефект

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

Швидкість оновлення даних. Події контракту читає індексатор, нормалізує в таблицю продажів і віддає в інтерфейс потоком, а не запитом за розкладом.

Затримка до екрана тримається в межах секунд: лічильник зібраних коштів, кількість учасників і розподіл за етапами змінюються без перезавантаження сторінки. Курс токена підтягуємо із зовнішнього джерела (Chainlink), щоб вітрина та розрахунки спиралися на один показник.

Ручна звірка продажів. Коли адреса покупця, сума, статус підтвердження та етап надходять з одного канонічного джерела, суцільна ручна звірка продажів іде з щоденної рутини.

Залишаються винятки — завислі транзакції, повернення, дублікати; зазвичай це одиниці випадків за етап замість перерахунку всіх рядків.

Контроль етапів продажу токена. Раунди, стелі, ціни та часові вікна описані конфігурацією, з якої будуються і вітрина, і правила нарахування.

Правка одного параметра синхронно змінює лічильники виконання, тексти та повідомлення — контроль етапів перестає залежати від ручної правки екранів.

Стійкість до піків. На відкритті вікна навантаження зростає кратно. Кеш гарячих агрегатів, обмеження частоти звернень і перехід на опитування замість потоку при перевантаженні зберігають працездатність: сторінка відповідає повільніше, але не віддає помилку. Клас відмов «дашборд недоступний у момент старту» знімається архітектурою, а не чергуванням.

Способи подачі даних: потік, опитування, пакетне вивантаження

Токенсейл живе хвилинами: поки триває раунд, екран показує лічильник проданих токенів, суму збору та стрічку покупок.

Питання не в тому, який спосіб передачі даних «сучасніший», а в тому, яку затримку побачить покупець і що станеться з дашбордом на піку першої хвилини, коли до сторінки підключилися всі одразу.

Нижче — три режими подачі на екран та їхні реальні обмеження. На практиці вони комбінуються: вітрина оновлюється за подією для живих лічильників і за розкладом для зведень.

Режим подачі Коли підходить Що тягне за собою
Потік подій Активна фаза раунду: лічильник проданих токенів, сума збору, стрічка покупок, прогрес до мети Тримає окреме з'єднання на кожного глядача — пік навантаження збігається з піком інтересу; при обриві потрібен догін за журналом подій, інакше числа на екрані «замерзають»
Періодичне опитування Резервний канал і нестабільні мережі; зведені метрики, яким не потрібна секундна точність Затримка дорівнює інтервалу опитування; часті запити навантажують вузол читання, рідкі дають застарілі числа та розходження між блоками
Пакетне вивантаження Завершені раунди, історія покупок, аналітика за днями, звіти для інвесторів Дані відстають на крок вивантаження і не годяться для лічильника в реальному часі

Робоча схема — гібрид: потік на ключові лічильники, періодичне опитування як дублюючий канал і пакетне вивантаження для історії та звітів.

Вітрина при цьому віддає узгоджений знімок — прогрес-бар, сума та кількість учасників оновлюються разом, а не незалежно, інакше екран починає суперечити сам собі.

Режими оновлення вітрини ми фіксуємо на етапі проєктування: від них залежить і затримка на екрані, і те, як дашборд поведеться при відмові одного з каналів.

Етапи розробки: від аудиту потоків до передачі команді

Проєкт збираємо послідовно: поки не зведені джерела, будь-яка візуалізація бреше красиво. Порядок етапів не випадковий — кожен наступний спирається на підтверджений попередній, а не на припущення про те, як рахуються дані.

  1. Аудит джерел даних. Розбираємо, звідки надходять цифри: події смарт-контракту, баланси адрес, платіжний шлюз, ручні коригування команди. Для кожного джерела фіксуємо затримку оновлення, повноту та поведінку при збої.

  2. Схема даних вітрини. Домовляємося про гранулярність: рядок — це транзакція, адреса або інтервал часу. Від неї залежать ключі, довідники та те, які агрегати рахуються на льоту, а які перераховуються вночі.

  3. Складання та наповнення. Налаштовуємо потік подій, буфер на випадок піків і повторний перерахунок при перебудові ланцюжка. Окремо перевіряємо, що метрика не «стрибає» і не дублює операції.

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

  5. Промисловий контур. Ролі та права доступу, журнал дій, резервні копії вітрини та оповіщення про пропущені блоки. Дашборд повинні бачити тільки ті, кому він потрібен.

  6. Передача проєкту. Віддаємо опис схеми, регламент перерахунку та інструкції з додавання нових метрик, навчаємо команду і залишаємося на зв'язку в період запуску.

Підсумок — дашборд, який можна розвивати своїми силами, не переписуючи з нуля.

Поставка: схеми даних, конфігурації та регламенти оновлення

Після запуску в команди замовника залишається не лише працюючий дашборд, а й комплект документів, за якими його можна розвивати своїми силами або передати іншому підряднику — без розбору коду та відновлення логіки по пам'яті.

Кожен артефакт закриває свій шар системи: від полів на екрані до реакції на збій джерела. Нижче — склад поставки.

  • Опис полів і метрик. Для кожного показника — джерело, формула, одиниця виміру та частота перерахунку. Суперечка «в інтерфейсі одна цифра, у звіті інша» закривається за документом, а не за кодом.
  • Схема інтеграцій. Які потоки сходяться в дашборді — мережа, біржові котирування, внутрішній облік, — у якому вигляді надходять і що показується користувачеві при зникненні даних.
  • Політика доступу до даних. Ролі та їхні права: хто бачить агрегати, хто може вивантажувати сирі дані, як фіксуються дії. Публічна вітрина та внутрішня аналітика не змішуються.
  • Регламент оновлення. Розклад перерахунку, поведінка при застарілих значеннях, перемикання на резервне джерело, поріг, після якого черговий отримує повідомлення.
  • Налаштування середовищ. Параметри складання, змінні, залежності та порядок розгортання — щоб стенд піднімався з нуля без усних пояснень.
  • Контрольні сценарії. Набір перевірок: як переконатися, що після правки розрахунку цифри на екрані збігаються з еталоном. Проганяється при кожному випуску.

Кейс: пік продажів перестав ронити вітрину даних

Дашборд токенсейлу — вітрина, за якою команда приймає рішення в моменті, і на піку продажів вона лягала першою.

Коли відкривалися всі канали, екран віддавав відповідь десятками секунд або взагалі повертав помилку, аналітики отримували неповні вивантаження, а підтримка тонула в питаннях «чому цифри не сходяться». Продажі йшли, а темп і середній чек ніхто не бачив.

Що перебудували

Ми розвели контури читання та запису: події з мережі складаються в чергу, а вітрина збирається матеріалізованими представленнями із заздалегідь порахованими агрегатами за раундами, гаманцями та транзакціями.

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

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

Що стало

  • час відгуку головного екрана на піку — з 12–14 с до 1,5 с;
  • частка розходжень вітрини з даними мережі — з 3% до 0,1%;
  • звернення в підтримку «цифри не сходяться» — у шість разів менше;
  • вивантаження звітності — 100% без пропусків, включно з піковими днями.

Шар візуалізації на Grafana зібраний із шаблонів, тому нова метрика додається правкою конфігурації, без переписування дашборду. Звітність перестала залежати від того, чи витримає навантаження один запит.

Чим власна вітрина відрізняється від готового аналітичного сервісу?

Готовий аналітичний сервіс відповідає лише на ті питання, які заклав у свою модель його власник. Набір метрик там фіксований, глибина історії обмежена тарифом, а до сирих подій токенсейлу ви не дістанетеся — на виході агрегати в чужому інтерфейсі.

Знадобиться рахувати унікальних учасників не за гаманцем, а за платіжною адресою — доведеться чекати, поки це додадуть у чужий продукт, або рахувати вручну.

Своя вітрина будується навколо ваших даних: індексатор розбирає події контракту, складає їх у вашу базу та тримає стан продажів актуальним у реальному часі.

Логіку метрики ви змінюєте самі — воронку за джерелами входу, розподіл внесків за розміром, частку повернень і скасованих транзакцій рахуєте так, як потрібно бізнесу, а не так, як вирішив постачальник сервісу. Із цього ж шару збирається публічна частина вітрини та внутрішня звітність.

Володіння даними закриває і питання залежності: історія накопичена у вашій схемі, її можна перерахувати заново, звірити з вивантаженням з мережі та віддати в будь-який звітний контур.

У готового сервісу зміна формату або закриття продукту означає, що архів і налаштовані звіти залишаються в нього, а не у вас.

Переносність напрацювань — окрема цінність. Індексатор, моделі агрегації та інтерфейс вітрини перевикористовуються для наступного раунду, сусіднього продукту або внутрішньої аналітики: змінюється конфігурація джерел, а не вся система.

Тому вітрину і має сенс проєктувати як шар поверх даних, а не як набір разових звітів під поточний токенсейл.

Часті технічні сумніви перед стартом робіт

Дашборд токенсейлу — надбудова над даними мережі, біржі та внутрішньої бази, тому відповіді нижче визначають архітектуру, а не оформлення. Розбираємо п'ять сумнівів, які найчастіше знімаємо до старту робіт.

Чи витримає дашборд пік у перші хвилини продажу?

Профіль навантаження рахуємо заздалегідь: одночасні сесії, частота оновлення, обсяг перераховуваних зведень. Важкі агрегати збираються у фоні та віддаються з кешу — на кожен запит інтерфейс у мережу не ходить.

Що робити із затримкою джерела даних?

У кожного джерела своя затримка: мережа підтверджує операцію пізніше, ніж біржа оновлює стакан. Показуємо час останнього оновлення за кожним блоком, а при обриві тримаємо останній підтверджений стан замість нулів.

Чи складно вбудувати дашборд в особистий кабінет?

Віддаємо його окремим модулем зі своїм API та токеном доступу — поточну авторизацію переписувати не потрібно. Стилі, навігація та ролі залишаються вашими.

Чому цифри не сходяться з даними біржі?

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

Що з підтримкою після передачі проєкту?

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

Що надіслати, щоб отримати оцінку та план робіт

Щоб оцінка проєкту спиралася на факти, а план робіт — на реальний обсяг, нам потрібні вхідні дані за чотирма шарами: контракти, потік даних, інтерфейс і навантаження.

Нижче — що надіслати; частина пунктів уточнюється під час обговорення задачі, але чим більше закрито заздалегідь, тим менше припущень в оцінці.

  • Токеноміка та етапи сейлу: раунди, ліміти на учасника, правила вестінгу та розподілу.
  • Адреси контрактів і схеми подій, за якими рахуються покупки, повернення та виплати.
  • Перелік метрик і розрізів: проданий обсяг, кількість учасників, динаміка за раундами, гаманці-лідери.
  • Джерела даних: своя нода або зовнішній провайдер, індексатор, котирувальні та біржові інтерфейси.
  • Макети або референси екранів; якщо їх немає — структуру дашборду узгодимо на етапі проєктування.
  • Ролі та доступи: що бачить публічна частина, а які показники та вивантаження — тільки внутрішня команда.
  • Очікуване навантаження: скільки спостерігачів одночасно на піку і як часто повинні оновлюватися цифри.

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

Напрямки блокчейн-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141