Skip to content

高级功能

import { Callout } from 'nextra/components'

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

Context.readForwardFee

solidity
extends fun readForwardFee(self: Context): Int

扩展函数用于Context

读取转发费用并以nanoToncoinsInt数量返回。

使用示例:

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

getConfigParam

solidity
fun getConfigParam(id: Int): Cell?;

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

使用示例:

solidity
// 参数0,存储区块链配置的特殊智能合约的地址
let configAddrAsCell: Cell = getConfigParam(0)!!;

// 参数18,用于确定数据存储价格的配置
let dataStorageFeeConfig: Cell = getConfigParam(18)!!;

acceptMessage

solidity
fun acceptMessage();

同意购买一些gas以完成当前交易。此操作是处理不带价值(因此不带gas)的外部消息所必需的。

使用示例:

solidity
contract Timeout {
    timeout: Int;

    init() {
        self.timeout = now() + 5 * 60; // 从现在起5分钟
    }

    external("timeout") {
        if (now() > self.timeout) {
            acceptMessage(); // 一旦超时,开始接受外部消息
        }
    }
}

commit

solidity
fun commit();

提交当前c4("持久数据")和c5("操作")寄存器的状态,使得即使在计算阶段稍后抛出异常,当前执行也被认为是“成功”的并保存了值。

使用示例:

solidity
commit();  // 现在,交易被认为是“成功”的
throw(42); // 这不会使其失败

nativePrepareRandom

solidity
fun nativePrepareRandom();

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

使用示例:

solidity
nativePrepareRandom(); // 准备随机数生成器
// ... 执行你的随机操作 ...

nativeRandomize

solidity
fun nativeRandomize(x: Int);

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

使用示例:

solidity
nativeRandomize();          // 现在,随机数更难预测
let idk: Int = randomInt(); // ???, 随机的!

nativeRandomizeLt

solidity
fun nativeRandomizeLt();

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

使用示例:

solidity
nativeRandomizeLt();        // 现在,随机数对于用户来说是不可预测的,
                            // 但仍可能受到验证者或收集者的影响
                            // 因为他们决定当前区块的种子。
let idk: Int = randomInt(); // ???, 随机的!

nativeRandom

solidity
fun nativeRandom(): Int;

生成并返回一个256位的随机数,就像randomInt()一样,但不会事先用nativePrepareRandom()初始化随机生成器。

nativeRandomInterval

solidity
fun nativeRandomInterval(max: Int): Int;

生成并返回一个从0到max范围内的256位随机数,类似于random(),但不会事先用nativePrepareRandom()初始化随机生成器。

nativeSendMessage

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

通过指定完整的cell消息mode发送消息。

nativeReserve

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

使用指定的金额和模式调用本机raw_reserve函数。raw_reserve是一个函数,它创建一个输出操作,从账户的剩余余额中保留特定数量的nanoToncoins

在FunC中的签名如下:

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

该函数接受两个参数:

  • amount:要保留的nanoToncoins数量。
  • mode:确定保留行为。

函数raw_reserve大致相当于创建一个携带指定数量nanoToncoins(或b $-$ amount nanoToncoins,其中b是剩余余额)的外发消息给自己。这确保了后续的输出操作不能花费超过余额的金额。

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

基本模式 [#nativereserve-base-modes]

生成的mode值可以具有以下基本模式:

模式值常量名称描述
$0$ReserveExact精确保留指定数量的nanoToncoins
$1$ReserveAllExcept保留所有,但指定数量的nanoToncoins
$2$ReserveAtMost最多保留指定数量的nanoToncoins

可选标志 [#nativereserve-optional-flags]

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

标志值常量名称描述
$+4$ReserveAddOriginalBalanceamount增加当前账户的原始余额(计算阶段之前),包括所有额外货币。
$+8$ReserveInvertSign在执行保留之前否定amount值。
$+16$ReserveBounceIfActionFail如果保留失败,则反弹交易。

结合模式和标志 [#nativereserve-combining-modes-with-flags]

要为mode参数生成Int值,只需通过应用按位或操作将基本模式与可选标志结合起来:

solidity
nativeReserve(ton("0.1"), ReserveExact | ReserveBounceIfActionFail);
//            ----------  ----------------------------------------
//            ↑           ↑
//            |           mode,如果精确保留失败将反弹交易
//            要保留的nanoToncoins数量