Builder
Тип TVM для пошагового конструирования cell. В builder последовательно добавляют биты и ссылки, в конце он закрывается в готовый cell.
Синонимы: тип builder, ton builder
Builder — тип TVM, симметричный slice. Если slice — это курсор для чтения cell, то builder — это изменяемый буфер для построения нового cell. Шаг за шагом в builder добавляются биты, числа и ссылки на другие cell-ы, после чего он «запекается» в готовый cell.
Жизненный цикл
begin_cell() ;; создаёт пустой builder
.store_uint(0xf8a7ea5, 32) ;; добавить 32-битный opcode
.store_uint(0, 64) ;; добавить query_id
.store_coins(amount) ;; добавить сумму в формате VarUInteger
.store_slice(addr) ;; добавить адрес-получателя
.end_cell() ;; запечатать в cell
После end_cell() cell иммутабелен, его можно класть в storage, в исходящее сообщение или в dictionary.
Что хранится в builder
В каждый момент builder помнит:
- Текущий битовый буфер (накопленные биты, до 1023).
- Список ссылок на дочерние cell (до 4 штук).
Превышение лимитов даёт ошибку компиляции / исполнения. Если данных больше лимита cell, нужно делать дерево — складывать часть данных в дочерний cell и хранить на него ссылку.
Builder vs Cell vs Slice
| Тип | Назначение | Изменяемость |
|---|---|---|
| Builder | строить новый cell | mutable |
| Cell | хранить данные | immutable |
| Slice | читать cell | read-only cursor |
Цикл «прочитать → пересобрать» в TVM — это всегда slice → builder → cell: парсим slice, по ходу пишем в builder, в конце запекаем.
В Tact и Tolk
В высокоуровневых языках builder обычно скрыт: компилятор сам генерирует код сериализации по схеме message/struct. Но при оптимизации горячих путей или при работе с произвольными форматами разработчик опускается до builder/slice вручную.