Appearance
消息模式
如前所述,消息是通过结构体 SendParameters
的 mode 参数发送的。它是一个 Int 值,由基本模式和可选标志(也是 Int 值)组合而成。
虽然可以使用原始 Int 值并手动为 mode 提供它们,但为了方便,提供了一组常量,您可以使用这些常量轻松构建复合模式。请查看以下表格以获取有关基本模式和可选标志的更多信息。
基本模式
模式值 | 常量名称 | 描述 |
---|---|---|
0 | - | 普通消息(默认)。 |
64 | SendRemainingValue | 除了新消息中最初指定的价值外,还携带所有来访消息的剩余价值。 |
128 | SendRemainingBalance | 携带当前智能合约的所有剩余余额,而不是消息最初指定的价值。 |
可选标志
标志值 | 常量名称 | 描述 |
---|---|---|
+1 | SendPayGasSeparately | 分开支付转账费用,不从消息价值中扣除。 |
+2 | SendIgnoreErrors | 忽略操作阶段处理此消息时出现的任何错误。 |
+16 | SendBounceIfActionFail | 如果操作阶段出现任何错误,则反弹交易。如果使用了标志 +2 (SendIgnoreErrors),则此标志无效。 |
+32 | SendDestroyIfZero | 如果最终余额为零,则必须销毁当前账户(通常与模式 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()
});
请注意,虽然可以将基本模式与可选标志相加(+),但不推荐这样做,因为可能会产生过多的值。应该使用位或(|)操作,因为它专为此类标志和位操作设计。
另请注意,只能有一个基本模式,但可选标志的数量可能不同:您可以使用所有标志、不使用任何标志或只使用某些标志。