消息 TL-B 方案
本节详细解释消息的 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 统一,换句话说就是一个 Cell。根据 TL-B,如果数据能够适应 1023 位,我们可以将所有数据组合在一个cell中,或者使用带有插入符号 ^
的引用。
序列化的 Message X
通过 FunC 方法 send_raw_message() 放置到动作列表中,然后智能合约执行此动作并发送消息。
显式序列化的定义
根据 TL-B 结构构建有效的二进制数据,我们应该进行序列化,这对每种类型都是递归定义的。这意味着,要序列化 Message X,我们需要知道如何序列化 StateInit
、CommonMsgInfo
等。
我们应该根据递归链接从另一个 TL-B 方案中获取每个嵌套结构,直到顶层结构的序列化是显式 的 - 每个位由布尔或类似位的类型(比特,uint,varuint)定义。
目前在常规开发中不使用的结构将在 Type 列中标记为 *
,例如 *Anycast 通常在序列化中被跳过。
message$_
这是整个消息 Message X
的顶层 TL-B 方案:
message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
结构 | 类型 | 必需 | 描述 |
---|---|---|---|
message$_ | 构造函数 | 按照构造函数规则定义。空标记 $_ 表示我们不会在开头添加任何位 | |
info | CommonMsgInfo | 必需 | 详细的消息属性定义目的地及其值。始终放置在消息的根cell中。 |
init | StateInit | 可选 | 通用结构,用于 TON 中初始化新合约。可以写在cell引用或根cell中。 |
body | X | 必需 | 消息有效载荷。可以写在cell引用或根cell中。 |
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]
-Message X
在一个cell中
[CommonMsgInfo][11][^StateInit][1][^X]
-Message X
带引用
CommonMsgInfo TL-B
CommonMsgInfo
CommonMsgInfo
是一系列参数的列表,定义了消息在 TON 区块链中的传递方式。
//内部消息
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;
//外部传入消息
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;
//外部传出消息
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;
//内部消息
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 | 构造函数 | 必需 | $0 标记意味着序列化 CommonMsgInfo 以 0 位开始描述内部消息。 |
ihr_disabled | 布尔 | 必需 | 超立方体路由标志位。 |
bounce | 布尔 | 必需 | 如果处理过程中出现错误,消息应该被弹回。如果消息的 flat bounce = 1,它被称为可弹回。 |
bounced | 布尔 | 必需 | 描述消息本身是弹回结果的标志位。 |
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
是外部传入消息的一种情况。这意味着这种类型的消息是从合约发送到链下空间的。
用例 - 钱包应用请求钱包合约。
nanograms$_ amount:(VarUInteger 16) = Grams;
//外部传入消息
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;
| 结构 | 类型 | 必需 | 描述 |
|--------------------|--------------------------------------|----------|------------------------------------------------------------------------------------------------------------------------|
| ext_out_msg_info$10| 构造函数 | 必需 | $10
标记意味着序列化 CommonMsgInfo 以 10
位开始描述外部传入消息。 |
| ihr_disabled | 布尔 | 必需 | 超路由标志位。(目前始终为真) |
| src | MsgAddressExt | 必需 | 消息的外部发送者地址。 |
| dest | MsgAddressInt | 必需 | 消息目的地智能合约的地址。 |
| import_fee | VarUInteger 16 | 必需 | 执行和传递消息的费用。 |
ext_out_msg_info$11
ext_out_msg_info$11
是外部传出消息的一种情况。这意味着它们可以从合约发送到链外空间。
用例 - 日志。
//内部消息
ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
结构 | 类型 | 必需 | 描述 |
---|---|---|---|
ext_out_msg_info$11 | 构造函数 | 必需 | $11 标记意味着序列化 CommonMsgInfo 以 11 位开始描述外部传出消息。 |
src | MsgAddressInt | 必需 | 超路由标志位。 |
dest | MsgAddressExt | 必需 | 用于 TON 中初始化新合约的通用结构。可以写在cell引用或根cell中。 |
created_lt | uint64 | 必需 | 验证者指定的发送消息的逻辑时间。用于对智能合约中的动作进行排序。 |
created_at | uint32 | 必需 | Unix 时间 |