FunC-контракты для TON: разработка, аудит, деплой под ключ

Смарт-контракты на 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 уходят в никуда.

Сравнение TON и EVM для задач разработки

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

Таблица показывает, что TON не «лучше» или «хуже» — он другой. Для задач с высоким TPS и дешёвыми транзакциями (payments, gamefi, miniapps в Telegram) — архитектура TON оптимальна. TON в 10 раз быстрее Ethereum по пропускной способности.

Как мы пишем контракты на 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 дней Стандартный контракт с минимальной логикой
NFT-коллекция с кастомной логикой 1-2 недели TEP-62, метаданные, роялти
DeFi-протокол с несколькими контрактами от 4 недель Стейт-машина, интеграция, аудит
Интеграция с Telegram Mini App +3-7 дней Через tonconnect

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

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

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