Skip to content

基础特性

每个 合约特性 在 Tact 中都隐式地继承了 Base 特性,该特性包含了许多对任何类型的合约都非常有用的 内部函数,以及一个常量 self.storageReserve,这是为 Tact 的高级用户设计的。

常量

self.storageReserve [#self-storagereserve]

solidity
virtual const storageReserve: Int = 0;

使用示例:

solidity
contract AllYourStorageBelongsToUs {
    // 这将改变 self.forward() 函数的行为,
    // 使其在使用 SendRemainingBalance 模式转发消息之前
    // 尝试保留此数量的 nanoToncoins
    override const storageReserve: Int = ton("0.1");
}

函数

self.reply [#self-reply]

solidity
virtual fun reply(body: Cell?);

这是调用 self.forward() 函数的别名,使用以下参数:

solidity
self.forward(sender(), body, true, null);
//           ↑         ↑     ↑     ↑
//           |         |     |     init: StateInit?
//           |         |     bounce: Bool
//           |         body: Cell?
//           to: Address

使用示例:

solidity
// 这条消息可能会弹回给我们!
self.reply("Beware, this is my reply to you!".asComment());

self.notify [#self-notify]

solidity
virtual fun notify(body: Cell?);

这是调用 self.forward() 函数的别名,使用以下参数:

solidity
self.forward(sender(), body, false, null);
//           ↑         ↑     ↑      ↑
//           |         |     |      init: StateInit?
//           |         |     bounce: Bool
//           |         body: Cell?
//           to: Address

使用示例:

solidity
// 这条消息不会弹回!
self.notify("Beware, this is my reply to you!".asComment());

self.forward [#self-forward]

solidity
virtual fun forward(to: Address, body: Cell?, bounce: Bool, init: StateInit?);

发送一条可弹回或不可弹回的消息到指定地址 to。你可以选择性地提供消息的 bodyinit

self.storageReserve 常量被重写为大于 0 时,在发送消息之前,它还会尝试从剩余余额中保留 self.storageReserve 数量的 nanoToncoins,然后使用 SendRemainingBalance ($128$) 模式发送消息。

如果保留尝试失败,并且在默认情况下没有尝试,消息将以 SendRemainingValue ($64$) 模式发送。

使用示例:

solidity
import "@stdlib/ownable";

message PayoutOk {
    address: Address;
    value: Int as coins;
}

contract Payout with Ownable {
    completed: Bool;
    owner: Address;

    init(owner: Address) {
        self.owner = owner;
        self.completed = false;
    }

    // ... 这里有一些操作 ...

    // 弹回接收函数,当指定的外发消息弹回时调用
    bounced(msg: bounced<PayoutOk>) {
        // 如果我们的消息弹回,重置 completed 标志
        self.completed = false;

        // 使用剩余资金发送通知,表示支付失败
        self.forward(self.owner, "Payout failed".asComment(), false, null);
    }
}