Actor Model: фундамент архитектуры TON
Что такое Actor Model
Actor Model — модель вычислений, где actor — это базовая единица, которая:
- Имеет собственное состояние (недоступное извне)
- Получает и обрабатывает сообщения (по одному за раз)
- В ответ на сообщение может: изменить своё состояние, отправить сообщения другим акторам, создать новых акторов
Actor Model в индустрии
Actor Model — не изобретение TON. Это проверенная модель из 1973 года:
| Система | Реализация Actor Model |
|---|---|
| Erlang/OTP | Телекоммуникации (Ericsson, WhatsApp) |
| Akka | JVM распределённые системы |
| Microsoft Orleans | Cloud-native virtual actors |
| TON | Блокчейн smart contracts |
TON как Actor System
В TON каждый аккаунт — actor:
Аккаунт в TON:
├── Address (256-bit unique ID)
├── Code (TVM bytecode — логика обработки сообщений)
├── Data (persistent state — cells)
├── Balance (TON coins для gas и storage)
└── Message Queue (входящие сообщения)
Правила Actor Model в TON
- Изоляция: Контракт A не может прочитать state контракта B. Только отправить сообщение и ждать ответ.
- Последовательность: Внутри одного контракта сообщения обрабатываются строго по одному. Нет race conditions внутри контракта.
- Асинхронность: Отправка сообщения — fire-and-forget. Ответ придёт в следующей транзакции.
Почему Actor Model идеален для шардирования
Если каждый контракт — изолированный actor, его можно перенести в любой шард без изменения логики. Нет shared state = нет проблем с distributed locks, нет global state = нет bottleneck. Именно поэтому TON выбрал Actor Model — это архитектурное решение для масштабирования.
Типы сообщений в TON
External Messages
Входящие сообщения из внешнего мира (off-chain → on-chain):
External Message:
Источник: Кошелёк пользователя (off-chain)
Назначение: Smart contract (on-chain)
Оплата gas: Контракт-получатель платит из своего баланса
Bounce: Невозможен (нет адреса возврата)
Internal Messages
Сообщения между контрактами (on-chain → on-chain):
Internal Message:
Источник: Smart contract A
Назначение: Smart contract B
Оплата gas: Из value, приложенного к сообщению
Bounce: Да (если bounce: true)
Log Messages
Исходящие сообщения наружу (on-chain → off-chain):
Log Message:
Источник: Smart contract
Назначение: Внешние системы (indexers, dApps)
Оплата gas: Контракт-отправитель
Использование: Events для off-chain подписчиков
Транзакция в TON: anatomy
Транзакция в TON — это обработка одного сообщения одним контрактом:
Transaction:
1. Получить входящее сообщение (internal или external)
2. Credit Phase: зачислить value из сообщения на баланс
3. Compute Phase: выполнить код контракта (TVM)
4. Action Phase: отправить исходящие сообщения
5. Storage Phase: оплатить storage fee
Критично для System Design
Одна транзакция обрабатывает одно сообщение одним контрактом. Сложная операция (DEX swap) — это цепочка транзакций: каждый контракт обрабатывает своё сообщение и отправляет следующее. Проектируйте state machines, а не monolithic functions.
Сравнение: TON vs Ethereum execution
| Аспект | Ethereum (EVM) | TON (Actor/TVM) |
|---|---|---|
| Вызов другого контракта | Синхронный — результат мгновенно | Асинхронный — результат в следующем блоке |
| Atomicity | Вся call chain атомарна | Только одна транзакция атомарна |
| Read state | Любой контракт может читать state другого | Только через get-methods (off-chain) |
| Reentrancy | Возможна (уязвимость) | Невозможна (sequential processing) |
| Concurrency | Последовательно (одна EVM) | Параллельно (разные шарды) |
| Composability | Высокая (DeFi Legos) | Ограниченная (async boundaries) |
Reentrancy невозможна на TON
Один из самых дорогих exploit-ов Ethereum ($60M DAO hack) — reentrancy attack — невозможен на TON. Контракт обрабатывает сообщения по одному, последовательно. Пока текущее сообщение не обработано — следующее не начнёт выполняться. Это inherent security benefit Actor Model.
Implications для System Design
1. Проектируйте State Machines
Каждый контракт — это state machine, который переходит между состояниями при получении сообщений:
DEX Pool State Machine:
State: IDLE
→ recv(swap_request) → State: PROCESSING_SWAP
State: PROCESSING_SWAP
→ recv(token_received) → execute swap → State: IDLE
→ recv(timeout) → refund → State: IDLE
→ recv(bounce) → error handling → State: IDLE
2. Планируйте message chains
Сложные операции = цепочки сообщений. Планируйте весь flow заранее:
- Сколько сообщений?
- Сколько gas на каждый hop?
- Что делать при ошибке на каждом шаге?
3. Не полагайтесь на порядок
Если контракт отправил два сообщения разным получателям — нет гарантии, что они обработаются в определённом порядке. Проектируйте для out-of-order delivery.
Системный взгляд на actor-model полезно дополнить пониманием низкоуровневого execution: как именно TVM исполняет контракт, как устроен стек, continuation-based control flow и взаимодействие со стеком ячеек.
TVM: actor model и исполнение