Асинхронная модель
Tycho использует акторную модель вычислений: каждый аккаунт (смарт-контракт) является изолированным «актором» со своим состоянием и обрабатывает входящие сообщения. Взаимодействие между контрактами строится как обмен сообщениями, а «транзакция» — это результат исполнения одного сообщения на одном аккаунте.
В классическом определении акторной модели актор — базовый строительный блок конкурентных вычислений. Получив сообщение, актор может:
- принять локальное решение и изменить своё состояние
- отправить сообщения другим акторам
- создать новых акторов (в блокчейне — развернуть новые контракты)
В терминах блокчейна это удобно интерпретировать так: контракт обрабатывает входящее сообщение, обновляет своё состояние и выпускает новые сообщения (в другие контракты или в себя), формируя дальнейший workflow (цепочку сообщений).
Ключевые идеи
- Нет «вызовов контрактов в одном стеке» как в EVM: контракт не вызывает другой контракт синхронно, он отправляет ему сообщение
- Одно external-сообщение (вход извне) может породить цепочку internal-сообщений (межконтрактных), которые будут выполнены в последующих транзакциях
- Сообщения одного аккаунта исполняются последовательно, но сообщения разных аккаунтов могут исполняться параллельно, что повышает пропускную способность
Акторы: аккаунт = контракт = единица изоляции
В акторной модели:
- у каждого актора есть собственное состояние, которое изменяется только при обработке входящего сообщения
- акторы не имеют общей памяти и «не делят состояние напрямую» — только через сообщения
- обработка сообщения на акторе атомарна относительно этого актора (внутри одного аккаунта нет параллельного исполнения нескольких сообщений)
Практический смысл: чтобы изменить состояние другого контракта, нужно отправить ему internal-сообщение и дождаться, пока он обработает его в своей транзакции.
Очередь входящих сообщений
В классической акторной модели у актора есть «почтовый ящик» (mailbox) — очередь входящих сообщений, а обработка идёт последовательно, по одному сообщению за раз. Это даёт два практических эффекта:
- нет необходимости в блокировках для защиты инвариантов состояния
- параллелизм достигается за счёт одновременной работы разных акторов
В Tycho порядок исполнения сообщений для аккаунта дополнительно фиксируется правилами logical time (LT) и детерминированными правилами выборки сообщений, но модель «одно сообщение → одна транзакция → обновление состояния» остаётся базовой.
Как делать большие workflow (длинные процессы)
Каждая транзакция ограничена ресурсами исполнения (например, лимитами по газу и параметрами блока). Поэтому «бесконечный цикл» или обработка большого объёма данных обычно проектируются как пошаговый процесс:
- контракт обрабатывает входящее сообщение и делает часть работы
- сохраняет промежуточное состояние
- отправляет internal-сообщение (часто самому себе) для продолжения
Такой подход снимает ограничение «всё должно поместиться в одну транзакцию» и позволяет выполнять произвольный объём работы, распределяя её по цепочке сообщений.
Параллельность без гонок
Акторная модель хорошо распараллеливается, потому что изоляция по аккаунтам естественным образом задаёт границы независимости:
- для одного аккаунта сообщения исполняются строго последовательно (чтобы состояние было однозначным)
- для разных аккаунтов исполнение можно распараллеливать, если соблюсти детерминированные правила выбора и порядка сообщений
Это отличается от EVM-подхода, где кросс-контрактные взаимодействия происходят синхронно в рамках одного транзакционного стека (call stack), что приводит к классу проблем вроде «вклинивания» (reentrancy) и усложняет безопасное проектирование. В асинхронной модели вместо «вызова и немедленного результата» используются сообщения и явные состояния/колбэки.
Гарантии порядка: Logical Time (LT) и детерминизм исполнения
Чтобы разные ноды получили одинаковый результат при создании блока, Tycho вводит правила, устраняющие неоднозначность порядка исполнения сообщений. Для детерминизма требуется, чтобы сообщения «внутри контракта» исполнялись в строгом порядке logical time. Это обеспечивается:
1) Правилами LT для исходящих сообщений
- Для последовательных сообщений, отправленных контрактом A, соблюдается монотонность:
LT(M1) > LT(M0) - На уровне блоков соблюдается порядок: сообщения в блоке
B+1имеют больший LT, чем сообщения в блокеB+0
2) Правилами выбора и сортировки сообщений на исполнение
- Буфер очереди для каждого аккаунта-получателя сортируется по возрастанию
logical time hash(ключ детерминированной выборки) - Группы на исполнение формируются со строгим соблюдением порядка
logical time hash - Дополнительно применяется исполнение «волнами»: сообщения группируются в наборы (условно
S1,S2, …) и обрабатываются по порядку наборов. Сообщения, которые появились как результат исполнения набораS1, попадают в следующий наборS2и не могут «обогнать» сообщения изS1. Это помогает сохранять причинно-следственный порядок и эффективно распараллеливать вычисления в пределах доступных ресурсов
Порядок для взаимозависимых переходов состояния (Triangle constraint)
Отдельная задача — взаимозависимые состояния, когда сообщения порождают новые сообщения в связанные контракты:
- контракт A одновременно отправляет
M1в B иM2в C - при обработке
M1контракт B создаёт ещё одно сообщениеM3в C - тогда C обязан обработать
M2раньше, чемM3(даже если сообщения попадают в один блок или в разные блоки)
Это ограничение нужно, чтобы причинно-следственные зависимости между сообщениями сохранялись даже при распараллеливании исполнения.