有三个主要费用 network、computing、action。network 包含消息发送的费用,一般由 sender 付,钱包里一般消息的 value 和 network fee 是分别支付的,而合约中默认是从消息的 value 中支付的。computing 是执行合约的费用,action 是合约发送 external message 的费用,主要就是 emit。(此外还有 storage fee 先不管了)
ctx.value
代表的是 inflow msg 携带的 value,sender 已经付过了 network fee,还没支付 computing 和 action。合约执行后会扣除 computing,执行完成后如果有需要发送的 outflow 消息,那么再扣除 action fee。可以把
ctx.value
理解为税前收入,而且你无法知道会收多少税(computing & action fees)。补充:FunC 里是可以精确计算 fwd_fee 的,但是感觉 tact 不太行,可参考:
* https://docs.ton.org/develop/smart-contracts/fee-calculation
* https://github.com/ton-blockchain/stablecoin-contract/blob/main/contracts/gas.fc
* https://tonviewer.com/config#24
myBalance() - ctx.value
代表合约执行前的余额。可以用 nativeReserve(myBalance() - ctx.value, ReserveExact);
来保护合约余额不被用户消息所消耗。但是你在合约代码中极难通过控制
ctx.value
来计算你能操作的 inflow 余额,因为 computing 和 action 的开销是很难计算的。比如如果你想要把剩余的 inflow value 全部转走,可行的办法是用 nativeReserve
锁定不想转走的余额,然后再用 SendRemainingBalance
mode 发送一条 value 为 0 的消息。SendRemainingBalance
会转走未被 nativeReserve
锁定的全部金额,按照上文描述,也就是所有剩余的 ctx.value
。但是 emit 具体花多少钱?我还不知道怎么算,目前是估计一个经验值,测试网是
0.007
,你可以多锁定 0.01
给 emit。 #blockchainprev: https://t.me/laiskynotes/318
next: https://t.me/laiskynotes/324