Slice
Тип TVM, представляющий «вид» (read-only cursor) на cell для парсинга. Из cell делают slice, чтобы прочитать его содержимое.
Синонимы: тип slice, ton slice
Slice — один из ключевых типов TVM, представляющий read-only курсор на cell. Если cell — это контейнер с битами и ссылками, то slice — это позиция, с которой читается содержимое: «прочитать 32 бита», «прочитать ссылку на следующий cell», и так далее.
Жизненный цикл
Типичный pattern работы со cell-ом в TVM:
begin_parseпревращает cell в slice — курсор в начале.load_uint(n),load_addr(),load_ref()— операции, читающие из slice по типу. Каждая операция сдвигает курсор.end_parseпроверяет, что весь slice прочитан без остатка (если осталось — ошибка).
В Tact и Tolk этот процесс скрыт: компилятор генерирует код парсинга по объявлениям message/struct. В FunC slice всегда виден явно.
Slice vs Cell
| Свойство | Cell | Slice |
|---|---|---|
| Назначение | хранить данные | читать данные |
| Изменяемость | immutable | курсор перемещается |
| Используется в | storage, message body | parsing |
| Создаётся из | builder.end() | cell.begin_parse() |
Cell — это «файл», slice — это «открытый дескриптор для чтения с позицией».
Что важно
- Slice не копирует данные. Он указывает на тот же cell, просто хранит «где сейчас курсор и сколько осталось».
- Если в slice осталась дочерняя ссылка, её надо прочитать
load_ref()и потомbegin_parse()уже на полученном cell — рекурсивно. - Газ зависит от того, сколько прочитано, а не от того, сколько лежит в исходном cell. Парсить ровно то, что нужно — оптимизация.
Slice — основа любого парсинга: тела сообщения, состояния контракта, ABI-аргументов.