跳转到内容

高级

各种小众、危险或不稳定的功能,可能会产生意想不到的结果,仅供更有经验的用户使用。

Context.readForwardFee

extends fun readForwardFee(self: Context):Int

Context 的扩展函数。

读取 forward fee,并以 Int 的形式返回 nanoToncoins 的金额。

使用示例

let fwdFee: Int = context().readForwardFee();

获取配置参数

fun getConfigParam(id: Int):Cell?

通过 “id “号加载 TON 区块链的配置参数

使用示例

// 参数 0,存储区块链配置的特殊智能合约的地址
let configAddrAsCell: Cell = getConfigParam(0)!!;
// 参数 18,用于确定数据存储价格的配置
let dataStorageFeeConfig: Cell = getConfigParam(18)!!;

接受消息

fun acceptMessage();

同意购买一些汽油来完成当前交易。 处理外部信息时需要这一操作,因为外部信息本身没有价值(因此没有 gas )。

使用示例

contract Timeout {
timeoutInt;
init() {
self.timeout = now() + 5 * 60; // 5 minutes from now
}
external("timeout") {
if (now() > self.timeout) {
acceptMessage(); // 超时后开始接受外部信息
}
}
}

承诺

fun commit();

提交 寄存器c4(“持久化数据”)和c5(“操作”)的当前状态,这样,即使随后在计算阶段出现异常,当前执行也会因保存的值而被视为 “成功”。

使用示例

commit(); // 现在,事务被视为 "成功"
throw(42); // 这样就不会失败了

nativePrepareRandom

fun nativePrepareRandom();

使用 nativeRandomizeLt()准备随机数生成器。 由 randomInt()random() 函数自动调用。

使用示例

nativePrepareRandom(); // prepare the RNG
// ... do your random things ...

本机随机化

fun nativeRandomize(x: Int);

使用指定的种子 x 随机化伪随机数生成器。

使用示例

nativeRandomize(); // 现在,随机数的可预测性降低了
let idkInt = randomInt(); // ????, it's random!

本机随机化

fun nativeRandomizeLt();

使用当前 逻辑时间 随机化随机数发生器。

使用示例

nativeRandomizeLt(); // 现在,随机数对用户来说是不可预测的,
// 但仍可能受到验证器或校对器的影响
// 因为它们决定了当前代码块的种子。
let idkInt = randomInt(); // ???,它是随机的!

本机随机

fun nativeRandom():Int

生成并返回 256256-bit 随机数,就像 randomInt(),但不会事先用 nativePrepareRandom()初始化随机生成器。

本机随机时间间隔

fun nativeRandomInterval(max: Int):Int

生成并返回 256256-bit 的随机数,范围从 00max,类似于 random(),但不会事先用 nativePrepareRandom()初始化随机生成器。

本机发送消息

fun nativeSendMessage(cell: Cell, mode: Int);

通过指定完整的 “单元格 “和信息 “模式”排队发送信息

本地储备金

fun nativeReserve(amount: Int, mode: Int);

以指定的金额和模式调用本地 raw_reserve 函数。 raw_reserve “是一个函数,用于创建输出操作,从账户余额中储备特定数量的nanoToncoins

它在 FunC 中的签名如下

raw_reserve(int amount, int mode) impure asm "RAWRESERVE"

该函数有两个参数:

  • 金额:要储备的 nanoToncoins的数量。
  • 模式决定预订行为。

函数 “raw_reserve “大致等同于创建一个向外发送的消息,将指定的 “金额”nanoToncoins(或 “b ” - “金额”nanoToncoins,其中 “b “为余额)发送给自己。 这就确保了后续产出行动所花费的资金不会超过剩余资金。

您可以使用原始的 Int值,并手动为 mode 提供这些值,但为了方便起见,您可以使用一组常量来轻松构建复合 mode。 有关基本模式和可选标记的更多信息,请参阅下表。

基本模式

由此产生的 mode 值可以有以下基本模式:

模式值恒定名称说明
00ReserveExact精确保留指定数量的 纳顿币
11ReserveAllExcept保留所有 [纳米通币](/book/integers#nanotoncoin),但保留指定数量的 [纳米通币](/book/integers#nanotoncoin)。
22ReserveAtMost最多保留指定 “数量 “的 纳顿币

可选标记

此外,生成的 mode 还可以添加以下可选标记:

标志值恒定名称说明
+4+4ReserveAddOriginalBalance用经常账户的原始余额(计算阶段之前)增加 “金额”,包括所有额外货币。
+8+8ReserveInvertSign在执行保留之前否定 amount 值。
+16+16ReserveBounceIfActionFail如果预订失败,则退回交易。

使用标志组合模式

要为 mode 参数创建 Int值,只需通过 bitwise OR操作将基本模式与可选标志结合起来:

nativeReserve(ton("0.1"), ReserveExact | ReserveBounceIfActionFail);
// ---------- ----------------------------------------
// ↑ ↑
// | 模式,如果精确预订失败,将反弹交易
// 要预订的纳吨币数量