Learning Platform
Глоссарий Troubleshooting
Урок 02.04 · 25 мин
Средний
CellsBoCTree of CellsМодель данныхСериализацияMerkle ProofPruned BranchВерификация

Cells и Bag of Cells

Cells (ячейки) — это атомарная единица данных в TON, подобно тому, как байты являются базовой единицей в обычном программировании. Всё в TON — код контрактов, состояние, сообщения — хранится в виде дерева ячеек. Понимание структуры cells и формата Bag of Cells (BoC) необходимо для эффективной сериализации данных, оптимизации хранения и, как следствие, снижения комиссий за ваши контракты.

В TON все данные хранятся в виде дерева ячеек (tree of cells). Это фундаментальная структура данных, которая определяет, как работает хранение, передача и верификация информации в блокчейне.


Что такое Cell

Cell (ячейка) — атомарная единица данных в TON. Каждая ячейка содержит:

  • До 1023 бит данных (не байтов!)
  • До 4 ссылок (references) на другие ячейки
  • Тип ячейки — один из 5 типов

Ограничения ячейки

ПараметрЛимит
Максимум данных1023 бита
Максимум ссылок4
Типы ячеек5
Максимальная глубина дерева1024
NOTE

Фиксированный размер ячейки (1023 бита) — не ограничение, а преимущество. Он позволяет эффективно хешировать ячейки и строить доказательства (proofs) без обхода данных произвольного размера.


Дерево ячеек (Tree of Cells)

Данные, которые не помещаются в одну ячейку, распределяются по дереву через ссылки. Например, состояние смарт-контракта:

Дерево ячеек (Tree of Cells)
Ordinary
Library
Merkle Proof
Contract State
856/1023 бит
3/4 ссылок
Code Cell
512/1023 бит
0/4 ссылок
Data Cell
768/1023 бит
1/4 ссылок
Storage Cell
384/1023 бит
0/4 ссылок
Library Cell
264/1023 бит
0/4 ссылок
Нажмите на ячейку для просмотра деталей. Каждая ячейка содержит до 1023 бит данных и до 4 ссылок на дочерние ячейки. Вся информация в TON хранится в виде дерева ячеек (tree of cells).

Структура контракта

Каждый смарт-контракт в TON хранится как дерево ячеек:

  • Корневая ячейка — содержит метаданные и ссылки на код и данные
  • Code cell — скомпилированный TVM-байткод контракта
  • Data cell — изменяемое состояние (баланс, переменные)
  • Library cell (опционально) — ссылка на общую библиотеку в masterchain

Типы ячеек

TON определяет 5 типов ячеек:

ТипОписаниеПрименение
OrdinaryОбычная ячейка99% всех ячеек
Pruned BranchЗаменяет поддерево хешемMerkle-доказательства
LibraryСсылка на общую библиотекуПереиспользование кода
Merkle ProofДоказательство включенияЛёгкие клиенты
Merkle UpdateДоказательство измененияОбновления состояния
TIP

Pruned Branch ячейки — ключ к масштабируемости. Они позволяют передавать доказательство о части дерева, не скачивая всё дерево. Лёгкий клиент может проверить баланс аккаунта, получив только путь от корня до нужной ячейки.


Bag of Cells (BoC)

Bag of Cells (BoC) — формат сериализации деревьев ячеек для передачи по сети и хранения на диске.

Как работает BoC

  1. Дерево ячеек линеаризуется — все ячейки складываются в последовательность
  2. Ссылки заменяются индексами в этой последовательности
  3. Добавляется заголовок с метаданными (количество ячеек, корневые ячейки)
  4. Результат сжимается и может быть передан как один блоб данных

Применение BoC

  • Транзакции передаются как BoC
  • Состояние контрактов хранится как BoC
  • Блоки шардчейнов — это BoC
  • Код контракта компилируется в BoC
Пример BoC заголовка:
b5ee9c72  -- magic number
01        -- has_crc32
01        -- ref_byte_size
01        -- offset_byte_size
03        -- cell_count = 3
01        -- root_count = 1
00        -- absent_count = 0
...       -- cell data

TON vs Ethereum: Хранение данных

TIP

TON vs Ethereum: Модель данных

