Appearance
基础特性
每个 合约 和 特性 在 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
。你可以选择性地提供消息的 body
和 init
包。
当 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);
}
}