Appearance
高级功能
import { Callout } from 'nextra/components'
一些小众、危险或不稳定的功能,可能会产生意想不到的结果,仅供有经验的用户使用。
Context.readForwardFee
solidity
extends fun readForwardFee(self: Context): Int
扩展函数用于Context
。
读取转发费用并以nanoToncoins的Int
数量返回。
使用示例:
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$ | ReserveAddOriginalBalance | 将amount 增加当前账户的原始余额(计算阶段之前),包括所有额外货币。 |
$+8$ | ReserveInvertSign | 在执行保留之前否定amount 值。 |
$+16$ | ReserveBounceIfActionFail | 如果保留失败,则反弹交易。 |
结合模式和标志 [#nativereserve-combining-modes-with-flags]
要为mode
参数生成Int
值,只需通过应用按位或操作将基本模式与可选标志结合起来:
solidity
nativeReserve(ton("0.1"), ReserveExact | ReserveBounceIfActionFail);
// ---------- ----------------------------------------
// ↑ ↑
// | mode,如果精确保留失败将反弹交易
// 要保留的nanoToncoins数量