TON Blockchain Architecture — система хранения и управления данными в TON:
- организация данных как bag of cells;
- шардирование на уровне аккаунтов (ISP);
- условия консенсуса и валидации;
- masterchain координирует все шарды и параметры сети.
Bag of Cells#
Все данные TON представлены коллекцией ячеек (cells). Каждая ячейка содержит:
- до 1023 бит данных;
- до 4 ссылок на другие ячейки (по SHA-256-хешам);
- 2 байта-дескриптора + сами данные.
Ячейки организованы в деревья или DAG (Directed Acyclic Graph). Сериализация — по схемам TL-B (Type Language — Binary).
Infinite Sharding Paradigm (ISP)#
Каждый аккаунт — это отдельный accountchain. Виртуальные блоки accountchain'ов группируются в блоки шардчейна для эффективности.
Состояние шардчейна = состояния всех аккаунтов шарда. Блок шардчейна = коллекция виртуальных блоков для каких-то аккаунтов.
В TON нет различия между «смарт-контрактом» и «аккаунтом» — это одна сущность.
Структура блока шардчейна#
Делится на 2 части:
Неразделённая (non-split)
| Компонент | Содержание |
|---|---|
| InMsgDescr | Описание входящих сообщений |
| OutMsgDescr | Описание исходящих сообщений |
| Block header | Хеши, параметры блока |
| OutMsgQueue | Очередь недоставленных сообщений (удаляются после доставки в соседние шарды) |
Разделённая (split)
Hashmap account_id → account_state. State аккаунта:
- баланс в Grams;
- код смарт-контракта;
- постоянные данные контракта;
- статистика использования хранилища;
- опциональное формальное описание интерфейса;
- публичная информация пользователя.
Masterchain#
- Не делится и не объединяется (single chain);
- Один предшественник (кроме нулевого блока с initial config);
- Содержит список всех активных шардов и последних блоков каждого;
- Хранит конфигурируемые параметры через специальный config-контракт.
Конфигурационные параметры
- Минимальный взнос валидаторов;
- Максимальный размер группы валидаторов;
- Макс. количество блоков, за которые отвечает группа;
- Процесс выборов и наказания валидаторов;
- Текущий и следующий наборы валидаторов;
- Процесс изменения параметров.
Начальные значения и код фундаментальных смарт-контрактов — в нулевом блоке masterchain.
Условия консенсуса#
Гарантируют корректность изменения данных только через валидные транзакции.
| Тип | Описание |
|---|---|
| Глобальные | Инварианты для всей сети (например, гарантии доставки сообщений) |
| Внутренние локальные | Внутри одного блока (например, обработка входящих сообщений) |
| Внешние локальные | Между блоками, обычно соседних шардов |
Блок валиден, если выполняет все применимые условия. Ответственность валидаторов — генерация и проверка.
Логическое время (LT)#
64-битное неотрицательное целое, присваивается событиям:
- Зависимое событие имеет LT больше всех своих зависимостей;
- Независимое событие имеет LT = 0;
- Исходящие сообщения наследуют LT из транзакции;
- Транзакция и блок имеют временной интервал, фиксируемый в заголовке.
LT нужен для упорядочивания событий без глобальных часов.
Общее состояние и visibility#
- Блок masterchain фиксирует состояние всех шардов через хеши их последних блоков;
- Блок шардчейна содержит хеш последнего блока masterchain в заголовке;
- «Видимые» блоки — те, что указаны в этом блоке masterchain + их предшественники;
- Блок шарда импортирует сообщения из OutMsgQueue видимых соседей; не может включить сообщения из невидимых блоков.
Смарт-контракты#
Создание
Применимо к базовому воркчейну и masterchain (другие воркчейны могут иметь свои механизмы):
- Сообщение на ранее не упомянутый адрес со значением → создаёт «неинициализированный аккаунт» с балансом, но без кода и данных;
- Constructor-сообщение содержит initial code + data → создаёт смарт-контракт;
- Constructor обычно несёт значение для первоначального баланса (минимум зависит от storage-fee);
- Смарт-контракты могут сами создавать новые смарт-контракты при транзакциях.
Модификация
- Постоянные данные изменяются при выполнении кода в TVM;
- Если код не предусматривает изменений → данные неизменны;
- Сам код может быть изменён, только если текущий код это разрешает.
Уничтожение и заморозка
- Контракт нельзя уничтожить, пока баланс > минимума;
- При отрицательном балансе аккаунт замораживается — code + data заменяются на 32-байтовый хеш;
- Хеш хранится некоторое время → владелец может восстановить аккаунт, переведя средства и отправив сообщение с code + data.