Ethereum хранит состояние в Modified Merkle Patricia Trie (MPT) — дереве с узлами произвольного размера. TON использует tree of cells с фиксированным лимитом 1023 бит на ячейку и 4 ссылки.

Преимущество TON: фиксированный размер ячеек делает хеширование предсказуемым, а Merkle-доказательства — компактными.

Ethereum State Trie (MPT)

Хеширование ячеек

Каждая ячейка имеет уникальный хеш (SHA-256), вычисляемый из:

  1. Типа ячейки
  2. Данных ячейки (биты)
  3. Хешей всех дочерних ячеек (ссылок)

Это свойство Merkle-дерева: изменение любой ячейки приводит к изменению хешей всех предков до корня. Корневой хеш однозначно определяет всё дерево.


Верификация Merkle-доказательств

Типы ячеек Merkle Proof и Pruned Branch (описанные выше в таблице типов) работают вместе, позволяя проверять данные без скачивания всего дерева состояния. Это основа работы лёгких клиентов в TON.

Структура Merkle Proof

Merkle Proof — это специальная ячейка типа 3 (Exotic, hash_n_level = 0), которая содержит подмножество дерева, достаточное для доказательства конкретного факта:

  • Из полного дерева извлекается путь от корневой ячейки до целевой (например, до данных аккаунта)
  • Все ветки, не входящие в путь, заменяются ячейками Pruned Branch
  • Результат — компактное дерево, сохраняющее хеш-цепочку от корня до цели

Pruned Branch: замена поддерева хешем

Pruned Branch — ячейка типа 1, которая хранит:

  • Хеш замещённого поддерева (SHA-256, 256 бит)
  • Глубину замещённого поддерева

Pruned Branch занимает минимум места, но содержит всю информацию для проверки целостности. При верификации её хеш сравнивается с ожидаемым — если совпадает, значит замещённое поддерево корректно.

Алгоритм верификации

Верификация Merkle-доказательства выполняется за три шага:

  1. Получение proof — лёгкий клиент запрашивает Merkle proof у полной ноды
  2. Пересчёт хешей — от целевой (листовой) ячейки вверх до корня: хеш каждой ячейки вычисляется из её данных + хешей дочерних (включая Pruned Branch хеши)
  3. Сравнение корня — полученный корневой хеш сравнивается с известным хешем блока masterchain (корень доверия)

Если хеши совпадают — данные подлинные. Если нет — proof невалиден.

NOTE

Merkle-доказательства позволяют trustless-верификацию: лёгкий клиент не доверяет ноде, предоставившей proof. Он самостоятельно пересчитывает хеши и сверяет с корнем masterchain. Это делает возможным проверку баланса аккаунта, состояния контракта или факта транзакции без скачивания полного блока.

Практический пример: проверка баланса

Лёгкий клиент хочет проверить баланс аккаунта:

  1. Знает хеш последнего блока masterchain (из сети)
  2. Запрашивает у полной ноды proof пути: masterchain block → shard block hash → account state
  3. Получает дерево из ~10-15 ячеек (вместо миллионов) — остальные заменены Pruned Branch
  4. Пересчитывает хеши от аккаунта до корня
  5. Совпадение = баланс верный, без доверия ноде

Частые ошибки

  1. Забывают о лимите в 1023 бита данных и 4 ссылки на ячейку: попытка записать больше приведёт к ошибке во время выполнения.
  2. Не оптимизируют глубину дерева ячеек, хотя каждый уровень глубины увеличивает стоимость хранения и газ при чтении.
  3. Путают биты и байты при работе с cells: ячейка хранит данные в битах, а не в байтах, что требует побитовых операций.
  4. Игнорируют формат BoC при взаимодействии с API: многие TON API возвращают данные именно в формате Base64-encoded BoC, который нужно уметь парсить.

Проверка знанийKnowledge check
Почему ячейка TON ограничена 1023 битами данных и 4 ссылками?
ОтветAnswer
Фиксированный размер ячеек обеспечивает предсказуемую стоимость хеширования и компактные Merkle-доказательства. Это позволяет лёгким клиентам эффективно проверять состояние без загрузки всего дерева. 1023 бита -- достаточно для хранения большинства примитивов (адреса, числа, хеши), а 4 ссылки позволяют строить сбалансированные деревья.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Какие ограничения имеет одна ячейка (Cell) в TON?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7