Схемы сообщений TL-B
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
В этом разделе подробное объяснение схем TL-B для сообщений.
Сообщение TL-B
TL-B
Основное сообщение Схема TL-B объявлена как комбинация нескольких вложенных структур
message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
message$_ {X:Type} info:CommonMsgInfoRelaxed
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = MessageRelaxed X;
_ (Message Any) = MessageAny;
Здесь Message X
- это общая структура сообщения, MessageRelaxed X
дополнительный тип с телом CommonMsgInfoRelaxed, а Message Any
- это объединение обоих.
Структура сообщения унифицирована с X:Type, то есть является ячейкой.
Согласно TL-B мы можем объединить все данные в одной ячейке (если она уместится в 1023 бита) или использовать ссылки, объявленные с помощью символа ^
.
Сериализованное Message X
помещается в список действий с помощью метода FunC send_raw_message(), затем смарт-контракт выполняет это действие и отправляет сообщение.
Определение явной сериализации
Для построения допустимых двоичных данных в соответствии со структурой TL-B мы должны выполнить сериализацию, которая определяется для каждого типа рекуррентно. Это значит, что для сериализации сообщения X нам нужно знать, как сериализовать
StateInit
, CommonMsgInfo
и т. д.
Каждую вложенную структуру мы должны получать из другой схемы TL-B по ссылке рекуррентно, пока сериализация для верхней структуры не станет явной - каждый бит будет определен булевым или битовым типом (bits, uint, varuint).
Структуры, которые в настоящее время не используются в обычной разработке, будут отмечены *
в столбце Тип, например *Anycast обычно пропускается при сериализации.
message$_
Имеется верхняя схема TL-B для всех сообщений Message X
:
message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
Структура | Тип | Обязательно | Описание | |
---|---|---|---|---|
message$_ | Constructor | Определяется по правилам конструктора. Пустой тег $_ означает, что мы не будем добавлять никаких битов в начало | ||
info | CommonMsgInfo | Обязательно | Подробные свойства сообщения определяют пункт назначения и его значение. Всегда помещаются в корневую ячейку сообщения. | |
init | StateInit | Необязательно | Общая структура, используемая в TON для инициализации новых контрактов. Может быть записана как ссылка на ячейку или корневую ячейку. | |
body | X | Обязательно | Полезная нагрузка сообщения. Может быть записана как ссылка на ячейку или корневую ячейку. |
nothing$0 {X:Type} = Maybe X;
just$1 {X:Type} value:X = Maybe X;
left$0 {X:Type} {Y:Type} value:X = Either X Y;
right$1 {X:Type} {Y:Type} value:Y = Either X Y;
Вспомним, как работают Maybe
и Either
, мы можем сериализовать разные случаи:
[CommonMsgInfo][10][StateInit][0][X]
-Сообщение X
в одной ячейке


[CommonMsgInfo][11][^StateInit][1][^X]
-Сообщение X
со ссылками


CommonMsgInfo TL-B
CommonMsgInfo
CommonMsgInfo
— это список параметров, который определяет, как сообщение будет доставлено в блокчейне TON.
//internal message
int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
src:MsgAddressInt dest:MsgAddressInt
value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
//external incoming message
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;
//external outgoing message
ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
int_msg_info$0
int_msg_info
— это случай внутреннего сообщения. Это означает, что они могут быть отправлены между контрактами и только между контрактами.
Случай использования — обычные сообщения между контрактами.
nanograms$_ amount:(VarUInteger 16) = Grams;
//internal message
int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
src:MsgAddressInt dest:MsgAddressInt
value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
Структура | Тип | Обязательно | Описание |
---|---|---|---|
int_msg_info$0 | Constructor | Обязательно | Значение $0 тега означает, что при сериализации CommonMsgInfo, начинающийся с 0 бита, описывает внутреннее сообщение. |
ihr_disabled | Bool | Обязательно | Флаг маршрутизации гиперкуба. |
bounce | Bool | Обязательно | Сообщение должно быть отклонено, если во время обработки во зникли ошибки. Если flat bounce сообщения = 1, оно вызывает bounceable. |
bounced | Bool | Обязательно | Флаг, описывающий, что само сообщение является результатом bounce. |
src | MsgAddressInt | Обязательно | Адрес отправителя сообщения смарт-контракта. |
dest | MsgAddressInt | Обязательно | Адрес получателя сообщения смарт-контракта. |
value | CurrencyCollection | Обязательно | Структура, описывающая информацию о валюте, включая общую сумму средств, переведенных в сообщении. |
ihr_fee | VarUInteger 16 | Обязательно | Комиссии за доставку гипермаршрутизации |
fwd_fee | VarUInteger 16 | Обязательно | Комиссии за пересылку сообщений, назначенные валидаторами |
created_lt | uint64 | Обязательно | Логическое время отправки сообщения, назначенное валидатором. Используется для заказа действий в смарт-контракте. |
created_at | uint32 | Обязательно | Время Unix |
ext_in_msg_info$10
ext_in_msg_info$10
— это случай внешнего входящего сообщения. Означает, что этот тип сообщений отправляется из off-chain-пространства в контракты.
Вариант использования — запрос приложения кошелька в контракт кошелька.
nanograms$_ amount:(VarUInteger 16) = Grams;
//external incoming message
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;
Структура | Тип | Обязательно | Описание |
---|---|---|---|
ext_in_msg_info$10 | Constructor | Обязательно | Тег $10 означает, что в сериализации CommonMsgInfo, начинающийся с 10 бит, описывает внешнее входящее сообщение. |
ihr_disabled | Bool | Обязательно | Флаг гипермаршрутизации. (в настоящее время всегда true) |
src | MsgAddressExt | Обязательно | Адрес внешнего отправителя сообщения. |
dest | MsgAddressInt | Обязательно | Адрес смарт-контракта назначения сообщения. |
import_fee | VarUInteger 16 | Обязательно | Плата за выполнение и доставку сообщения. |
ext_out_msg_info$11
ext_out_msg_info$11
— это случай внешнего исходящего сообщения. Это означает, что они могут быть отправлены из контрактов в off-chain пространство.
Пример использования — логи.
//external outgoing message
ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
created_lt:uint64 created_at:uint32 = CommonMsgInfo;