Справочник ключевых терминов курса System Design для TON-разработчика.
Дисциплина проектирования распределённых систем на базе блокчейна с учётом специфических ограничений: детерминированное исполнение, неизменяемость данных, экономические стимулы и ограниченные вычислительные ресурсы. В отличие от классического System Design, здесь каждое решение имеет прямые экономические последствия в виде комиссий.
// Классический подход: масштабируем сервер вертикально
// Блокчейн SD: масштабируем через шардинг контрактов
// Вместо одного контракта-монолита:
contract MonolithDEX { /* всё в одном */ }
// Проектируем систему контрактов:
contract Router { /* маршрутизация */ }
contract Pool { /* один пул ликвидности */ }
contract LPWallet { /* кошелёк LP-токенов */ }Применение теоремы CAP к архитектуре TON. TON выбирает Availability и Partition tolerance за счёт eventual consistency между шардами. Это означает, что межшардовые сообщения обрабатываются асинхронно, и контракт не может мгновенно получить актуальное состояние из другого шарда.
// TON выбирает: AP (доступность + устойчивость к разделению)
// Следствие: eventual consistency между шардами
// Нельзя:
let balance = otherContract.getBalance(); // синхронный вызов
// Нужно проектировать асинхронно:
send(SendParameters{
to: otherContract,
body: RequestBalance{}.toCell()
});
// Ответ придёт отдельным сообщениемМетод систематической оценки архитектурных решений через выявление конкурирующих требований. В контексте TON ключевые оси компромиссов: газ vs UX, децентрализация vs производительность, гибкость vs безопасность. Каждое проектное решение оценивается по влиянию на стоимость, скорость и надёжность.
// Компромисс: хранение on-chain vs off-chain
// On-chain: дорого, но верифицируемо
contract OnChainNFT {
metadata: map<Int, Cell>; // ~0.01 TON за ячейку в год
}
// Off-chain: дёшево, но требует доверия к серверу
contract OffChainNFT {
contentUrl: String; // только ссылка on-chain
}Повторяемые архитектурные решения для типовых задач в TON System Design. Включают паттерны декомпозиции контрактов (Router-Pool, Master-Child), паттерны обмена сообщениями (Request-Response, Notification), паттерны масштабирования (Sharded Collection, Factory). Отличаются от классических GoF-паттернов адаптацией к асинхронной actor-модели.
// Паттерн Master-Child (Factory)
// Master создаёт дочерние контракты с предсказуемыми адресами
contract JettonMaster {
fun mint(to: Address, amount: Int) {
let init = initOf JettonWallet(myAddress(), to);
send(SendParameters{
to: contractAddress(init),
value: ton("0.05"),
body: InternalTransfer{amount}.toCell(),
code: init.code,
data: init.data
});
}
}Структурированный подход к проектированию систем на TON, состоящий из этапов: сбор требований, выбор архитектуры контрактов, проектирование потоков сообщений, анализ газовых затрат, оценка безопасности и планирование развёртывания. Фреймворк обеспечивает повторяемость процесса и снижает вероятность пропуска критических аспектов.
// Этапы фреймворка для проектирования DEX:
// 1. Требования: swap, add/remove liquidity, fees
// 2. Архитектура: Router → Pool → LP Wallet
// 3. Потоки: пользователь → Router → Pool → Wallet
// 4. Газ: оценка цепочки из 3-5 сообщений
// 5. Безопасность: проверка bounce, replay, overflow
// 6. Деплой: порядок развёртывания контрактовАрхитектурный подход TON, разделяющий сеть на слои с различными зонами ответственности: masterchain (координация и консенсус), workchains (исполнение контрактов), shardchains (параллельная обработка подмножеств аккаунтов). При проектировании системы необходимо учитывать стоимость и задержки межслойного взаимодействия.
// Влияние многослойности на проектирование:
// Слой 1: Masterchain — конфигурация, валидаторы
// → Не деплоить пользовательские контракты
// Слой 2: Basechain (workchain 0) — смарт-контракты
// → Основная среда для DeFi, NFT, токенов
// Слой 3: Shardchains — автоматическое разделение
// → Проектировать контракты sharding-friendlyПроектное решение TON, при котором каждый аккаунт рассматривается как отдельный шард. С точки зрения System Design это означает, что контракты должны быть самодостаточными: не полагаться на синхронный доступ к данным других контрактов и минимизировать межшардовые зависимости. Это фундаментально отличает проектирование в TON от Ethereum.
// Ethereum: контракты в одном шарде читают друг друга
uint price = oracle.getPrice(); // синхронно
// TON: каждый контракт — свой шард
// Нельзя синхронно прочитать состояние другого контракта
// Решение: асинхронный запрос-ответ
send(RequestPrice{pair: "TON/USD"}.toCell());
// Обработка в receive(PriceResponse)Архитектурный паттерн, при котором masterchain обеспечивает глобальную согласованность распределённой системы TON. Masterchain хранит хеши блоков всех шардчейнов, что позволяет верифицировать состояние любого шарда. При проектировании критически важных систем это гарантирует финальность транзакций после включения в masterchain блок.
// Финальность транзакции:
// 1. Транзакция попадает в блок шардчейна (~2-5 сек)
// 2. Хеш шардчейн-блока включается в masterchain
// 3. После этого транзакция финальна
// Для проектирования: ожидание финальности
// составляет ~6 секунд (1-2 masterchain-блока)
// Учитывать в UX платёжных системМетод анализа архитектурных решений TON через сравнение с Ethereum и Solana. Ключевые различия: синхронная vs асинхронная модель исполнения, единое vs шардированное состояние, EVM vs TVM. Позволяет переносить проверенные паттерны из других экосистем с адаптацией к особенностям TON.
// Сравнение подходов к DEX:
// Ethereum (синхронная модель):
// Uniswap: Router вызывает Pool.swap() синхронно
// Всё в одной транзакции, атомарно
// TON (асинхронная модель):
// DeDust: Router отправляет сообщение Pool
// Pool обрабатывает и отправляет результат
// Цепочка из 3-5 асинхронных сообщенийТипичные ошибки проектирования в TON: монолитный контракт с множеством ответственностей, предположение о синхронности исполнения, игнорирование bounce-механизма, хранение больших объёмов данных в одном контракте. Распознавание антипаттернов позволяет избежать дорогостоящих переделок.
// Антипаттерн: God Contract
contract BadDEX {
pools: map<Address, PoolData>;
balances: map<Address, Int>;
orders: map<Int, Order>;
// Всё в одном контракте → не масштабируется
}
// Правильно: декомпозиция
contract Router { /* маршрутизация */ }
contract Pool { /* один пул */ }
contract Vault { /* хранение средств */ }Модель вычислений, в которой каждый контракт TON является независимым актором с собственным состоянием, обрабатывающим сообщения последовательно. С точки зрения System Design это означает отсутствие shared state между контрактами и необходимость проектирования всех взаимодействий как обмена асинхронными сообщениями.
// Каждый контракт — актор
// Принципы:
// 1. Своё изолированное состояние
// 2. Обрабатывает сообщения по одному
// 3. Может отправлять сообщения другим акторам
// 4. Может создавать новых акторов (deploy)
contract WalletActor {
balance: Int = 0;
receive(msg: Deposit) {
self.balance += msg.amount;
// Отправка сообщения другому актору
send(Notification{amount: msg.amount}.toCell());
}
}Методика проектирования последовательностей асинхронных сообщений между контрактами TON. Включает определение цепочек сообщений для бизнес-операций, обработку ветвлений при ошибках, расчёт газовых бюджетов для всей цепочки и обеспечение идемпотентности обработки.
// Поток swap в DEX (5 сообщений):
//
// User → Router: запрос swap
// Router → Pool: transfer_notification
// Pool → JettonWallet: transfer (выход)
// JettonWallet → User: transfer_notification
// JettonWallet → Pool: excesses (сдача газа)
//
// Gas budget: 0.3 TON (0.06 на каждое сообщение)Набор проектных решений для обработки отклонённых сообщений в TON. Bounce-сообщение возвращается отправителю, когда получатель не может обработать запрос (недостаточно газа, ошибка в коде, контракт не развёрнут). Стратегии включают: откат состояния, повторную отправку, эскалацию ошибки и graceful degradation.
// Стратегия: откат при bounce
contract SafeTransfer {
pendingAmount: Int = 0;
// Отправка с сохранением pending
fun transfer(to: Address, amount: Int) {
self.pendingAmount = amount;
self.balance -= amount;
send(SendParameters{to, value: amount, bounce: true});
}
// Откат при bounce
bounced(msg: Slice) {
self.balance += self.pendingAmount;
self.pendingAmount = 0;
}
}Паттерн проектирования контрактов TON как конечных автоматов с явными состояниями и переходами. Каждое сообщение может инициировать переход между состояниями. Паттерн обеспечивает предсказуемость поведения, упрощает аудит безопасности и позволяет обрабатывать сложные многошаговые процессы (escrow, аукционы, голосования).
// Escrow как конечный автомат
contract Escrow {
state: Int = 0; // 0=created, 1=funded, 2=released, 3=refunded
receive(msg: Fund) {
require(self.state == 0, "Wrong state");
self.state = 1;
}
receive(msg: Release) {
require(self.state == 1, "Wrong state");
require(sender() == self.buyer, "Not buyer");
self.state = 2;
send(/* transfer to seller */);
}
}Паттерн проектирования, при котором контракт отправляет несколько сообщений параллельно и собирает результаты. В TON параллельные сообщения обрабатываются независимо в разных шардах, что повышает пропускную способность. Сложность заключается в сборе результатов и обработке частичных отказов.
// Scatter-Gather паттерн
contract Aggregator {
responses: Int = 0;
expected: Int = 3;
fun queryAll() {
// Отправка параллельно в 3 оракула
send(/* → Oracle A */);
send(/* → Oracle B */);
send(/* → Oracle C */);
}
receive(msg: OracleResponse) {
self.responses += 1;
// Действие после сбора всех ответов
if (self.responses == self.expected) {
self.finalize();
}
}
}Методика организации данных контракта в виде дерева ячеек (cells) с учётом ограничений TON: максимум 1023 бит и 4 ссылки на ячейку. Глубина дерева влияет на стоимость чтения и записи. Оптимальное проектирование балансирует между плоскими структурами (дешёвое чтение) и глубокими (экономия хранения).
// Плоская структура (быстрый доступ, дорогое хранение):
// Root → [balance, owner, data1, data2]
// Глубина: 1, доступ: O(1)
// Глубокая структура (медленный доступ, дешёвое хранение):
// Root → [balance, ref→[owner, ref→[data1, data2]]]
// Глубина: 3, доступ: O(depth)
// Оптимальный баланс: часто читаемые данные — наверху
// Root → [balance, owner, ref→[metadata]]Проектирование формата хранения и передачи данных через Bag of Cells с учётом газовых затрат. Выбор между inline-хранением (данные в ячейке сообщения) и reference-хранением (данные в отдельных ячейках) влияет на стоимость парсинга. Стратегия сериализации определяет, как структурировать данные для минимизации газа при типичных операциях.
// Стратегия: минимизация gas при частых операциях
// Частая операция — проверка баланса:
// Хранить balance в первых битах корневой ячейки
beginCell()
.storeCoins(balance) // первым — частый доступ
.storeAddress(owner) // вторым
.storeRef(metadata) // редко читаемое — в ref
.endCell()Методика создания Type Language — Binary схем для описания формата данных в TON. TL-B схемы определяют бинарную раскладку данных в ячейках и используются для сериализации/десериализации сообщений и хранилища. Хорошая схема обеспечивает компактность, версионируемость и обратную совместимость.
// TL-B схема для токен-трансфера:
// transfer#0f8a7ea5
// query_id:uint64
// amount:(VarUInteger 16)
// destination:MsgAddress
// response_destination:MsgAddress
// custom_payload:(Maybe ^Cell)
// forward_ton_amount:(VarUInteger 16)
// forward_payload:(Either Cell ^Cell)
// = InternalMsgBody;
//
// Opcode 0f8a7ea5 — уникальный идентификаторТехники эффективного использования HashmapE (словарей) в контрактах TON. Словари хранятся как Patricia-деревья в ячейках, и каждая операция требует обхода дерева. Оптимизации включают: выбор размера ключа, пакетные обновления, lazy-загрузку поддеревьев и вынос редко используемых данных в дочерние контракты.
// Проблема: словарь с 10000 записями
// Каждая запись/чтение — обход дерева O(key_bits)
// Оптимизация 1: уменьшить размер ключа
// map<Int as uint256, V> → дорого (256 бит)
// map<Int as uint32, V> → дёшево (32 бита)
// Оптимизация 2: шардинг словаря
// Вместо одного большого словаря:
// Master.users: map<Address, Data> // 10000 записей
// Распределить по дочерним контрактам:
// UserContract(owner).data // 1 запись на контрактСтратегии минимизации расходов на хранение данных в контрактах TON. Каждая ячейка стоит ~0.000000033 TON за бит в год. При проектировании системы необходимо оценивать TCO хранения и выбирать между on-chain (дорого, верифицируемо) и off-chain (дёшево, требует доверия) хранением.
// Расчёт стоимости хранения NFT-коллекции:
// 10000 NFT × 1 KB metadata on-chain
// = 10 MB × 0.000000033 TON/бит/год
// = ~2.6 TON/год
// Альтернатива: off-chain metadata
// 10000 NFT × 32 байта (ссылка на IPFS)
// = 320 KB → ~0.08 TON/год
// Решение: гибридный подход
// Критичные данные (owner, index) — on-chain
// Медиа и описание — IPFS/TON StorageПодход к газовой модели TON не как к техническому ограничению, а как к ключевому фактору архитектурных решений. Стоимость вычислений, хранения и пересылки сообщений определяет выбор между альтернативными архитектурами. Контракт, дешёвый в деплое, может оказаться дорогим в эксплуатации.
// Gas влияет на архитектуру:
// Вариант A: один контракт, сложная логика
// Deploy: 0.05 TON
// Каждый вызов: 0.1 TON (много вычислений)
// 1000 вызовов: 100 TON
// Вариант B: система контрактов, простая логика
// Deploy: 0.2 TON (4 контракта)
// Каждый вызов: 0.03 TON (параллельно)
// 1000 вызовов: 30 TON
// Вариант B дешевле при > 200 вызовахНабор техник снижения газовых затрат при сохранении функциональности. Включают: оптимизацию раскладки данных в ячейках, минимизацию количества сообщений в цепочке, batch-операции, lazy-вычисления, кеширование промежуточных результатов и выбор оптимальных структур данных.
// Паттерн: batch-обработка вместо поштучной
// Неоптимально: 100 отдельных сообщений
for (let i = 0; i < 100; i++) {
send(Transfer{to: recipients[i]});
}
// Gas: 100 × 0.01 = 1 TON
// Оптимально: batch через merkle-proof
send(BatchTransfer{
merkleRoot: root,
count: 100
});
// Gas: 0.05 TON (один вызов с proof)Анализ экономической устойчивости системы контрактов: доходы (комиссии, стейкинг), расходы (газ, хранение, maintenance), точка безубыточности. Моделирование помогает определить оптимальную структуру комиссий, минимальный TVL для самоокупаемости и стратегию управления treasury.
// Экономическая модель DEX-пула:
// Доходы:
// Swap fee: 0.3% от объёма
// Ежедневный объём: 100,000 TON
// Доход: 300 TON/день
//
// Расходы:
// Gas на swap: 0.03 TON × 500 = 15 TON/день
// Хранение: 0.01 TON/день
// Итого: ~15 TON/день
//
// Прибыль: ~285 TON/день
// Breakeven при объёме: ~5000 TON/деньМетодика предварительного расчёта стоимости операций в TON для UX и проектирования. Включает три компонента: compute fee (вычисления TVM), storage fee (хранение данных), forward fee (пересылка сообщений). Точная оценка позволяет показывать пользователю ожидаемую стоимость транзакции до подтверждения.
// Оценка gas для цепочки swap:
// Шаг 1: User → Router (compute: ~3000 gas)
// forward_fee: ~0.005 TON
// Шаг 2: Router → Pool (compute: ~5000 gas)
// forward_fee: ~0.005 TON
// Шаг 3: Pool → JettonWallet (compute: ~4000 gas)
// forward_fee: ~0.005 TON
// Итого estimate: ~0.03 TON
// Рекомендация UX: отправлять 0.05 TON
// Разница вернётся через excess-сообщениеСтратегия распределения вычислительных ресурсов между контрактами в системе. TVM имеет ограничение на максимальный gas_limit одной транзакции. Сложные операции необходимо декомпозировать на цепочку сообщений, каждое из которых укладывается в лимит. Проектирование бюджета определяет, сколько работы выполняет каждый контракт.
// Проблема: слишком много вычислений в одном вызове
// gas_limit = 1,000,000 gas units
// Тяжёлая операция: пересчёт 1000 позиций
// Не влезает в один вызов!
// Решение: continuation-паттерн
contract BatchProcessor {
processed: Int = 0;
receive(msg: Process) {
let batch = 50; // обработать порцию
// ... обработка 50 элементов ...
self.processed += batch;
if (self.processed < total) {
send(/* сообщение самому себе */)
}
}
}Архитектурные паттерны для децентрализованных бирж на TON, адаптированные к асинхронной модели. Включают: Router-Pool-Vault архитектуру, CPMM (Constant Product) и StableSwap формулы, управление ликвидностью через LP-токены. Ключевое отличие от EVM-DEX: отсутствие атомарных мульти-контрактных вызовов.
// Архитектура DEX на TON (DeDust-стиль):
//
// Factory → создаёт Pool по параметрам
// Router → маршрутизирует swap-запросы
// Pool → хранит ликвидность, выполняет swap
// Vault → хранит токены одного типа
//
// Swap flow:
// User → Jetton.transfer → Pool.swap_notification
// Pool → Vault.withdraw → User.transfer_notification
//
// В отличие от Uniswap: нет flashloan (async!)Архитектурные решения для интеграции внешних данных (цены, курсы, погода) в контракты TON. Из-за асинхронной модели оракул не может быть вызван синхронно — данные запрашиваются через сообщения с задержкой. Паттерны: push-оракул (обновляет данные периодически), pull-оракул (по запросу), гибридный с кешированием.
// Push-оракул (периодическое обновление):
contract PriceOracle {
prices: map<Int, PriceData>; // pair_id → price
lastUpdate: Int;
receive(msg: UpdatePrice) {
require(sender() == self.updater, "Not updater");
self.prices.set(msg.pairId, PriceData{
price: msg.price,
timestamp: now()
});
}
// Контракты запрашивают цену асинхронно
receive(msg: GetPrice) {
let data = self.prices.get(msg.pairId);
reply(PriceResponse{price: data.price});
}
}Комплексный подход к проектированию токенных экосистем на TON: выбор стандарта (Jetton, SBT, NFT), дизайн эмиссии (фиксированная, инфляционная, дефляционная), механизмы распределения (airdrop, vesting, staking), governance-модели. Учитывает экономические стимулы и game theory.
// Проектирование токеномики DAO:
//
// Эмиссия: 1,000,000 токенов (фиксированная)
// Распределение:
// 40% — community (vesting 4 года)
// 25% — team (cliff 1 год, vesting 3 года)
// 20% — treasury (управляется DAO)
// 15% — liquidity mining
//
// Governance: 1 токен = 1 голос
// Порог создания пропозала: 10,000 токенов
// Кворум: 10% supplyМетодология проектирования, при которой безопасность закладывается на этапе архитектуры, а не добавляется позже. Включает: threat modeling для каждого потока сообщений, проверку всех граничных условий, protection against reentrancy (через actor model), валидацию газа, проверку bounce и excess-сообщений.
// Чек-лист безопасности для каждого контракта:
// □ msg_value >= required_gas + forward_fees
// □ sender() проверяется в каждом receive
// □ bounce обработан для каждого send
// □ Integer overflow невозможен
// □ Excess возвращается отправителю
// □ Replay protection (seqno или query_id)
// □ Нет зависимости от block.timestamp
// □ Код обновляемости защищён multisigАрхитектурные подходы к обновлению кода контрактов TON после деплоя. В отличие от Ethereum proxy-паттернов, TON позволяет прямую замену кода контракта. Паттерны: прямое обновление (owner вызывает set_code), голосование DAO, timelock с задержкой, emergency multisig. Каждый паттерн балансирует между гибкостью и безопасностью.
// Паттерн: Timelock-обновление
contract Upgradable {
pendingCode: Cell? = null;
upgradeAt: Int = 0;
receive(msg: ProposeUpgrade) {
require(sender() == self.admin, "Not admin");
self.pendingCode = msg.newCode;
self.upgradeAt = now() + 86400; // 24h delay
}
receive(msg: ExecuteUpgrade) {
require(now() >= self.upgradeAt, "Too early");
require(self.pendingCode != null, "No pending");
nativeSetCode(self.pendingCode!!);
}
}Проектирование Telegram Mini Apps как фронтенда для TON-контрактов. Архитектура включает три слоя: Mini App UI (React/Vue в WebView), backend (API-сервер для off-chain логики), on-chain (смарт-контракты). Ключевые решения: разделение логики между слоями, стратегия подключения кошелька через TON Connect, кеширование on-chain данных.
// Трёхслойная архитектура Mini App:
//
// Слой 1: Telegram WebView (Mini App)
// React + TON Connect UI
// Показывает UI, подписывает транзакции
//
// Слой 2: Backend API
// Кеширование on-chain данных
// Индексация событий
// Push-уведомления
//
// Слой 3: TON Smart Contracts
// Бизнес-логика и хранение
// Обработка платежейLayer-2 решение для масштабирования микроплатежей в TON. Два участника открывают канал on-chain, обмениваются подписанными состояниями off-chain и закрывают канал с финальным балансом on-chain. Проектирование включает: протокол обновления состояний, механизм dispute resolution, стратегию определения timeout и защиту от мошенничества.
// Жизненный цикл платёжного канала:
//
// 1. Открытие (on-chain)
// Alice deploy ChannelContract с залогом 100 TON
// Bob подтверждает участие с залогом 100 TON
//
// 2. Off-chain обмен (мгновенно, бесплатно)
// State #1: Alice=90, Bob=110 (подписано обоими)
// State #2: Alice=85, Bob=115 (подписано обоими)
//
// 3. Закрытие (on-chain)
// Публикация финального state + challenge period
// Распределение: Alice=85, Bob=115Стратегии наблюдения за системой контрактов в production. Включают: мониторинг балансов контрактов, отслеживание цепочек сообщений, алертинг на аномальные транзакции, индексация событий для аналитики. В TON мониторинг сложнее, чем в EVM, из-за асинхронности и отсутствия event logs.
// Мониторинг DEX в production:
//
// 1. Balance Monitor:
// Проверять баланс Pool каждые 30 сек
// Alert если < минимальной ликвидности
//
// 2. Transaction Monitor:
// Индексировать все входящие сообщения
// Отслеживать failed transactions
// Alert если error rate > 5%
//
// 3. TVL Tracker:
// Агрегировать балансы всех пулов
// Dashboard с историей TVL
// Alert при резком падении (> 20% за час)Методика объединения всех изученных паттернов System Design в единую DeFi-платформу. Capstone-проект демонстрирует сквозное проектирование: от требований до production-деплоя. Включает интеграцию контрактов (DEX + Lending + Governance), фронтенд (Mini App), мониторинг и документацию.
// Capstone: DeFi платформа
//
// Контракты:
// DEX (Router + Pools) — модули 04, 07
// Token (Jetton + LP) — модуль 08
// Governance (DAO voting) — модуль 11
//
// Frontend:
// Telegram Mini App — модуль 09
// TON Connect — подключение кошелька
//
// Infrastructure:
// Indexer — отслеживание транзакций
// Monitor — алертинг и дашборды
// CI/CD — автодеплой контрактовПодходы к развёртыванию систем контрактов TON в production. Включают: порядок деплоя (сначала листовые контракты, затем координаторы), стратегии миграции (параллельная работа старой и новой версии), canary-деплой (ограниченный трафик на новую версию), blue-green деплой (мгновенное переключение через Router).
// Порядок деплоя DEX-системы:
//
// Фаза 1: Deploy базовых контрактов
// 1. JettonMaster (LP токены)
// 2. Vault контракты
// 3. Pool контракты
//
// Фаза 2: Deploy координаторов
// 4. Router (ссылается на Pool-ы)
// 5. Factory (создаёт новые Pool-ы)
//
// Фаза 3: Настройка и верификация
// 6. Инициализация ликвидности
// 7. Тестовый swap
// 8. Открытие публичного доступа