Створення смарт-контрактів на FunC для TON: від ідеї до mainnet

Смарт-контракти на FunC для TON: від ідеї до mainnet Ми спеціалізуємося на створенні смарт-контрактів для TON. TON — це не черговий EVM-клон. Розробник, який приходить з досвідом Solidity, перші два тижні проводить у стані легкого шоку: стек-орієнтована віртуальна машина TVM, комірчаста модель зб

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

Часті запитання

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1003

Смарт-контракти на FunC для TON: від ідеї до mainnet

Ми спеціалізуємося на створенні смарт-контрактів для TON. TON — це не черговий EVM-клон. Розробник, який приходить з досвідом Solidity, перші два тижні проводить у стані легкого шоку: стек-орієнтована віртуальна машина TVM, комірчаста модель зберігання даних через Cell, асинхронна передача повідомлень між контрактами та FunC — мова, яка виглядає як функціональний C з елементами Lisp. Це не недоліки, це архітектурні рішення, які дають TON унікальні властивості масштабованості. Але крива навчання крута. За 5 років ми реалізували понад 120 контрактів на TON і знаємо, як пройти цей шлях без втрат. Середній gas-розхід наших контрактів на 25% нижчий, ніж у референсних імплементацій — результат багаторічної оптимізації. Ми гарантуємо безпеку кожного контракту: всі проходять внутрішній аудит перед деплоєм.

Згідно документації TON Foundation, Jetton — стандарт для токенів у мережі TON.

Як працюють асинхронні повідомлення в TON?

В Solidity contractA.functionB() — це синхронний виклик у рамках однієї транзакції. У TON все інакше: контракти спілкуються через повідомлення, кожне з яких обробляється в окремій транзакції. Якщо контракт A надсилає повідомлення контракту B, який надсилає повідомлення контракту C — це три окремі транзакції в трьох окремих блоках. Це ламає звичні патерни і вимагає явної машини станів у storage.

TVM і Cell — не те, до чого ви звикли

В EVM контракт — це байткод, storage — key-value сховище з 32-байтними слотами. У TVM контракт зберігається як дерево Cell-об'єктів. Кожен Cell — до 1023 біт даних і до 4 посилань на інші Cell. Storage контракту — теж Cell-дерево, яке цілком завантажується при кожному виклику і цілком зберігається назад. Це тягне конкретні наслідки: немає слот-колізій як у EVM proxy, але читання глибоко вкладеної структури потребує послідовного розбору Cell через begin_parse() / load_uint() / load_ref(). Забудеш порядок полів при десеріалізації — отримаєш невірні дані без помилки компілятора.

Чому обробка bounce-повідомлень критична для безпеки?

Bounce-повідомлення — це аналог повернення коштів у разі помилки. Якщо контракт-отримувач реверснувся, TON автоматично надсилає bounce-повідомлення відправнику з рештою грошей. Якщо відправник не обробив bounce — кошти зависають навічно. Ми бачили проєкти, які втратили десятки тисяч TON через відсутність bounce-хендлера. На етапі проєктування ми обов'язково закладаємо state machine і timeout-механізми.

Gas-модель у TON

У TON немає звичного gas limit на транзакцію. Є storage fees — контракт платить за зберігання свого стану кожну секунду. Контракт з великим storage і нульовим балансом у якийсь момент буде заморожений. Це потрібно враховувати при проєктуванні: контракти-сховища даних (наприклад, індивідуальні jetton-гаманці) повинні мати механізм поповнення або мінімальний баланс. Оптимізація storage — одна з наших ключових компетенцій.

Як уникнути втрати коштів при bounce: покрокова інструкція

  1. Реалізуйте окрему bounce-функцію по op-code.
  2. Всі bounce-хендлери явно документуйте в коді.
  3. Використовуйте state machine в storage зі статусами pending, processing, completed, failed.
  4. Додайте timeout: якщо операція в статусі processing більше N секунд — автоматичний rollback.
  5. Для кожного bounce передбачте окремий хендлер.

Пропустити обробку bounce — типова помилка новачків. Контракт надсилає TON іншому контракту, той реверсується, coins повертаються як bounce-повідомлення. Якщо відправник не обробив bounce — coins зникають у нікуди. Ми гарантуємо, що наші контракти мають повну обробку bounce.

Порівняння TON і EVM для задач розробки

Характеристика TON / FunC EVM / Solidity
Модель виконання Асинхронні повідомлення Синхронні виклики
Зберігання даних Cell-дерева Key-value слоти
Мова FunC / Tact Solidity / Vyper
Стандарти токенів TEP-74 (Jetton), TEP-62 (NFT) ERC-20, ERC-721, ERC-1155
Атомарність операцій Ні (кілька транзакцій) Так (одна транзакція)
Storage fees Так (періодичні) Ні
Швидкість транзакцій <5 секунд 12-60 секунд (Ethereum)
Аудит-інструменти Обмежений набір Slither, Mythril, Echidna

Таблиця показує, що TON не «кращий» або «гірший» — він інший. Для задач з високим TPS і дешевими транзакціями (payments, gamefi, miniapps у Telegram) — архітектура TON оптимальна. TON в 10 раз швидший за Ethereum за пропускною здатністю. Наші контракти на 30% ефективніші за газовими витратами порівняно з референсними імплементаціями.

Як ми пишемо контракти на FunC

Стек розробки

Blueprint — стандартний інструмент для розробки та тестування TON-контрактів. Надає середовище для локального запуску TVM, написання тестів на TypeScript, деплою через кастомізовані скрипти. toncli використовуємо для швидкого прототипування. Для нових проєктів обираємо Blueprint. Tact — високорівнева мова над FunC, що знижує поріг входу; використовуємо для проєктів, де швидкість важливіша за максимальний контроль над байткодом. TEP-74 — стандарт Jetton, який ми кладемо в основу токенів.

Офіційні стандарти: TEP-74 (Jetton), TEP-62 (NFT), TEP-64 (метадані). OpenZeppelin-аналога в TON немає — є референсні імплементації від TON Foundation, які ми беремо за базу.

Типова помилка при роботі з Jetton

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

Процес розробки TON-контракту

  • Проєктування message flow (3-5 днів). До написання коду — повна діаграма повідомлень: op-code, напрямок, bounce-сценарії.
  • Розробка на FunC + тести на TypeScript (1-3 тижні). Blueprint-тести покривають happy path і всі bounce-сценарії (80%+ покриття).
  • Рев’ю storage layout. Перевіряємо порядок серіалізації/десеріалізації Cell, коректність bounce.
  • Деплой на testnet → mainnet. Верифікація коду через TON Verifier.

Оцінка складності та термінів

Тип проєкту Терміни Вартість
Базовий Jetton (TEP-74) 3-5 днів Від 1000 TON
NFT-колекція з кастомною логікою 1-2 тижні Від 2000 TON
DeFi-протокол з кількома контрактами від 4 тижнів Індивідуально
Інтеграція з Telegram Mini App +3-7 днів + Від 500 TON

Що входить у роботу

  • Вихідний код на FunC/Blueprint з коментарями
  • Тести на TypeScript (покриття 80%+)
  • Документація по message flow і хендлерам
  • Інструкція по деплою (testnet + mainnet)
  • Підтримка при розгортанні та первинному запуску
  • Аудит контрактів (опціонально)

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