Ячейки как хранилище данных
Все в TON хранится в ячейках. Ячейка — это структура данных, содержащая:
- до 1023 бит данных (не байтов!)
- до 4 ссылок на другие ячейки
Биты и ссылки нельзя смешивать – они хранятся отдельно. Циклические ссылки запрещены. Это означает, что для любой ячейки ни одна из ее дочерних ячеек не может иметь эту исходную ячейку в качестве ссылки.
Таким образом, все ячейки формируют направленный ациклический граф (DAG), наглядная иллюстрация предоставлена ниже:


Типы ячеек
В настоящее время существует 5 типов ячеек: обычные и 4 экзотических. Экзотические типы следующие:
- Ячейка с обрезанной ветвью
- Ячейка библиотечной ссылки
- Ячейка с доказательством Меркла
- Ячейка обновления Меркла
Подробнее об экзотических ячейках см: TVM Whitepaper, раздел 3.
Варианты ячеек
Ячейка — это непрозрачный объект, оптимизированный для компактного хранения.
В частности, он необходим для дедуплицикации данных. Если существует несколько эквивалентных подъячеек, на которые есть ссылки в разных ветвях, то их содержимое будет сохранено только один раз.В свою очередь свойство непрозрачности означает, что ячейку нельзя изменять или читать напрямую. Таким образом, появляются 2 дополнительных разновидности ячеек:
- Builder – для частично построенных ячеек, для которых можно определить быстрые операции добавления битовых строк, целых чисел, других ячеек и ссылок на другие ячейки.
- Slice – для "ра зрезанных" ячеек, представляющих собой либо остаток частично разобранной ячейки, либо значение, подъячейку, находящееся внутри такой ячейки и извлеченное из нее с помощью парсинг-инструкции.
Также в TVM используется еще одна особая разновидность ячеек:
- Continuation – для ячеек, содержащих opcode (инструкции) для виртуальной машины TON, см. обзор TVM.
Сериализация данных в ячейки
Любой объект в TON (сообщение, очередь сообщений, блок, состояние всего блокчейна, код контракта и данные) сериализуется в ячейку.
Процесс сериализации описывается схемой TL-B. Это формальное описание того, как этот объект может быть сериализован в Builder или как проанализировать объект заданного типа из Slice. TL-B для ячеек — это то же самое, что TL или ProtoBuf для байтовых потоков.
Если вы хотите узнать больше подробностей о (де)сериализации ячеек, вы можете прочитать статью Cell & Bag of Cells.