Смарт-контракты на 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: пошаговая инструкция
- Реализуйте отдельную bounce-функцию по op-code.
- Все bounce-хендлеры явно документируйте в коде.
- Используйте state machine в storage с статусами pending, processing, completed, failed.
- Добавьте timeout: если операция в статусе processing более N секунд — автоматический rollback.
- Для каждого 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)
- Поддержка при развёртывании и первичном запуске
- Аудит контрактов (опционально)
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по архитектуре вашего контракта бесплатно. Закажите разработку сегодня — мы подготовим предложение под вашу архитектуру.







