Skip to content

消息模式

如前所述,消息是通过结构体 SendParameters 的 mode 参数发送的。它是一个 Int 值,由基本模式和可选标志(也是 Int 值)组合而成。

虽然可以使用原始 Int 值并手动为 mode 提供它们,但为了方便,提供了一组常量,您可以使用这些常量轻松构建复合模式。请查看以下表格以获取有关基本模式和可选标志的更多信息。

基本模式

模式值常量名称描述
0-普通消息(默认)。
64SendRemainingValue除了新消息中最初指定的价值外,还携带所有来访消息的剩余价值。
128SendRemainingBalance携带当前智能合约的所有剩余余额,而不是消息最初指定的价值。

可选标志

标志值常量名称描述
+1SendPayGasSeparately分开支付转账费用,不从消息价值中扣除。
+2SendIgnoreErrors忽略操作阶段处理此消息时出现的任何错误。
+16SendBounceIfActionFail如果操作阶段出现任何错误,则反弹交易。如果使用了标志 +2(SendIgnoreErrors),则此标志无效。
+32SendDestroyIfZero如果最终余额为零,则必须销毁当前账户(通常与模式 128(SendRemainingBalance)一起使用)。

组合模式与标志

要为 SendParameters 的 mode 字段生成 Int 值,只需通过应用位或操作(bitwise OR)来组合基本模式与可选标志。

例如,如果您想发送常规消息并单独支付转账费用,使用模式 0(默认)和标志 +1,得到的模式值为 =1,相当于使用 SendPayGasSeparately 常量。

另一种情况,如果您想发送整个合约余额并立即销毁它,使用模式 128 和标志 +32,得到的模式值为 =160,相当于 SendRemainingBalance | SendDestroyIfZero

以下是后一个示例在代码中的样子:

solidity
let to: Address = ...;
let value: Int = ton("1");
send(SendParameters{
    to: to,
    value: value,
    mode: SendRemainingBalance | SendDestroyIfZero,
    body: "Hello, World!".asComment()
});

请注意,虽然可以将基本模式与可选标志相加(+),但不推荐这样做,因为可能会产生过多的值。应该使用位或(|)操作,因为它专为此类标志和位操作设计。

另请注意,只能有一个基本模式,但可选标志的数量可能不同:您可以使用所有标志、不使用任何标志或只使用某些标志。