Learning Platform
Глоссарий Troubleshooting
Урок 06.03 · 20 мин
Продвинутый
TL-BSchemaType LanguageData Definition

TL-B: язык описания схем данных

Что такое TL-B

TL-B (Type Language — Binary) — формальный язык описания структуры данных в cells. Это как Protocol Buffers или JSON Schema, но для бинарных cell trees.

TL-B определяет:
1. Какие bits в какой cell
2. Порядок полей
3. Типы данных (uint, int, address, coins, ...)
4. Где references на дочерние cells
5. Conditional fields (Maybe, Either)

Основной синтаксис

TL-B Type System Overview
Primitive Types
Address & Coins
References (^Cell)
Maybe X (1 bit if absent)
Either X Y (1 bit selector)
Op Codes (#prefix)

Простой пример

// TL-B определение Jetton transfer message
transfer#f8a7ea5 
  query_id:uint64 
  amount:(VarUInteger 16) 
  destination:MsgAddress 
  response_destination:MsgAddress 
  custom_payload:(Maybe ^Cell) 
  forward_ton_amount:(VarUInteger 16) 
  forward_payload:(Either Cell ^Cell) 
  = InternalMsgBody;

Разбор:

  • transfer — название типа
  • #f8a7ea5 — op code (32-bit prefix)
  • query_id:uint64 — поле query_id, тип uint64
  • amount:(VarUInteger 16) — variable-length unsigned integer
  • destination:MsgAddress — TON address
  • (Maybe ^Cell) — опциональная ссылка на cell
  • (Either Cell ^Cell) — inline или в reference

Ключевые типы TL-B

ТипОписаниеBits
uint1uint256Unsigned integerN bits
int1int257Signed integerN bits
bits256Fixed 256 bits256
MsgAddressTON address267
Grams / VarUInteger 16Coin amountVariable
^CellReference to cell0 (reference, not data)
Maybe XOptional (1 bit flag + X)1 + sizeof(X)
Either X YUnion (1 bit flag + variant)1 + max(sizeof)

Читаем TL-B схемы

Пример: NFT Item Data

// TL-B определение NFT Item state
nft_item_data#_ 
  index:uint64 
  collection_address:MsgAddress 
  owner_address:MsgAddress 
  content:^Cell 
  = NFTItemData;

Перевод:

  • nft_item_data#_ — тип без explicit op code (#_ = автоматический)
  • index:uint64 — порядковый номер в коллекции
  • collection_address:MsgAddress — адрес Collection контракта
  • owner_address:MsgAddress — текущий владелец
  • content:^Cell — metadata (в отдельной referenced cell)

Расчёт размера

NFTItemData size:
  index:         64 bits
  collection:    267 bits
  owner:         267 bits
  content ref:   0 bits (reference, не data)
  ─────────────────────
  Total:         598 bits + 1 reference

Помещается в одну cell? 598 < 1023 [OK]

TL-B для System Design

1. Проектирование message format

Перед написанием кода — определите TL-B schema:

// Ваш custom protocol
subscribe#a1b2c3d4 
  query_id:uint64 
  plan_id:uint8 
  duration_months:uint16 
  = SubscribeMsg;

unsubscribe#b2c3d4e5 
  query_id:uint64 
  = UnsubscribeMsg;

subscription_status#c3d4e5f6 
  query_id:uint64 
  plan_id:uint8 
  expiry:uint32 
  = StatusResponse;

2. State layout design

TL-B для contract state:

// Subscription Master state
subscription_master#_ 
  admin:MsgAddress 
  next_user_id:uint64 
  total_subscribers:uint64 
  plans:^Cell               // ref: plans dictionary
  user_code:^Cell            // ref: child contract code
  = SubscriptionMasterData;

// Subscription Child state  
subscription_user#_ 
  owner:MsgAddress
  master:MsgAddress
  plan_id:uint8
  expiry:uint32
  total_paid:(VarUInteger 16)
  = SubscriptionUserData;

3. Версионирование

TL-B op codes позволяют версионировать протокол:

// Version 1
transfer_v1#f8a7ea5 ... = InternalMsgBody;

// Version 2 (новые поля)
transfer_v2#f8a7ea6 ... memo:(Maybe ^Cell) = InternalMsgBody;

// Контракт проверяет op code и выбирает handler:
if (op == 0xf8a7ea5) { handle_v1(); }
if (op == 0xf8a7ea6) { handle_v2(); }
TIP

Практическое правило

Всегда определяйте TL-B schema ПЕРЕД написанием кода. Это:

  1. Документирует протокол (другие контракты знают формат)
  2. Предотвращает ошибки сериализации
  3. Позволяет рассчитать gas заранее (знаем размер messages)
  4. Упрощает version migration
Проверка знанийKnowledge check
ОтветAnswer

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

Результат: 0 из 0
Концептуальный
Вопрос 1 из 2. TL-B определение: `transfer#f8a7ea5 query_id:uint64 amount:(VarUInteger 16) destination:MsgAddress = InternalMsgBody;`. Что означает `#f8a7ea5`?

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

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

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

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