跳转到内容

消息生命周期

合约对消息的处理有几个阶段,其中还有更多的阶段,但我们将集中讨论最重要的几个阶段:

接收阶段

该阶段结合了多个低级阶段。

它首先会在合约余额中添加一个消息值。 输入消息的价值是合约为处理此消息所能支付的gas的最高价格。 合约可以覆盖此限制,但不建议这样做,只有高级开发人员才适合这样做,因为这可能导致合约被耗尽。 100万个gas是一个合约中合约可以花费的最大金额,目前相当于Basechain的0.4 TON。 如果消息值为零,则执行中止。

然后,一些(通常是少量的)nanotons从合约余额中扣除用于存储。 这意味着您无法完美预测平衡的变化,必须根据这种不稳定性调整代码。

然后,如果合约尚未部署,且消息中包含初始包(init package),则会部署合约。 如果初始化包不存在,它将被忽略。

计算阶段

该阶段执行智能合约的代码,并产生一系列操作或异常。 目前,仅支持两种类型的动作:发送消息(send message)和 保留(reserve)。

发送消息可以使用固定值或动态值,例如消息的剩余值 - 传入消息的剩余值。 发送消息时可以使用 SendIgnoreErrors 标记,这样就可以忽略消息发送过程中出现的错误,并继续下一步操作。 如果您有多个操作,该标记非常有用。 在发送带有某个值的消息时,它首先从接收值中减去该值,然后才从合约余额中减去该值(在处理之前)。

行动阶段

动作按顺序执行,但请注意:
处理动作时发生异常不会回滚交易

例如,如果从客户的余额中扣除 1 Ton,然后发送一条无效消息,这可能会导致客户的余额被扣减,但客户却无法收到相应的金额。